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 #include <sos/errno.h> <<
020 <<
021 020
022 #include <bootstrap/multiboot.h> 021 #include <bootstrap/multiboot.h>
023 #include <hwcore/idt.h> 022 #include <hwcore/idt.h>
024 #include <hwcore/gdt.h> 023 #include <hwcore/gdt.h>
025 #include <hwcore/irq.h> 024 #include <hwcore/irq.h>
026 #include <hwcore/exception.h> 025 #include <hwcore/exception.h>
027 #include <hwcore/i8254.h> 026 #include <hwcore/i8254.h>
028 #include <sos/list.h> 027 #include <sos/list.h>
029 #include <sos/physmem.h> 028 #include <sos/physmem.h>
030 #include <hwcore/paging.h> 029 #include <hwcore/paging.h>
031 #include <hwcore/mm_context.h> !! 030 #include <sos/list.h>
032 #include <hwcore/swintr.h> <<
033 #include <sos/kmem_vmm.h> <<
034 #include <sos/kmalloc.h> <<
035 #include <sos/time.h> <<
036 #include <sos/thread.h> <<
037 #include <sos/process.h> <<
038 #include <sos/umem_vmm.h> <<
039 #include <sos/klibc.h> 031 #include <sos/klibc.h>
040 #include <sos/assert.h> 032 #include <sos/assert.h>
041 #include <drivers/x86_videomem.h> 033 #include <drivers/x86_videomem.h>
042 #include <drivers/bochs.h> 034 #include <drivers/bochs.h>
043 #include <sos/calcload.h> !! 035
044 #include <sos/umem_vmm.h> <<
045 #include <sos/binfmt_elf32.h> <<
046 #include <drivers/zero.h> <<
047 #include <sos/fs.h> <<
048 #include <drivers/fs_virtfs.h> <<
049 036
050 037
051 038
052 void display_bits(unsigned char row, unsigned !! 039 static void display_bits(unsigned char row, unsigned char col,
053 unsigned char attribute, !! 040 unsigned char attribute,
054 sos_ui32_t integer) !! 041 sos_ui32_t integer)
055 { 042 {
056 int i; 043 int i;
057 044
058 for (i = 31 ; i >= 0 ; i--) 045 for (i = 31 ; i >= 0 ; i--)
059 { 046 {
060 047
061 int bit_i = (integer & (1 << i)); 048 int bit_i = (integer & (1 << i));
062 049
063 unsigned char ascii_code = bit_i?219:177 050 unsigned char ascii_code = bit_i?219:177;
064 sos_x86_videomem_putchar(row, col++, 051 sos_x86_videomem_putchar(row, col++,
065 attribute, 052 attribute,
066 ascii_code); 053 ascii_code);
067 } 054 }
068 } 055 }
069 056
>> 057
070 058
071 static void clk_it(int intid) 059 static void clk_it(int intid)
072 { 060 {
073 static sos_ui32_t clock_count = 0; 061 static sos_ui32_t clock_count = 0;
074 062
075 display_bits(0, 48, 063 display_bits(0, 48,
076 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 064 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
077 clock_count); 065 clock_count);
078 clock_count++; 066 clock_count++;
079 067
080 <<
081 sos_time_do_tick(); <<
082 <<
083 <<
084 sos_sched_do_timer_tick(); <<
085 } 068 }
086 069
087 !! 070
088 !! 071 static void pgflt_ex(int exid)
089 <<
090 <<
091 <<
092 <<
093 <<
094 static void pgflt_ex(int intid, struct sos_cpu <<
095 { 072 {
096 static sos_ui32_t demand_paging_count = 0; !! 073 sos_bochs_printf("Got page fault\n");
097 struct sos_thread * cur_thr = sos_thread_get !! 074 sos_x86_videomem_printf(10, 30,
098 sos_vaddr_t faulting_vaddr = sos_cpu_contex !! 075 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
099 sos_paddr_t ppage_paddr; !! 076 "Got EXPECTED (?) Page fault ! But where ???");
100 !! 077 for (;;) ;
101 if (sos_cpu_context_is_in_user_mode(ctxt) <<
102 || (cur_thr->fixup_uaccess.return_vaddr) <<
103 { <<
104 __label__ unforce_address_space; <<
105 sos_bool_t need_to_setup_mmu; <<
106 sos_ui32_t errcode = sos_cpu_context_get <<
107 <<
108 <<
109 <<
110 need_to_setup_mmu = (cur_thr->squatted_m <<
111 != sos_process_get_ <<
112 if (need_to_setup_mmu) <<
113 sos_thread_prepare_user_space_access(N <<
114 <<
115 if (SOS_OK == <<
116 sos_umem_vmm_try_resolve_page_fault( <<
117 <<
118 <<
119 goto unforce_address_space; <<
120 <<
121 <<
122 <<
123 if (! sos_cpu_context_is_in_user_mode(ct <<
124 { <<
125 cur_thr->fixup_uaccess.faulted_uaddr <<
126 sos_cpu_context_set_EX_return_addres <<
127 <<
128 goto unforce_address_space; <<
129 } <<
130 <<
131 if (need_to_setup_mmu) <<
132 sos_thread_end_user_space_access(); <<
133 <<
134 sos_bochs_printf("Unresolved USER page F <<
135 sos_cpu_context_get_PC( <<
136 (unsigned)faulting_vadd <<
137 (unsigned)sos_cpu_conte <<
138 sos_bochs_printf("Terminating User threa <<
139 sos_thread_exit(); <<
140 <<
141 unforce_address_space: <<
142 if (need_to_setup_mmu) <<
143 sos_thread_end_user_space_access(); <<
144 return; <<
145 } <<
146 <<
147 <<
148 if (! sos_kmem_vmm_is_valid_vaddr(faulting_v <<
149 { <<
150 <<
151 <<
152 sos_display_fatal_error("Unresolved page <<
153 sos_cpu_context_ <<
154 (unsigned)faulti <<
155 (unsigned)sos_cp <<
156 SOS_ASSERT_FATAL(! "Got page fault (note <<
157 } <<
158 <<
159 <<
160 <<
161 <<
162 <<
163 <<
164 <<
165 demand_paging_count ++; <<
166 display_bits(0, 0, <<
167 SOS_X86_VIDEO_FG_LTRED | SOS_X8 <<
168 demand_paging_count); <<
169 <<
170 <<
171 ppage_paddr = sos_physmem_ref_physpage_new(F <<
172 if (! ppage_paddr) <<
173 SOS_ASSERT_FATAL(! "TODO: implement swap. <<
174 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(pp <<
175 SO <<
176 FA <<
177 SO <<
178 | <<
179 | <<
180 sos_physmem_unref_physpage(ppage_paddr); <<
181 <<
182 <<
183 } 078 }
184 079
185 !! 080 static void test_paging(sos_vaddr_t sos_kernel_core_top_vaddr)
186 <<
187 <<
188 <<
189 <<
190 <<
191 static void idle_thread() <<
192 { 081 {
193 sos_ui32_t idle_twiddle = 0; !! 082
>> 083
>> 084 sos_vaddr_t vpage_code = SOS_PAGE_ALIGN_INF(test_paging);
>> 085
>> 086
>> 087 sos_paddr_t ppage_new;
>> 088
>> 089
>> 090
>> 091 sos_vaddr_t vpage_tmp = sos_kernel_core_top_vaddr;
194 092
195 while (1) !! 093 unsigned i;
196 { <<
197 <<
198 <<
199 asm("hlt\n"); <<
200 <<
201 idle_twiddle ++; <<
202 display_bits(0, 0, SOS_X86_VIDEO_FG_GREE <<
203 idle_twiddle); <<
204 <<
205 <<
206 sos_thread_yield(); <<
207 } <<
208 } <<
209 <<
210 <<
211 <<
212 <<
213 <<
214 static void stat_thread() <<
215 { <<
216 while (1) <<
217 { <<
218 sos_ui32_t flags; <<
219 sos_ui32_t load1, load5, load15; <<
220 char str1[11], str5[11], str15[11]; <<
221 struct sos_time t; <<
222 t.sec = 1; <<
223 t.nanosec = 0; <<
224 <<
225 sos_thread_sleep(& t); <<
226 <<
227 sos_disable_IRQs(flags); <<
228 <<
229 <<
230 sos_load_get_sload(&load1, &load5, &load <<
231 sos_load_to_string(str1, load1); <<
232 sos_load_to_string(str5, load5); <<
233 sos_load_to_string(str15, load15); <<
234 sos_x86_videomem_printf(16, 34, <<
235 SOS_X86_VIDEO_FG <<
236 "Kernel (- Idle) <<
237 str1, str5, str1 <<
238 <<
239 sos_load_get_uload(&load1, &load5, &load <<
240 sos_load_to_string(str1, load1); <<
241 sos_load_to_string(str5, load5); <<
242 sos_load_to_string(str15, load15); <<
243 sos_x86_videomem_printf(17, 34, <<
244 SOS_X86_VIDEO_FG <<
245 "User: %s %s %s <<
246 str1, str5, str1 <<
247 <<
248 sos_load_get_uratio(&load1, &load5, &loa <<
249 sos_load_to_string(str1, load1); <<
250 sos_load_to_string(str5, load5); <<
251 sos_load_to_string(str15, load15); <<
252 sos_x86_videomem_printf(18, 34, <<
253 SOS_X86_VIDEO_FG <<
254 "User CPU %%: %s <<
255 str1, str5, str1 <<
256 <<
257 <<
258 sos_load_get_sratio(&load1, &load5, &loa <<
259 sos_load_to_string(str1, load1); <<
260 sos_load_to_string(str5, load5); <<
261 sos_load_to_string(str15, load15); <<
262 sos_x86_videomem_printf(19, 34, <<
263 SOS_X86_VIDEO_FG <<
264 "Kernel CPU %% ( <<
265 str1, str5, str1 <<
266 sos_restore_IRQs(flags); <<
267 } <<
268 } <<
269 <<
270 <<
271 <<
272 <<
273 <<
274 static sos_ret_t <<
275 start_init(struct sos_fs_manager_instance * ro <<
276 { <<
277 sos_ret_t retval; <<
278 struct sos_umem_vmm_as *as_init; <<
279 struct sos_process *proc_init; <<
280 struct sos_thread *new_thr; <<
281 sos_uaddr_t ustack, start_uaddr; <<
282 struct sos_fs_opened_file * init_root, * ini <<
283 <<
284 <<
285 proc_init = sos_process_create("init", FALSE <<
286 if (! proc_init) <<
287 return -SOS_ENOMEM; <<
288 as_init = sos_process_get_address_space(proc <<
289 094
>> 095
>> 096 sos_exception_set_routine(SOS_EXCEPT_PAGE_FAULT,
>> 097 pgflt_ex);
290 098
291 099
292 !! 100
293 !! 101
294 <<
295 102
296 retval = sos_fs_new_opened_file(proc_init, r !! 103 sos_x86_videomem_printf(4, 0,
297 SOS_FS_OPEN_ !! 104 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
298 & init_root) !! 105 "Moving current code elsewhere in physical memory:");
299 if (SOS_OK != retval) <<
300 { <<
301 sos_process_unref(proc_init); <<
302 return -SOS_ENOENT; <<
303 } <<
304 <<
305 <<
306 <<
307 retval = sos_fs_duplicate_opened_file(init_r <<
308 & init <<
309 if (SOS_OK != retval) <<
310 { <<
311 sos_fs_close(init_root); <<
312 sos_process_unref(proc_init); <<
313 return -SOS_ENOENT; <<
314 } <<
315 <<
316 <<
317 if ( ( SOS_OK != sos_process_chroot(proc_ini <<
318 || ( SOS_OK != sos_process_chdir(proc_i <<
319 { <<
320 sos_fs_close(init_root); <<
321 sos_fs_close(init_cwd); <<
322 sos_process_chroot(proc_init, NULL, & un <<
323 sos_process_chdir(proc_init, NULL, & unu <<
324 sos_process_unref(proc_init); <<
325 return -SOS_ENOENT; <<
326 } <<
327 106
328 <<
329 start_uaddr = sos_binfmt_elf32_map(as_init, <<
330 if (0 == start_uaddr) <<
331 { <<
332 sos_process_unref(proc_init); <<
333 return -SOS_ENOENT; <<
334 } <<
335 107
336 !! 108
337 ustack = (SOS_PAGING_TOP_USER_ADDRESS - SOS_ !! 109 ppage_new = sos_physmem_ref_physpage_new(FALSE);
338 retval = sos_dev_zero_map(as_init, &ustack, !! 110 if (! ppage_new)
339 SOS_VM_MAP_PROT_RE <<
340 0); <<
341 if (SOS_OK != retval) <<
342 { 111 {
343 sos_process_unref(proc_init); !! 112
344 return -SOS_ENOMEM; !! 113 sos_x86_videomem_putstring(20, 0,
>> 114 SOS_X86_VIDEO_FG_LTRED
>> 115 | SOS_X86_VIDEO_BG_BLUE,
>> 116 "test_paging : Cannot allocate page");
>> 117 return;
345 } 118 }
346 119
347 !! 120 sos_x86_videomem_printf(5, 0,
348 new_thr = sos_create_user_thread(NULL, !! 121 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
349 proc_init, !! 122 "Hello from the address 0x%x in physical memory",
350 start_uaddr !! 123 sos_paging_get_paddr(vpage_code));
351 0, 0, !! 124
352 ustack + SO !! 125 sos_x86_videomem_printf(6, 0,
353 SOS_SCHED_P !! 126 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
354 if (! new_thr) !! 127 "Transfer vpage 0x%x: ppage 0x%x -> 0x%x (tmp vpage 0x%x)",
355 { !! 128 vpage_code,
356 sos_process_unref(proc_init); !! 129 sos_paging_get_paddr(vpage_code),
357 return -SOS_ENOMEM; !! 130 ppage_new,
>> 131 (unsigned)vpage_tmp);
>> 132
>> 133
>> 134
>> 135 sos_paging_map(ppage_new, vpage_tmp,
>> 136 FALSE,
>> 137 SOS_VM_MAP_ATOMIC
>> 138 | SOS_VM_MAP_PROT_READ
>> 139 | SOS_VM_MAP_PROT_WRITE);
>> 140
>> 141
>> 142
>> 143 sos_physmem_unref_physpage(ppage_new);
>> 144
>> 145
>> 146
>> 147 memcpy((void*)vpage_tmp,
>> 148 (void*)vpage_code,
>> 149 SOS_PAGE_SIZE);
>> 150
>> 151
>> 152 sos_paging_map(ppage_new, vpage_code,
>> 153 FALSE,
>> 154 SOS_VM_MAP_ATOMIC
>> 155 | SOS_VM_MAP_PROT_READ
>> 156 | SOS_VM_MAP_PROT_WRITE);
>> 157
>> 158
>> 159
>> 160
>> 161
>> 162
>> 163
>> 164
>> 165 sos_paging_unmap(vpage_tmp);
>> 166
>> 167 sos_x86_videomem_printf(7, 0,
>> 168 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 169 "Hello from the address 0x%x in physical memory",
>> 170 sos_paging_get_paddr(vpage_code));
>> 171
>> 172 sos_x86_videomem_printf(9, 0,
>> 173 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
>> 174 "Provoking a page fault:");
>> 175
>> 176
>> 177
>> 178
>> 179
>> 180
>> 181
>> 182
>> 183
>> 184 for (i = vpage_code ; ; i += SOS_PAGE_SIZE)
>> 185 {
>> 186 unsigned *pint = (unsigned *)SOS_PAGE_ALIGN_INF(i);
>> 187 sos_bochs_printf("Test vaddr 0x%x : val=", (unsigned)pint);
>> 188 sos_x86_videomem_printf(10, 0,
>> 189 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 190 "Test vaddr 0x%x : val= ",
>> 191 (unsigned)pint);
>> 192 sos_bochs_printf("0x%x\n", *pint);
>> 193 sos_x86_videomem_printf(10, 30,
>> 194 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 195 "0x%x ", *pint);
358 } 196 }
359 197
360 sos_process_unref(proc_init); !! 198
361 return SOS_OK; !! 199 sos_x86_videomem_printf(20, 0,
>> 200 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
>> 201 "We should have had a #PF at vaddr 0x%x !",
>> 202 vpage_tmp);
362 } 203 }
363 204
364 !! 205
365 !! 206 void sos_main(unsigned long magic, unsigned long addr)
366 <<
367 <<
368 void sos_main(unsigned long magic, unsigned lo <<
369 { 207 {
370 unsigned i; 208 unsigned i;
371 sos_paddr_t sos_kernel_core_base_paddr, sos_ 209 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
372 struct sos_time tick_resolution; <<
373 struct sos_fs_manager_instance * rootfs; <<
374 210
375 !! 211
376 unsigned long int upper_mem = 0; !! 212
>> 213
>> 214 multiboot_info_t *mbi;
>> 215 mbi = (multiboot_info_t *) addr;
377 216
378 217
379 sos_bochs_setup(); 218 sos_bochs_setup();
380 219
381 sos_x86_videomem_setup(); 220 sos_x86_videomem_setup();
382 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 221 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
383 222
384 223
385 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 224 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
386 { !! 225
387 !! 226 sos_x86_videomem_printf(1, 0,
388 !! 227 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
389 !! 228 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
390 multiboot_info_t *mbi = (multiboot_info_ !! 229 "SOS", ',',
391 !! 230 (unsigned)(mbi->mem_upper >> 10) + 1,
392 !! 231 (unsigned)mbi->mem_upper);
393 <<
394 <<
395 <<
396 upper_mem = mbi->mem_upper; <<
397 sos_x86_videomem_printf(1, 0, <<
398 SOS_X86_VIDEO_FG <<
399 "Welcome From GR <<
400 "SOS article 8", <<
401 (unsigned)(upper <<
402 (unsigned)upper_ <<
403 } <<
404 else if (magic == 0x42244224) <<
405 { <<
406 <<
407 upper_mem = arg; <<
408 sos_x86_videomem_printf(1, 0, <<
409 SOS_X86_VIDEO_FG <<
410 "Welcome to %s%c <<
411 "SOS article 8", <<
412 (unsigned)(upper <<
413 (unsigned)upper_ <<
414 } <<
415 else 232 else
416 !! 233
417 sos_x86_videomem_printf(1, 0, 234 sos_x86_videomem_printf(1, 0,
418 SOS_X86_VIDEO_FG_Y 235 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
419 "Welcome to SOS ar !! 236 "Welcome to SOS");
420 237
421 sos_bochs_putstring("Message in a bochs: Thi !! 238 sos_bochs_putstring("Message in a bochs\n");
422 239
423 240
424 sos_gdt_subsystem_setup(); !! 241 sos_gdt_setup();
425 sos_idt_subsystem_setup(); !! 242 sos_idt_setup();
426 243
427 244
428 sos_exception_subsystem_setup(); !! 245 sos_exceptions_setup();
429 sos_irq_subsystem_setup(); !! 246 sos_irq_setup();
430 247
431 248
432 sos_i8254_set_frequency(100); 249 sos_i8254_set_frequency(100);
433 250
434 <<
435 <<
436 tick_resolution = (struct sos_time) { .sec=0 <<
437 sos_time_subsysem_setup(& tick_resolution); <<
438 251
439 !! 252
440 if (upper_mem == 0) !! 253 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
441 { 254 {
442 sos_x86_videomem_putstring(20, 0, 255 sos_x86_videomem_putstring(20, 0,
443 SOS_X86_VIDEO 256 SOS_X86_VIDEO_FG_LTRED
444 | SOS_X86_V 257 | SOS_X86_VIDEO_BG_BLUE
445 | SOS_X86_V 258 | SOS_X86_VIDEO_FG_BLINKING,
446 "I don't know !! 259 "I'm not loaded with Grub !");
447 260
448 for (;;) 261 for (;;)
449 continue; 262 continue;
450 } 263 }
451 264
452 <<
453 <<
454 <<
455 <<
456 265
457 sos_irq_set_routine(SOS_IRQ_TIMER, 266 sos_irq_set_routine(SOS_IRQ_TIMER,
458 clk_it); !! 267 clk_it);
459 !! 268
460 !! 269
461 !! 270 asm volatile ("sti\n");
462 !! 271
463 !! 272
464 SOS_ASSERT_FATAL(SOS_OK !! 273
465 == sos_physmem_subsystem_se !! 274 sos_physmem_setup((mbi->mem_upper<<10) + (1<<20),
466 !! 275 & sos_kernel_core_base_paddr,
467 !! 276 & sos_kernel_core_top_paddr);
468 277
469 278
470 279
471 280
472 281
473 282
474 283
475 SOS_ASSERT_FATAL(SOS_OK == !! 284 if (sos_paging_setup(sos_kernel_core_base_paddr,
476 sos_paging_subsystem_setup( !! 285 sos_kernel_core_top_paddr))
477 !! 286 sos_bochs_printf("Could not setup paged memory mode\n");
478 !! 287 sos_x86_videomem_printf(2, 0,
479 !! 288 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
480 sos_exception_set_routine(SOS_EXCEPT_PAGE_FA !! 289 "Paged-memory mode is activated");
481 pgflt_ex); !! 290
482 !! 291 test_paging(sos_kernel_core_top_paddr);
483 !! 292
484 !! 293
485 !! 294 for (;;)
486 !! 295 continue;
487 if (sos_kmem_vmm_subsystem_setup(sos_kernel_ <<
488 sos_kernel_ <<
489 bootstrap_s <<
490 bootstrap_s <<
491 + bootstrap <<
492 sos_bochs_printf("Could not setup the Kern <<
493 <<
494 if (sos_kmalloc_subsystem_setup()) <<
495 sos_bochs_printf("Could not setup the Kmal <<
496 <<
497 <<
498 <<
499 <<
500 sos_mm_context_subsystem_setup(); <<
501 <<
502 <<
503 <<
504 <<
505 sos_cpu_context_subsystem_setup(); <<
506 <<
507 <<
508 <<
509 <<
510 sos_swintr_subsystem_setup(); <<
511 296
512 !! 297 return;
513 <<
514 <<
515 <<
516 <<
517 <<
518 sos_thread_subsystem_setup(bootstrap_stack_b <<
519 bootstrap_stack_s <<
520 <<
521 <<
522 sos_sched_subsystem_setup(); <<
523 <<
524 <<
525 SOS_ASSERT_FATAL(sos_create_kernel_thread("i <<
526 SO <<
527 <<
528 <<
529 sos_load_subsystem_setup(); <<
530 <<
531 <<
532 SOS_ASSERT_FATAL(sos_create_kernel_thread("s <<
533 NU <<
534 SO <<
535 <<
536 <<
537 <<
538 <<
539 <<
540 sos_umem_vmm_subsystem_setup(); <<
541 sos_dev_zero_subsystem_setup(); <<
542 <<
543 <<
544 <<
545 <<
546 sos_process_subsystem_setup(); <<
547 <<
548 <<
549 <<
550 <<
551 asm volatile ("sti\n"); <<
552 <<
553 <<
554 SOS_ASSERT_FATAL(SOS_OK == sos_fs_virtfs_sub <<
555 SOS_ASSERT_FATAL(SOS_OK == sos_fs_subsystem_ <<
556 <<
557 <<
558 <<
559 <<
560 <<
561 <<
562 <<
563 start_init(rootfs); <<
564 <<
565 <<
566 <<
567 <<
568 <<
569 <<
570 <<
571 <<
572 <<
573 <<
574 <<
575 <<
576 sos_bochs_printf("Bye from primary thread !\ <<
577 sos_thread_exit(); <<
578 SOS_FATAL_ERROR("No trespassing !"); <<
579 } 298 }