Subversion Repositories HelenOS-historic

Rev

Rev 718 | Rev 754 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 718 Rev 727
Line 46... Line 46...
46
 
46
 
47
#define UTEXT_ADDRESS   UTEXT_ADDRESS_ARCH
47
#define UTEXT_ADDRESS   UTEXT_ADDRESS_ARCH
48
#define USTACK_ADDRESS  USTACK_ADDRESS_ARCH
48
#define USTACK_ADDRESS  USTACK_ADDRESS_ARCH
49
#define UDATA_ADDRESS   UDATA_ADDRESS_ARCH
49
#define UDATA_ADDRESS   UDATA_ADDRESS_ARCH
50
 
50
 
-
 
51
#define AS_KERNEL   (1<<0)      /**< Kernel address space. */
-
 
52
 
51
enum as_area_type {
53
enum as_area_type {
52
    AS_AREA_TEXT = 1, AS_AREA_DATA, AS_AREA_STACK
54
    AS_AREA_TEXT = 1, AS_AREA_DATA, AS_AREA_STACK
53
};
55
};
54
 
56
 
55
/** Address space area structure.
57
/** Address space area structure.
Line 59... Line 61...
59
 */
61
 */
60
struct as_area {
62
struct as_area {
61
    SPINLOCK_DECLARE(lock);
63
    SPINLOCK_DECLARE(lock);
62
    link_t link;
64
    link_t link;
63
    as_area_type_t type;
65
    as_area_type_t type;
64
    size_t size;        /**< Size of this area. */
66
    size_t size;        /**< Size of this area in multiples of PAGE_SIZE. */
65
    __address base;     /**< Base address of this area. */
67
    __address base;     /**< Base address of this area. */
66
    index_t *mapping;   /**< Map of physical frame numbers mapped to virtual page numbers in this area. */
68
    index_t *mapping;   /**< Map of physical frame numbers mapped to virtual page numbers in this area. */
67
};
69
};
68
 
70
 
69
/** Address space structure.
71
/** Address space structure.
Line 72... Line 74...
72
 * pages for one or more tasks. Ranges of kernel memory pages are not
74
 * pages for one or more tasks. Ranges of kernel memory pages are not
73
 * supposed to figure in the list as they are shared by all tasks and
75
 * supposed to figure in the list as they are shared by all tasks and
74
 * set up during system initialization.
76
 * set up during system initialization.
75
 */
77
 */
76
struct as {
78
struct as {
-
 
79
    /** Protected by asidlock. Must be acquired before as-> lock. */
-
 
80
    link_t as_with_asid_link;
-
 
81
 
77
    SPINLOCK_DECLARE(lock);
82
    SPINLOCK_DECLARE(lock);
78
    link_t as_area_head;
83
    link_t as_area_head;
79
    pte_t *ptl0;
84
    pte_t *ptl0;
80
    asid_t asid;            /**< Address space identifier. */
85
    asid_t asid;            /**< Address space identifier. */
81
};
86
};
82
 
87
 
83
extern as_t * as_create(pte_t *ptl0);
88
extern as_t * as_create(pte_t *ptl0, int flags);
84
extern as_area_t *as_area_create(as_t *as, as_area_type_t type, size_t size, __address base);
89
extern as_area_t *as_area_create(as_t *as, as_area_type_t type, size_t size, __address base);
85
extern void as_area_set_mapping(as_area_t *a, index_t vpn, index_t pfn);
90
extern void as_area_set_mapping(as_area_t *a, index_t vpn, index_t pfn);
86
extern int as_page_fault(__address page);
91
extern int as_page_fault(__address page);
87
extern void as_install(as_t *m);
92
extern void as_install(as_t *m);
88
 
93
 
89
/*
-
 
90
 * Each architecture should implement this function.
94
/* Interface to be implemented by architectures. */
91
 * Its main purpose is to do TLB purges according
-
 
92
 * to architecture's requirements. Note that
-
 
93
 * some architectures invalidate their TLB automatically
-
 
94
 * on hardware address space switch (e.g. ia32 and
-
 
95
 * amd64).
-
 
96
 */
-
 
97
#ifndef as_install_arch
95
#ifndef as_install_arch
98
extern void as_install_arch(as_t *as);
96
extern void as_install_arch(as_t *as);
99
#endif /* !def as_install_arch */
97
#endif /* !def as_install_arch */
100
 
98
 
101
#endif
99
#endif