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