Rev 717 | Rev 727 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 717 | Rev 718 | ||
---|---|---|---|
Line 69... | Line 69... | ||
69 | void kinit(void *arg) |
69 | void kinit(void *arg) |
70 | { |
70 | { |
71 | thread_t *t; |
71 | thread_t *t; |
72 | as_t *as; |
72 | as_t *as; |
73 | as_area_t *a; |
73 | as_area_t *a; |
74 | __address frame; |
74 | index_t frame, frames; |
75 | index_t pfn[1]; |
75 | index_t pfn; |
76 | task_t *u; |
76 | task_t *u; |
77 | 77 | ||
78 | interrupts_disable(); |
78 | interrupts_disable(); |
79 | 79 | ||
80 | #ifdef CONFIG_SMP |
80 | #ifdef CONFIG_SMP |
Line 131... | Line 131... | ||
131 | /* |
131 | /* |
132 | * Create kernel console. |
132 | * Create kernel console. |
133 | */ |
133 | */ |
134 | if ((t = thread_create(kconsole, "kconsole", TASK, 0))) |
134 | if ((t = thread_create(kconsole, "kconsole", TASK, 0))) |
135 | thread_ready(t); |
135 | thread_ready(t); |
- | 136 | else |
|
136 | else panic("thread_create/kconsole\n"); |
137 | panic("thread_create/kconsole\n"); |
137 | 138 | ||
138 | interrupts_enable(); |
139 | interrupts_enable(); |
139 | 140 | ||
140 | if (config.init_size > 0) { |
141 | if (config.init_size > 0) { |
141 | /* |
142 | /* |
142 | * Create the first user task. |
143 | * Create the first user task. |
143 | */ |
144 | */ |
- | 145 | ||
- | 146 | if (KA2PA(config.init_addr) % FRAME_SIZE) |
|
- | 147 | panic("config.init_addr is not frame aligned"); |
|
- | 148 | ||
144 | as = as_create(NULL); |
149 | as = as_create(NULL); |
145 | if (!as) |
150 | if (!as) |
146 | panic("as_create\n"); |
151 | panic("as_create\n"); |
147 | u = task_create(as); |
152 | u = task_create(as); |
148 | if (!u) |
153 | if (!u) |
Line 151... | Line 156... | ||
151 | if (!t) |
156 | if (!t) |
152 | panic("thread_create\n"); |
157 | panic("thread_create\n"); |
153 | 158 | ||
154 | /* |
159 | /* |
155 | * Create the text as_area and copy the userspace code there. |
160 | * Create the text as_area and copy the userspace code there. |
156 | */ |
161 | */ |
- | 162 | ||
- | 163 | frame = KA2PA(config.init_addr) / FRAME_SIZE; |
|
- | 164 | frames = config.init_size / FRAME_SIZE; |
|
- | 165 | if (config.init_size % FRAME_SIZE > 0) |
|
- | 166 | frames++; |
|
- | 167 | ||
157 | a = as_area_create(as, AS_AREA_TEXT, 1, UTEXT_ADDRESS); |
168 | a = as_area_create(as, AS_AREA_TEXT, frames, UTEXT_ADDRESS); |
158 | if (!a) |
169 | if (!a) |
159 | panic("as_area_create: text\n"); |
170 | panic("as_area_create: text\n"); |
160 | 171 | ||
161 | // FIXME: Better way to initialize static code/data |
- | |
162 | frame = frame_alloc(0, ONE_FRAME, NULL); |
- | |
163 | memcpy((void *) PA2KA(frame), (void *) config.init_addr, config.init_size < PAGE_SIZE ? config.init_size : PAGE_SIZE); |
- | |
164 | - | ||
165 | pfn[0] = frame / FRAME_SIZE; |
172 | for (pfn = 0; pfn < frames; pfn++) |
166 | as_area_load_mapping(a, pfn); |
173 | as_area_set_mapping(a, pfn, frame + pfn); |
167 | 174 | ||
168 | /* |
175 | /* |
169 | * Create the data as_area. |
176 | * Create the data as_area. |
170 | */ |
177 | */ |
171 | a = as_area_create(as, AS_AREA_STACK, 1, USTACK_ADDRESS); |
178 | a = as_area_create(as, AS_AREA_STACK, 1, USTACK_ADDRESS); |