Diff markup
001 001
>> 002
002 003
003 004
004 005
005 006
006 007
007 008
008 009
009 010
010 011
011 012
012 013
013 014
014 015
015 016
016 017
017 018
018 019
019 020
020 #include <bootstrap/multiboot.h> 021 #include <bootstrap/multiboot.h>
021 #include <hwcore/idt.h> 022 #include <hwcore/idt.h>
022 #include <hwcore/gdt.h> 023 #include <hwcore/gdt.h>
023 #include <hwcore/irq.h> 024 #include <hwcore/irq.h>
024 #include <hwcore/exception.h> 025 #include <hwcore/exception.h>
025 #include <hwcore/i8254.h> 026 #include <hwcore/i8254.h>
026 #include <sos/list.h> 027 #include <sos/list.h>
027 #include <sos/physmem.h> 028 #include <sos/physmem.h>
028 #include <hwcore/paging.h> 029 #include <hwcore/paging.h>
029 #include <hwcore/mm_context.h> <<
030 #include <hwcore/swintr.h> <<
031 #include <sos/kmem_vmm.h> 030 #include <sos/kmem_vmm.h>
032 #include <sos/kmalloc.h> 031 #include <sos/kmalloc.h>
033 #include <sos/time.h> <<
034 #include <sos/thread.h> <<
035 #include <sos/process.h> <<
036 #include <sos/umem_vmm.h> <<
037 #include <sos/klibc.h> 032 #include <sos/klibc.h>
038 #include <sos/assert.h> 033 #include <sos/assert.h>
039 #include <drivers/x86_videomem.h> 034 #include <drivers/x86_videomem.h>
040 #include <drivers/bochs.h> 035 #include <drivers/bochs.h>
041 #include <sos/calcload.h> <<
042 #include <sos/umem_vmm.h> <<
043 #include <sos/binfmt_elf32.h> <<
044 #include <drivers/zero.h> <<
045 036
046 037
047 038
048 039
049 void display_bits(unsigned char row, unsigned !! 040 static void display_bits(unsigned char row, unsigned char col,
050 unsigned char attribute, !! 041 unsigned char attribute,
051 sos_ui32_t integer) !! 042 sos_ui32_t integer)
052 { 043 {
053 int i; 044 int i;
054 045
055 for (i = 31 ; i >= 0 ; i--) 046 for (i = 31 ; i >= 0 ; i--)
056 { 047 {
057 048
058 int bit_i = (integer & (1 << i)); 049 int bit_i = (integer & (1 << i));
059 050
060 unsigned char ascii_code = bit_i?219:177 051 unsigned char ascii_code = bit_i?219:177;
061 sos_x86_videomem_putchar(row, col++, 052 sos_x86_videomem_putchar(row, col++,
062 attribute, 053 attribute,
063 ascii_code); 054 ascii_code);
064 } 055 }
065 } 056 }
066 057
067 058
068 059
069 static void clk_it(int intid) 060 static void clk_it(int intid)
070 { 061 {
071 static sos_ui32_t clock_count = 0; 062 static sos_ui32_t clock_count = 0;
072 063
073 display_bits(0, 48, 064 display_bits(0, 48,
074 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 065 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
075 clock_count); 066 clock_count);
076 clock_count++; 067 clock_count++;
077 068
078 !! 069 }
079 sos_time_do_tick(); !! 070 struct digit
>> 071 {
>> 072 struct digit *prev, *next;
>> 073 char value;
>> 074 };
>> 075
>> 076
>> 077
>> 078
>> 079 typedef struct digit * big_number_t;
>> 080
>> 081
>> 082
>> 083 void bn_push_lsd(big_number_t * bn, char value)
>> 084 {
>> 085 struct digit *d;
>> 086 d = (struct digit*) sos_kmalloc(sizeof(struct digit), 0);
>> 087 SOS_ASSERT_FATAL(d != NULL);
>> 088 d->value = value;
>> 089 list_add_tail(*bn, d);
>> 090 }
>> 091
>> 092
>> 093
>> 094 void bn_push_msd(big_number_t * bn, char value)
>> 095 {
>> 096 struct digit *d;
>> 097 d = (struct digit*) sos_kmalloc(sizeof(struct digit), 0);
>> 098 SOS_ASSERT_FATAL(d != NULL);
>> 099 d->value = value;
>> 100 list_add_head(*bn, d);
>> 101 }
>> 102
>> 103
>> 104
>> 105 big_number_t bn_new(unsigned long int i)
>> 106 {
>> 107 big_number_t retval;
>> 108
>> 109 list_init(retval);
>> 110 do
>> 111 {
>> 112 bn_push_msd(&retval, i%10);
>> 113 i /= 10;
>> 114 }
>> 115 while (i != 0);
080 116
081 !! 117 return retval;
082 sos_sched_do_timer_tick(); <<
083 } 118 }
084 119
085 120
086 !! 121
087 !! 122 big_number_t bn_copy(const big_number_t bn)
088 !! 123 {
>> 124 big_number_t retval;
>> 125 int nb_elts;
>> 126 struct digit *d;
>> 127
>> 128 list_init(retval);
>> 129 list_foreach(bn, d, nb_elts)
>> 130 {
>> 131 bn_push_lsd(&retval, d->value);
>> 132 }
>> 133
>> 134 return retval;
>> 135 }
089 136
090 137
091 !! 138
092 static void pgflt_ex(int intid, struct sos_cpu !! 139 void bn_del(big_number_t * bn)
093 { 140 {
094 static sos_ui32_t demand_paging_count = 0; !! 141 struct digit *d;
095 struct sos_thread * cur_thr = sos_thread_get <<
096 sos_vaddr_t faulting_vaddr = sos_cpu_contex <<
097 sos_paddr_t ppage_paddr; <<
098 142
099 if (sos_cpu_context_is_in_user_mode(ctxt) !! 143 list_collapse(*bn, d)
100 || (cur_thr->fixup_uaccess.return_vaddr) <<
101 { 144 {
102 __label__ unforce_address_space; !! 145 sos_kfree((sos_vaddr_t)d);
103 sos_bool_t need_to_setup_mmu; !! 146 }
104 sos_ui32_t errcode = sos_cpu_context_get !! 147 }
>> 148
>> 149
>> 150
>> 151 void bn_shift(big_number_t *bn, int shift)
>> 152 {
>> 153 for ( ; shift > 0 ; shift --)
>> 154 {
>> 155 bn_push_lsd(bn, 0);
>> 156 }
>> 157 }
105 158
106 <<
107 <<
108 need_to_setup_mmu = (cur_thr->squatted_m <<
109 != sos_process_get_ <<
110 if (need_to_setup_mmu) <<
111 sos_thread_prepare_user_space_access(N <<
112 159
113 if (SOS_OK == !! 160
114 sos_umem_vmm_try_resolve_page_fault( !! 161 void bn_print_bochs(const big_number_t bn)
115 !! 162 {
116 !! 163 int nb_elts;
117 goto unforce_address_space; !! 164 const struct digit *d;
>> 165
>> 166 if (list_is_empty(bn))
>> 167 sos_bochs_printf("0");
>> 168 else
>> 169 list_foreach(bn, d, nb_elts)
>> 170 sos_bochs_printf("%d", d->value);
>> 171 }
>> 172
>> 173
>> 174 void bn_print_console(unsigned char row, unsigned char col,
>> 175 unsigned char attribute,
>> 176 const big_number_t bn,
>> 177 int nb_decimals)
>> 178 {
>> 179 if (list_is_empty(bn))
>> 180 sos_x86_videomem_printf(row, col, attribute, "0");
>> 181 else
>> 182 {
>> 183 int nb_elts;
>> 184 const struct digit *d;
>> 185 unsigned char x = col;
118 186
119 !! 187 list_foreach(bn, d, nb_elts)
120 <<
121 if (! sos_cpu_context_is_in_user_mode(ct <<
122 { 188 {
123 cur_thr->fixup_uaccess.faulted_uaddr !! 189 if (nb_elts == 0)
124 sos_cpu_context_set_EX_return_addres !! 190 {
125 !! 191 sos_x86_videomem_printf(row, x, attribute, "%d.", d->value);
126 goto unforce_address_space; !! 192 x += 2;
>> 193 }
>> 194 else if (nb_elts < nb_decimals)
>> 195 {
>> 196 sos_x86_videomem_printf(row, x, attribute, "%d", d->value);
>> 197 x ++;
>> 198 }
127 } 199 }
128 200
129 if (need_to_setup_mmu) !! 201 sos_x86_videomem_printf(row, x, attribute, " . 10^{%d} ", nb_elts-1);
130 sos_thread_end_user_space_access(); !! 202 }
>> 203 }
>> 204
>> 205
>> 206
>> 207 big_number_t bn_add (const big_number_t bn1, const big_number_t bn2)
>> 208 {
>> 209 big_number_t retval;
>> 210 const struct digit *d1, *d2;
>> 211 sos_bool_t bn1_end = FALSE, bn2_end = FALSE;
>> 212 char carry = 0;
>> 213
>> 214 list_init(retval);
>> 215 d1 = list_get_tail(bn1);
>> 216 bn1_end = list_is_empty(bn1);
>> 217 d2 = list_get_tail(bn2);
>> 218 bn2_end = list_is_empty(bn2);
>> 219 do
>> 220 {
>> 221 if (! bn1_end)
>> 222 carry += d1->value;
>> 223 if (! bn2_end)
>> 224 carry += d2->value;
>> 225
>> 226 bn_push_msd(&retval, carry % 10);
>> 227 carry /= 10;
>> 228
>> 229 if (! bn1_end)
>> 230 d1 = d1->prev;
>> 231 if (! bn2_end)
>> 232 d2 = d2->prev;
>> 233 if (d1 == list_get_tail(bn1))
>> 234 bn1_end = TRUE;
>> 235 if (d2 == list_get_tail(bn2))
>> 236 bn2_end = TRUE;
>> 237 }
>> 238 while (!bn1_end || !bn2_end);
>> 239
>> 240 if (carry > 0)
>> 241 {
>> 242 bn_push_msd(&retval, carry);
>> 243 }
>> 244
>> 245 return retval;
>> 246 }
>> 247
>> 248
>> 249
>> 250 big_number_t bn_muli (const big_number_t bn, char digit)
>> 251 {
>> 252 big_number_t retval;
>> 253 int nb_elts;
>> 254 char carry = 0;
>> 255 const struct digit *d;
131 256
132 sos_bochs_printf("Unresolved USER page F !! 257 list_init(retval);
133 sos_cpu_context_get_PC( !! 258 list_foreach_backward(bn, d, nb_elts)
134 (unsigned)faulting_vadd !! 259 {
135 (unsigned)sos_cpu_conte !! 260 carry += d->value * digit;
136 sos_bochs_printf("Terminating User threa !! 261 bn_push_msd(&retval, carry % 10);
137 sos_thread_exit(); !! 262 carry /= 10;
138 <<
139 unforce_address_space: <<
140 if (need_to_setup_mmu) <<
141 sos_thread_end_user_space_access(); <<
142 return; <<
143 } <<
144 <<
145 <<
146 if (! sos_kmem_vmm_is_valid_vaddr(faulting_v <<
147 { <<
148 <<
149 <<
150 sos_display_fatal_error("Unresolved page <<
151 sos_cpu_context_ <<
152 (unsigned)faulti <<
153 (unsigned)sos_cp <<
154 SOS_ASSERT_FATAL(! "Got page fault (note <<
155 } 263 }
156 264
>> 265 if (carry > 0)
>> 266 {
>> 267 bn_push_msd(&retval, carry);
>> 268 }
157 269
158 !! 270 return retval;
159 !! 271 }
160 !! 272
161 !! 273
162 !! 274
163 demand_paging_count ++; !! 275 big_number_t bn_mult(const big_number_t bn1, const big_number_t bn2)
164 display_bits(0, 0, !! 276 {
165 SOS_X86_VIDEO_FG_LTRED | SOS_X8 !! 277 int shift = 0;
166 demand_paging_count); !! 278 big_number_t retval;
167 !! 279 int nb_elts;
168 !! 280 struct digit *d;
169 ppage_paddr = sos_physmem_ref_physpage_new(F !! 281
170 if (! ppage_paddr) !! 282 list_init(retval);
171 SOS_ASSERT_FATAL(! "TODO: implement swap. !! 283 list_foreach_backward(bn2, d, nb_elts)
172 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(pp !! 284 {
173 SO !! 285 big_number_t retmult = bn_muli(bn1, d->value);
174 FA !! 286 big_number_t old_retval = retval;
175 SO !! 287 bn_shift(& retmult, shift);
176 | !! 288 retval = bn_add(old_retval, retmult);
177 | !! 289 bn_del(& retmult);
178 sos_physmem_unref_physpage(ppage_paddr); !! 290 bn_del(& old_retval);
179 !! 291 shift ++;
180 !! 292 }
181 } !! 293
182 !! 294 return retval;
183 !! 295 }
184 !! 296
185 !! 297
186 !! 298
187 !! 299 big_number_t bn_fact(unsigned long int v)
188 !! 300 {
189 static void idle_thread() !! 301 unsigned long int i;
190 { !! 302 big_number_t retval = bn_new(1);
191 sos_ui32_t idle_twiddle = 0; !! 303 for (i = 1 ; i <= v ; i++)
192 !! 304 {
193 while (1) !! 305 big_number_t I = bn_new(i);
194 { !! 306 big_number_t tmp = bn_mult(retval, I);
195 !! 307 sos_x86_videomem_printf(4, 0,
196 !! 308 SOS_X86_VIDEO_BG_BLUE | SOS_X86_VIDEO_FG_LTGREEN,
197 asm("hlt\n"); !! 309 "%d! = ", (int)i);
198 !! 310 bn_print_console(4, 8, SOS_X86_VIDEO_BG_BLUE | SOS_X86_VIDEO_FG_WHITE,
199 idle_twiddle ++; !! 311 tmp, 55);
200 display_bits(0, 0, SOS_X86_VIDEO_FG_GREE !! 312 bn_del(& I);
201 idle_twiddle); !! 313 bn_del(& retval);
202 !! 314 retval = tmp;
203 !! 315 }
204 sos_thread_yield(); !! 316
205 } !! 317 return retval;
206 } !! 318 }
207 !! 319
208 !! 320
209 !! 321 void bn_test()
210 !! 322 {
211 !! 323 big_number_t bn = bn_fact(1000);
212 static void stat_thread() !! 324 sos_bochs_printf("1000! = ");
213 { !! 325 bn_print_bochs(bn);
214 while (1) !! 326 sos_bochs_printf("\n");
215 { !! 327
216 sos_ui32_t flags; !! 328 }
217 sos_ui32_t load1, load5, load15; !! 329
218 char str1[11], str5[11], str15[11]; !! 330
219 struct sos_time t; !! 331
220 t.sec = 1; <<
221 t.nanosec = 0; <<
222 <<
223 sos_thread_sleep(& t); <<
224 <<
225 sos_disable_IRQs(flags); <<
226 <<
227 <<
228 sos_load_get_sload(&load1, &load5, &load <<
229 sos_load_to_string(str1, load1); <<
230 sos_load_to_string(str5, load5); <<
231 sos_load_to_string(str15, load15); <<
232 sos_x86_videomem_printf(16, 34, <<
233 SOS_X86_VIDEO_FG <<
234 "Kernel (- Idle) <<
235 str1, str5, str1 <<
236 <<
237 sos_load_get_uload(&load1, &load5, &load <<
238 sos_load_to_string(str1, load1); <<
239 sos_load_to_string(str5, load5); <<
240 sos_load_to_string(str15, load15); <<
241 sos_x86_videomem_printf(17, 34, <<
242 SOS_X86_VIDEO_FG <<
243 "User: %s %s %s <<
244 str1, str5, str1 <<
245 <<
246 sos_load_get_uratio(&load1, &load5, &loa <<
247 sos_load_to_string(str1, load1); <<
248 sos_load_to_string(str5, load5); <<
249 sos_load_to_string(str15, load15); <<
250 sos_x86_videomem_printf(18, 34, <<
251 SOS_X86_VIDEO_FG <<
252 "User CPU %%: %s <<
253 str1, str5, str1 <<
254 <<
255 <<
256 sos_load_get_sratio(&load1, &load5, &loa <<
257 sos_load_to_string(str1, load1); <<
258 sos_load_to_string(str5, load5); <<
259 sos_load_to_string(str15, load15); <<
260 sos_x86_videomem_printf(19, 34, <<
261 SOS_X86_VIDEO_FG <<
262 "Kernel CPU %% ( <<
263 str1, str5, str1 <<
264 sos_restore_IRQs(flags); <<
265 } <<
266 } <<
267 <<
268 <<
269 <<
270 <<
271 <<
272 static sos_ret_t start_init() <<
273 { <<
274 sos_ret_t retval; <<
275 struct sos_umem_vmm_as *as_init; <<
276 struct sos_process *proc_init; <<
277 struct sos_thread *new_thr; <<
278 sos_uaddr_t ustack, start_uaddr; <<
279 <<
280 <<
281 proc_init = sos_process_create("init", FALSE <<
282 if (! proc_init) <<
283 return -SOS_ENOMEM; <<
284 as_init = sos_process_get_address_space(proc <<
285 <<
286 <<
287 start_uaddr = sos_binfmt_elf32_map(as_init, <<
288 if (0 == start_uaddr) <<
289 { <<
290 sos_process_unref(proc_init); <<
291 return -SOS_ENOENT; <<
292 } <<
293 <<
294 <<
295 ustack = (SOS_PAGING_TOP_USER_ADDRESS - SOS_ <<
296 retval = sos_dev_zero_map(as_init, &ustack, <<
297 SOS_VM_MAP_PROT_RE <<
298 0); <<
299 if (SOS_OK != retval) <<
300 { <<
301 sos_bochs_printf("ici 2\n"); <<
302 sos_process_unref(proc_init); <<
303 return -SOS_ENOMEM; <<
304 } <<
305 <<
306 <<
307 new_thr = sos_create_user_thread(NULL, <<
308 proc_init, <<
309 start_uaddr <<
310 0, 0, <<
311 ustack + SO <<
312 SOS_SCHED_P <<
313 if (! new_thr) <<
314 { <<
315 sos_bochs_printf("ici 3\n"); <<
316 sos_process_unref(proc_init); <<
317 return -SOS_ENOMEM; <<
318 } <<
319 <<
320 sos_process_unref(proc_init); <<
321 return SOS_OK; <<
322 } <<
323 <<
324 <<
325 <<
326 <<
327 <<
328 void sos_main(unsigned long magic, unsigned lo 332 void sos_main(unsigned long magic, unsigned long addr)
329 { 333 {
330 unsigned i; 334 unsigned i;
331 sos_paddr_t sos_kernel_core_base_paddr, sos_ 335 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
332 struct sos_time tick_resolution; <<
333 336
334 337
335 338
336 339
337 multiboot_info_t *mbi; 340 multiboot_info_t *mbi;
338 mbi = (multiboot_info_t *) addr; 341 mbi = (multiboot_info_t *) addr;
339 342
340 343
341 sos_bochs_setup(); 344 sos_bochs_setup();
342 345
343 sos_x86_videomem_setup(); 346 sos_x86_videomem_setup();
344 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 347 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
345 348
346 349
347 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 350 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
348 351
349 sos_x86_videomem_printf(1, 0, 352 sos_x86_videomem_printf(1, 0,
350 SOS_X86_VIDEO_FG_Y 353 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
351 "Welcome From GRUB 354 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
352 "SOS article 7.5", !! 355 "SOS", ',',
353 (unsigned)(mbi->me 356 (unsigned)(mbi->mem_upper >> 10) + 1,
354 (unsigned)mbi->mem 357 (unsigned)mbi->mem_upper);
355 else 358 else
356 359
357 sos_x86_videomem_printf(1, 0, 360 sos_x86_videomem_printf(1, 0,
358 SOS_X86_VIDEO_FG_Y 361 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
359 "Welcome to SOS ar !! 362 "Welcome to SOS");
360 363
361 sos_bochs_putstring("Message in a bochs: Thi !! 364 sos_bochs_putstring("Message in a bochs\n");
362 365
363 366
364 sos_gdt_subsystem_setup(); !! 367 sos_gdt_setup();
365 sos_idt_subsystem_setup(); !! 368 sos_idt_setup();
366 369
367 370
368 sos_exception_subsystem_setup(); !! 371 sos_exceptions_setup();
369 sos_irq_subsystem_setup(); !! 372 sos_irq_setup();
370 373
371 374
372 sos_i8254_set_frequency(100); 375 sos_i8254_set_frequency(100);
373 376
374 <<
375 <<
376 tick_resolution = (struct sos_time) { .sec=0 <<
377 sos_time_subsysem_setup(& tick_resolution); <<
378 377
379 378
380 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) 379 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
381 { 380 {
382 sos_x86_videomem_putstring(20, 0, 381 sos_x86_videomem_putstring(20, 0,
383 SOS_X86_VIDEO 382 SOS_X86_VIDEO_FG_LTRED
384 | SOS_X86_V 383 | SOS_X86_VIDEO_BG_BLUE
385 | SOS_X86_V 384 | SOS_X86_VIDEO_FG_BLINKING,
386 "I'm not load 385 "I'm not loaded with Grub !");
387 386
388 for (;;) 387 for (;;)
389 continue; 388 continue;
390 } 389 }
391 390
392 <<
393 <<
394 <<
395 <<
396 391
397 sos_irq_set_routine(SOS_IRQ_TIMER, 392 sos_irq_set_routine(SOS_IRQ_TIMER,
398 clk_it); !! 393 clk_it);
399 !! 394
400 !! 395
401 !! 396 asm volatile ("sti\n");
402 <<
403 <<
404 397
405 398
406 399
407 sos_physmem_subsystem_setup((mbi->mem_upper< !! 400 sos_physmem_setup((mbi->mem_upper<<10) + (1<<20),
408 & sos_kernel_cor !! 401 & sos_kernel_core_base_paddr,
409 & sos_kernel_cor !! 402 & sos_kernel_core_top_paddr);
410 403
411 404
412 405
413 406
414 407
415 408
416 409
417 SOS_ASSERT_FATAL(SOS_OK == !! 410 if (sos_paging_setup(sos_kernel_core_base_paddr,
418 sos_paging_subsystem_setup( !! 411 sos_kernel_core_top_paddr))
419 !! 412 sos_bochs_printf("Could not setup paged memory mode\n");
420 !! 413 sos_x86_videomem_printf(2, 0,
421 !! 414 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
422 sos_exception_set_routine(SOS_EXCEPT_PAGE_FA !! 415 "Paged-memory mode is activated");
423 pgflt_ex); <<
424 416
425 <<
426 <<
427 <<
428 417
429 if (sos_kmem_vmm_subsystem_setup(sos_kernel_ !! 418 if (sos_kmem_vmm_setup(sos_kernel_core_base_paddr,
430 sos_kernel_ !! 419 sos_kernel_core_top_paddr))
431 bootstrap_s <<
432 bootstrap_s <<
433 + bootstrap <<
434 sos_bochs_printf("Could not setup the Kern 420 sos_bochs_printf("Could not setup the Kernel virtual space allocator\n");
435 421
436 if (sos_kmalloc_subsystem_setup()) !! 422 if (sos_kmalloc_setup())
437 sos_bochs_printf("Could not setup the Kmal 423 sos_bochs_printf("Could not setup the Kmalloc subsystem\n");
438 424
439 !! 425
440 !! 426 bn_test();
441 <<
442 sos_mm_context_subsystem_setup(); <<
443 <<
444 <<
445 <<
446 <<
447 sos_cpu_context_subsystem_setup(); <<
448 427
449 !! 428
450 !! 429 for (;;)
451 !! 430 continue;
452 sos_swintr_subsystem_setup(); <<
453 <<
454 <<
455 <<
456 <<
457 <<
458 <<
459 <<
460 sos_thread_subsystem_setup(bootstrap_stack_b <<
461 bootstrap_stack_s <<
462 <<
463 <<
464 sos_sched_subsystem_setup(); <<
465 <<
466 <<
467 SOS_ASSERT_FATAL(sos_create_kernel_thread("i <<
468 SO <<
469 <<
470 <<
471 sos_load_subsystem_setup(); <<
472 <<
473 <<
474 SOS_ASSERT_FATAL(sos_create_kernel_thread("s <<
475 NU <<
476 SO <<
477 431
478 !! 432 return;
479 <<
480 <<
481 <<
482 sos_umem_vmm_subsystem_setup(); <<
483 sos_dev_zero_subsystem_setup(); <<
484 <<
485 <<
486 <<
487 <<
488 sos_process_subsystem_setup(); <<
489 <<
490 <<
491 <<
492 <<
493 asm volatile ("sti\n"); <<
494 <<
495 <<
496 <<
497 start_init(); <<
498 <<
499 <<
500 <<
501 <<
502 <<
503 <<
504 <<
505 <<
506 <<
507 <<
508 <<
509 <<
510 <<
511 sos_bochs_printf("Bye from primary thread !\ <<
512 sos_thread_exit(); <<
513 SOS_FATAL_ERROR("No trespassing !"); <<
514 } 433 }