Rev 703 | Rev 718 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 703 | Rev 717 | ||
|---|---|---|---|
| Line 67... | Line 67... | ||
| 67 | * @param arg Not used. |
67 | * @param arg Not used. |
| 68 | */ |
68 | */ |
| 69 | void kinit(void *arg) |
69 | void kinit(void *arg) |
| 70 | { |
70 | { |
| 71 | thread_t *t; |
71 | thread_t *t; |
| 72 | #ifdef CONFIG_USERSPACE |
- | |
| 73 | as_t *as; |
72 | as_t *as; |
| 74 | as_area_t *a; |
73 | as_area_t *a; |
| 75 | __address frame; |
74 | __address frame; |
| 76 | index_t pfn[1]; |
75 | index_t pfn[1]; |
| 77 | task_t *u; |
76 | task_t *u; |
| 78 | #endif |
- | |
| 79 | 77 | ||
| 80 | interrupts_disable(); |
78 | interrupts_disable(); |
| 81 | 79 | ||
| 82 | #ifdef CONFIG_SMP |
80 | #ifdef CONFIG_SMP |
| 83 | if (config.cpu_count > 1) { |
81 | if (config.cpu_count > 1) { |
| Line 137... | Line 135... | ||
| 137 | thread_ready(t); |
135 | thread_ready(t); |
| 138 | else panic("thread_create/kconsole\n"); |
136 | else panic("thread_create/kconsole\n"); |
| 139 | 137 | ||
| 140 | interrupts_enable(); |
138 | interrupts_enable(); |
| 141 | 139 | ||
| 142 | #ifdef CONFIG_USERSPACE |
140 | if (config.init_size > 0) { |
| 143 | /* |
141 | /* |
| 144 | * Create the first user task. |
142 | * Create the first user task. |
| 145 | */ |
143 | */ |
| 146 | as = as_create(NULL); |
144 | as = as_create(NULL); |
| 147 | if (!as) |
145 | if (!as) |
| 148 | panic("as_create\n"); |
146 | panic("as_create\n"); |
| 149 | u = task_create(as); |
147 | u = task_create(as); |
| 150 | if (!u) |
148 | if (!u) |
| 151 | panic("task_create\n"); |
149 | panic("task_create\n"); |
| 152 | t = thread_create(uinit, NULL, u, THREAD_USER_STACK); |
150 | t = thread_create(uinit, NULL, u, THREAD_USER_STACK); |
| 153 | if (!t) |
151 | if (!t) |
| 154 | panic("thread_create\n"); |
152 | panic("thread_create\n"); |
| 155 | 153 | ||
| 156 | /* |
154 | /* |
| 157 | * Create the text as_area and copy the userspace code there. |
155 | * Create the text as_area and copy the userspace code there. |
| 158 | */ |
156 | */ |
| 159 | a = as_area_create(as, AS_AREA_TEXT, 1, UTEXT_ADDRESS); |
157 | a = as_area_create(as, AS_AREA_TEXT, 1, UTEXT_ADDRESS); |
| 160 | if (!a) |
158 | if (!a) |
| 161 | panic("as_area_create: text\n"); |
159 | panic("as_area_create: text\n"); |
| 162 | 160 | ||
| - | 161 | // FIXME: Better way to initialize static code/data |
|
| 163 | frame = frame_alloc(0, ONE_FRAME, NULL); |
162 | frame = frame_alloc(0, ONE_FRAME, NULL); |
| 164 | - | ||
| 165 | if (config.init_size > 0) |
- | |
| 166 | memcpy((void *) PA2KA(frame), (void *) config.init_addr, config.init_size < PAGE_SIZE ? config.init_size : PAGE_SIZE); |
163 | memcpy((void *) PA2KA(frame), (void *) config.init_addr, config.init_size < PAGE_SIZE ? config.init_size : PAGE_SIZE); |
| 167 | else |
164 | |
| 168 | memcpy((void *) PA2KA(frame), (void *) utext, utext_size < PAGE_SIZE ? utext_size : PAGE_SIZE); |
165 | pfn[0] = frame / FRAME_SIZE; |
| - | 166 | as_area_load_mapping(a, pfn); |
|
| 169 | 167 | ||
| 170 | pfn[0] = frame / FRAME_SIZE; |
- | |
| 171 | as_area_load_mapping(a, pfn); |
- | |
| 172 | - | ||
| 173 | /* |
168 | /* |
| 174 | * Create the data as_area. |
169 | * Create the data as_area. |
| 175 | */ |
170 | */ |
| 176 | a = as_area_create(as, AS_AREA_STACK, 1, USTACK_ADDRESS); |
171 | a = as_area_create(as, AS_AREA_STACK, 1, USTACK_ADDRESS); |
| 177 | if (!a) |
172 | if (!a) |
| 178 | panic("as_area_create: stack\n"); |
173 | panic("as_area_create: stack\n"); |
| 179 | 174 | ||
| 180 | thread_ready(t); |
175 | thread_ready(t); |
| 181 | #endif /* CONFIG_USERSPACE */ |
- | |
| - | 176 | } |
|
| 182 | 177 | ||
| 183 | #ifdef CONFIG_TEST |
178 | #ifdef CONFIG_TEST |
| 184 | test(); |
179 | test(); |
| 185 | #endif /* CONFIG_TEST */ |
180 | #endif /* CONFIG_TEST */ |
| 186 | 181 | ||