Rev 1889 | Rev 1891 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1889 | Rev 1890 | ||
---|---|---|---|
Line 82... | Line 82... | ||
82 | * Each architecture decides what functions will be used to carry out |
82 | * Each architecture decides what functions will be used to carry out |
83 | * address space operations such as creating or locking page tables. |
83 | * address space operations such as creating or locking page tables. |
84 | */ |
84 | */ |
85 | as_operations_t *as_operations = NULL; |
85 | as_operations_t *as_operations = NULL; |
86 | 86 | ||
- | 87 | /** |
|
- | 88 | * Slab for as_t objects. |
|
- | 89 | */ |
|
- | 90 | static slab_cache_t *as_slab; |
|
- | 91 | ||
87 | /** This lock protects inactive_as_with_asid_head list. It must be acquired before as_t mutex. */ |
92 | /** This lock protects inactive_as_with_asid_head list. It must be acquired before as_t mutex. */ |
88 | SPINLOCK_INITIALIZE(inactive_as_with_asid_lock); |
93 | SPINLOCK_INITIALIZE(inactive_as_with_asid_lock); |
89 | 94 | ||
90 | /** |
95 | /** |
91 | * This list contains address spaces that are not active on any |
96 | * This list contains address spaces that are not active on any |
Line 103... | Line 108... | ||
103 | 108 | ||
104 | /** Initialize address space subsystem. */ |
109 | /** Initialize address space subsystem. */ |
105 | void as_init(void) |
110 | void as_init(void) |
106 | { |
111 | { |
107 | as_arch_init(); |
112 | as_arch_init(); |
- | 113 | ||
- | 114 | as_slab = slab_cache_create("as_slab", sizeof(as_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED); |
|
- | 115 | ||
108 | AS_KERNEL = as_create(FLAG_AS_KERNEL); |
116 | AS_KERNEL = as_create(FLAG_AS_KERNEL); |
109 | if (!AS_KERNEL) |
117 | if (!AS_KERNEL) |
110 | panic("can't create kernel address space\n"); |
118 | panic("can't create kernel address space\n"); |
111 | 119 | ||
112 | } |
120 | } |
Line 117... | Line 125... | ||
117 | */ |
125 | */ |
118 | as_t *as_create(int flags) |
126 | as_t *as_create(int flags) |
119 | { |
127 | { |
120 | as_t *as; |
128 | as_t *as; |
121 | 129 | ||
122 | as = (as_t *) malloc(sizeof(as_t), 0); |
130 | as = (as_t *) slab_alloc(as_slab, 0); |
123 | link_initialize(&as->inactive_as_with_asid_link); |
131 | link_initialize(&as->inactive_as_with_asid_link); |
124 | mutex_initialize(&as->lock); |
132 | mutex_initialize(&as->lock); |
125 | btree_create(&as->as_area_btree); |
133 | btree_create(&as->as_area_btree); |
126 | 134 | ||
127 | if (flags & FLAG_AS_KERNEL) |
135 | if (flags & FLAG_AS_KERNEL) |
Line 180... | Line 188... | ||
180 | btree_destroy(&as->as_area_btree); |
188 | btree_destroy(&as->as_area_btree); |
181 | page_table_destroy(as->page_table); |
189 | page_table_destroy(as->page_table); |
182 | 190 | ||
183 | interrupts_restore(ipl); |
191 | interrupts_restore(ipl); |
184 | 192 | ||
185 | free(as); |
193 | slab_free(as_slab, as); |
186 | } |
194 | } |
187 | 195 | ||
188 | /** Create address space area of common attributes. |
196 | /** Create address space area of common attributes. |
189 | * |
197 | * |
190 | * The created address space area is added to the target address space. |
198 | * The created address space area is added to the target address space. |
Line 796... | Line 804... | ||
796 | */ |
804 | */ |
797 | ASSERT(old->asid != ASID_INVALID); |
805 | ASSERT(old->asid != ASID_INVALID); |
798 | list_append(&old->inactive_as_with_asid_link, &inactive_as_with_asid_head); |
806 | list_append(&old->inactive_as_with_asid_link, &inactive_as_with_asid_head); |
799 | } |
807 | } |
800 | mutex_unlock(&old->lock); |
808 | mutex_unlock(&old->lock); |
- | 809 | ||
- | 810 | /* |
|
- | 811 | * Perform architecture-specific tasks when the address space |
|
- | 812 | * is being removed from the CPU. |
|
- | 813 | */ |
|
- | 814 | as_deinstall_arch(old); |
|
801 | } |
815 | } |
802 | 816 | ||
803 | /* |
817 | /* |
804 | * Second, prepare the new address space. |
818 | * Second, prepare the new address space. |
805 | */ |
819 | */ |