Rev 2125 | Rev 2133 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2125 | Rev 2126 | ||
---|---|---|---|
Line 85... | Line 85... | ||
85 | /** |
85 | /** |
86 | * Each architecture decides what functions will be used to carry out |
86 | * Each architecture decides what functions will be used to carry out |
87 | * address space operations such as creating or locking page tables. |
87 | * address space operations such as creating or locking page tables. |
88 | */ |
88 | */ |
89 | as_operations_t *as_operations = NULL; |
89 | as_operations_t *as_operations = NULL; |
90 | #endif |
- | |
91 | 90 | ||
92 | /** |
91 | /** |
93 | * Slab for as_t objects. |
92 | * Slab for as_t objects. |
94 | */ |
93 | */ |
95 | static slab_cache_t *as_slab; |
94 | static slab_cache_t *as_slab; |
- | 95 | #endif |
|
96 | 96 | ||
97 | /** |
97 | /** |
98 | * This lock protects inactive_as_with_asid_head list. It must be acquired |
98 | * This lock protects inactive_as_with_asid_head list. It must be acquired |
99 | * before as_t mutex. |
99 | * before as_t mutex. |
100 | */ |
100 | */ |
Line 113... | Line 113... | ||
113 | static as_area_t *find_area_and_lock(as_t *as, uintptr_t va); |
113 | static as_area_t *find_area_and_lock(as_t *as, uintptr_t va); |
114 | static bool check_area_conflicts(as_t *as, uintptr_t va, size_t size, |
114 | static bool check_area_conflicts(as_t *as, uintptr_t va, size_t size, |
115 | as_area_t *avoid_area); |
115 | as_area_t *avoid_area); |
116 | static void sh_info_remove_reference(share_info_t *sh_info); |
116 | static void sh_info_remove_reference(share_info_t *sh_info); |
117 | 117 | ||
- | 118 | #ifndef __OBJC__ |
|
118 | static int as_constructor(void *obj, int flags) |
119 | static int as_constructor(void *obj, int flags) |
119 | { |
120 | { |
120 | as_t *as = (as_t *) obj; |
121 | as_t *as = (as_t *) obj; |
121 | int rc; |
122 | int rc; |
122 | 123 | ||
Line 132... | Line 133... | ||
132 | { |
133 | { |
133 | as_t *as = (as_t *) obj; |
134 | as_t *as = (as_t *) obj; |
134 | 135 | ||
135 | return as_destructor_arch(as); |
136 | return as_destructor_arch(as); |
136 | } |
137 | } |
- | 138 | #endif |
|
137 | 139 | ||
138 | /** Initialize address space subsystem. */ |
140 | /** Initialize address space subsystem. */ |
139 | void as_init(void) |
141 | void as_init(void) |
140 | { |
142 | { |
141 | as_arch_init(); |
143 | as_arch_init(); |
142 | 144 | ||
- | 145 | #ifndef __OBJC__ |
|
143 | as_slab = slab_cache_create("as_slab", sizeof(as_t), 0, |
146 | as_slab = slab_cache_create("as_slab", sizeof(as_t), 0, |
144 | as_constructor, as_destructor, SLAB_CACHE_MAGDEFERRED); |
147 | as_constructor, as_destructor, SLAB_CACHE_MAGDEFERRED); |
- | 148 | #endif |
|
145 | 149 | ||
146 | AS_KERNEL = as_create(FLAG_AS_KERNEL); |
150 | AS_KERNEL = as_create(FLAG_AS_KERNEL); |
147 | if (!AS_KERNEL) |
151 | if (!AS_KERNEL) |
148 | panic("can't create kernel address space\n"); |
152 | panic("can't create kernel address space\n"); |
149 | 153 | ||
Line 155... | Line 159... | ||
155 | */ |
159 | */ |
156 | as_t *as_create(int flags) |
160 | as_t *as_create(int flags) |
157 | { |
161 | { |
158 | as_t *as; |
162 | as_t *as; |
159 | 163 | ||
- | 164 | #ifdef __OBJC__ |
|
- | 165 | as = [as_t new]; |
|
- | 166 | link_initialize(&as->inactive_as_with_asid_link); |
|
- | 167 | mutex_initialize(&as->lock); |
|
- | 168 | (void) as_constructor_arch(as, flags); |
|
- | 169 | #else |
|
160 | as = (as_t *) slab_alloc(as_slab, 0); |
170 | as = (as_t *) slab_alloc(as_slab, 0); |
- | 171 | #endif |
|
161 | (void) as_create_arch(as, 0); |
172 | (void) as_create_arch(as, 0); |
162 | 173 | ||
163 | btree_create(&as->as_area_btree); |
174 | btree_create(&as->as_area_btree); |
164 | 175 | ||
165 | if (flags & FLAG_AS_KERNEL) |
176 | if (flags & FLAG_AS_KERNEL) |
Line 226... | Line 237... | ||
226 | #else |
237 | #else |
227 | page_table_destroy(NULL); |
238 | page_table_destroy(NULL); |
228 | #endif |
239 | #endif |
229 | 240 | ||
230 | interrupts_restore(ipl); |
241 | interrupts_restore(ipl); |
231 | 242 | ||
- | 243 | #ifdef __OBJC__ |
|
- | 244 | [as free]; |
|
- | 245 | #else |
|
232 | slab_free(as_slab, as); |
246 | slab_free(as_slab, as); |
- | 247 | #endif |
|
233 | } |
248 | } |
234 | 249 | ||
235 | /** Create address space area of common attributes. |
250 | /** Create address space area of common attributes. |
236 | * |
251 | * |
237 | * The created address space area is added to the target address space. |
252 | * The created address space area is added to the target address space. |