Diff markup
001 001
002 <<
003 002
004 003
005 004
006 005
007 006
008 007
009 008
010 009
011 010
012 011
013 012
014 013
015 014
016 015
017 016
018 017
019 018
020 019
021 #include <bootstrap/multiboot.h> 020 #include <bootstrap/multiboot.h>
022 #include <hwcore/idt.h> 021 #include <hwcore/idt.h>
023 #include <hwcore/gdt.h> 022 #include <hwcore/gdt.h>
024 #include <hwcore/irq.h> 023 #include <hwcore/irq.h>
025 #include <hwcore/exception.h> 024 #include <hwcore/exception.h>
026 #include <hwcore/i8254.h> 025 #include <hwcore/i8254.h>
027 #include <sos/list.h> 026 #include <sos/list.h>
028 #include <sos/physmem.h> 027 #include <sos/physmem.h>
029 #include <hwcore/paging.h> 028 #include <hwcore/paging.h>
>> 029 #include <hwcore/mm_context.h>
>> 030 #include <hwcore/swintr.h>
030 #include <sos/kmem_vmm.h> 031 #include <sos/kmem_vmm.h>
031 #include <sos/kmalloc.h> 032 #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>
032 #include <sos/klibc.h> 037 #include <sos/klibc.h>
033 #include <sos/assert.h> 038 #include <sos/assert.h>
034 #include <drivers/x86_videomem.h> 039 #include <drivers/x86_videomem.h>
035 #include <drivers/bochs.h> 040 #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>
036 045
037 046
038 047
039 048
040 static void display_bits(unsigned char row, un !! 049 void display_bits(unsigned char row, unsigned char col,
041 unsigned char attribu !! 050 unsigned char attribute,
042 sos_ui32_t integer) !! 051 sos_ui32_t integer)
043 { 052 {
044 int i; 053 int i;
045 054
046 for (i = 31 ; i >= 0 ; i--) 055 for (i = 31 ; i >= 0 ; i--)
047 { 056 {
048 057
049 int bit_i = (integer & (1 << i)); 058 int bit_i = (integer & (1 << i));
050 059
051 unsigned char ascii_code = bit_i?219:177 060 unsigned char ascii_code = bit_i?219:177;
052 sos_x86_videomem_putchar(row, col++, 061 sos_x86_videomem_putchar(row, col++,
053 attribute, 062 attribute,
054 ascii_code); 063 ascii_code);
055 } 064 }
056 } 065 }
057 066
058 067
059 068
060 static void clk_it(int intid) 069 static void clk_it(int intid)
061 { 070 {
062 static sos_ui32_t clock_count = 0; 071 static sos_ui32_t clock_count = 0;
063 072
064 display_bits(0, 48, 073 display_bits(0, 48,
065 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 074 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
066 clock_count); 075 clock_count);
067 clock_count++; 076 clock_count++;
068 077
069 } !! 078
070 struct digit !! 079 sos_time_do_tick();
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(struc <<
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(struc <<
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); <<
116 080
117 return retval; !! 081
>> 082 sos_sched_do_timer_tick();
118 } 083 }
119 084
120 085
121 !! 086
122 big_number_t bn_copy(const big_number_t bn) !! 087
123 { !! 088
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 } <<
136 089
137 090
138 !! 091
139 void bn_del(big_number_t * bn) !! 092 static void pgflt_ex(int intid, struct sos_cpu_state *ctxt)
140 { 093 {
141 struct digit *d; !! 094 static sos_ui32_t demand_paging_count = 0;
>> 095 struct sos_thread * cur_thr = sos_thread_get_current();
>> 096 sos_vaddr_t faulting_vaddr = sos_cpu_context_get_EX_faulting_vaddr(ctxt);
>> 097 sos_paddr_t ppage_paddr;
142 098
143 list_collapse(*bn, d) !! 099 if (sos_cpu_context_is_in_user_mode(ctxt)
>> 100 || (cur_thr->fixup_uaccess.return_vaddr))
144 { 101 {
145 sos_kfree((sos_vaddr_t)d); !! 102 __label__ unforce_address_space;
146 } !! 103 sos_bool_t need_to_setup_mmu;
147 } !! 104 sos_ui32_t errcode = sos_cpu_context_get_EX_info(ctxt);
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 } <<
158 105
>> 106
>> 107
>> 108 need_to_setup_mmu = (cur_thr->squatted_mm_context
>> 109 != sos_process_get_mm_context(cur_thr->process));
>> 110 if (need_to_setup_mmu)
>> 111 sos_thread_prepare_user_space_access(NULL, 0);
159 112
160 !! 113 if (SOS_OK ==
161 void bn_print_bochs(const big_number_t bn) !! 114 sos_umem_vmm_try_resolve_page_fault(faulting_vaddr,
162 { !! 115 errcode & (1 << 1),
163 int nb_elts; !! 116 TRUE))
164 const struct digit *d; !! 117 goto unforce_address_space;
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, unsig <<
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, attribut <<
181 else <<
182 { <<
183 int nb_elts; <<
184 const struct digit *d; <<
185 unsigned char x = col; <<
186 118
187 list_foreach(bn, d, nb_elts) !! 119
>> 120
>> 121 if (! sos_cpu_context_is_in_user_mode(ctxt))
188 { 122 {
189 if (nb_elts == 0) !! 123 cur_thr->fixup_uaccess.faulted_uaddr = faulting_vaddr;
190 { !! 124 sos_cpu_context_set_EX_return_address(ctxt,
191 sos_x86_videomem_printf(row, x, !! 125 cur_thr->fixup_uaccess.return_vaddr);
192 x += 2; !! 126 goto unforce_address_space;
193 } <<
194 else if (nb_elts < nb_decimals) <<
195 { <<
196 sos_x86_videomem_printf(row, x, <<
197 x ++; <<
198 } <<
199 } 127 }
200 128
201 sos_x86_videomem_printf(row, x, attribut !! 129 if (need_to_setup_mmu)
202 } !! 130 sos_thread_end_user_space_access();
203 } <<
204 <<
205 <<
206 <<
207 big_number_t bn_add (const big_number_t bn1, c <<
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, c <<
251 { <<
252 big_number_t retval; <<
253 int nb_elts; <<
254 char carry = 0; <<
255 const struct digit *d; <<
256 131
257 list_init(retval); !! 132 sos_bochs_printf("Unresolved USER page Fault at instruction 0x%x on access to address 0x%x (info=%x)!\n",
258 list_foreach_backward(bn, d, nb_elts) !! 133 sos_cpu_context_get_PC(ctxt),
259 { !! 134 (unsigned)faulting_vaddr,
260 carry += d->value * digit; !! 135 (unsigned)sos_cpu_context_get_EX_info(ctxt));
261 bn_push_msd(&retval, carry % 10); !! 136 sos_bochs_printf("Terminating User thread\n");
262 carry /= 10; !! 137 sos_thread_exit();
>> 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_vaddr))
>> 147 {
>> 148
>> 149
>> 150 sos_display_fatal_error("Unresolved page Fault at instruction 0x%x on access to address 0x%x (info=%x)!",
>> 151 sos_cpu_context_get_PC(ctxt),
>> 152 (unsigned)faulting_vaddr,
>> 153 (unsigned)sos_cpu_context_get_EX_info(ctxt));
>> 154 SOS_ASSERT_FATAL(! "Got page fault (note: demand paging is disabled)");
263 } 155 }
264 156
265 if (carry > 0) <<
266 { <<
267 bn_push_msd(&retval, carry); <<
268 } <<
269 157
270 return retval; !! 158
271 } !! 159
272 !! 160
273 !! 161
274 !! 162
275 big_number_t bn_mult(const big_number_t bn1, c !! 163 demand_paging_count ++;
276 { !! 164 display_bits(0, 0,
277 int shift = 0; !! 165 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
278 big_number_t retval; !! 166 demand_paging_count);
279 int nb_elts; !! 167
280 struct digit *d; !! 168
281 !! 169 ppage_paddr = sos_physmem_ref_physpage_new(FALSE);
282 list_init(retval); !! 170 if (! ppage_paddr)
283 list_foreach_backward(bn2, d, nb_elts) !! 171 SOS_ASSERT_FATAL(! "TODO: implement swap. (Out of mem in demand paging because no swap for kernel yet !)");
284 { !! 172 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(ppage_paddr,
285 big_number_t retmult = bn_muli(bn1, d->v !! 173 SOS_PAGE_ALIGN_INF(faulting_vaddr),
286 big_number_t old_retval = retval; !! 174 FALSE,
287 bn_shift(& retmult, shift); !! 175 SOS_VM_MAP_PROT_READ
288 retval = bn_add(old_retval, retmult); !! 176 | SOS_VM_MAP_PROT_WRITE
289 bn_del(& retmult); !! 177 | SOS_VM_MAP_ATOMIC));
290 bn_del(& old_retval); !! 178 sos_physmem_unref_physpage(ppage_paddr);
291 shift ++; !! 179
292 } !! 180
293 !! 181 }
294 return retval; !! 182
295 } !! 183
296 !! 184
297 !! 185
298 !! 186
299 big_number_t bn_fact(unsigned long int v) !! 187
300 { !! 188
301 unsigned long int i; !! 189 static void idle_thread()
302 big_number_t retval = bn_new(1); !! 190 {
303 for (i = 1 ; i <= v ; i++) !! 191 sos_ui32_t idle_twiddle = 0;
304 { !! 192
305 big_number_t I = bn_new(i); !! 193 while (1)
306 big_number_t tmp = bn_mult(retval, I); !! 194 {
307 sos_x86_videomem_printf(4, 0, !! 195
308 SOS_X86_VIDEO_BG !! 196
309 "%d! = ", (int)i !! 197 asm("hlt\n");
310 bn_print_console(4, 8, SOS_X86_VIDEO_BG_ !! 198
311 tmp, 55); !! 199 idle_twiddle ++;
312 bn_del(& I); !! 200 display_bits(0, 0, SOS_X86_VIDEO_FG_GREEN | SOS_X86_VIDEO_BG_BLUE,
313 bn_del(& retval); !! 201 idle_twiddle);
314 retval = tmp; !! 202
315 } !! 203
316 !! 204 sos_thread_yield();
317 return retval; !! 205 }
318 } !! 206 }
319 !! 207
320 !! 208
321 void bn_test() !! 209
322 { !! 210
323 big_number_t bn = bn_fact(1000); !! 211
324 sos_bochs_printf("1000! = "); !! 212 static void stat_thread()
325 bn_print_bochs(bn); !! 213 {
326 sos_bochs_printf("\n"); !! 214 while (1)
327 !! 215 {
328 } !! 216 sos_ui32_t flags;
329 !! 217 sos_ui32_t load1, load5, load15;
330 !! 218 char str1[11], str5[11], str15[11];
331 !! 219 struct sos_time t;
>> 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, &load15);
>> 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_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 234 "Kernel (- Idle): %s %s %s ",
>> 235 str1, str5, str15);
>> 236
>> 237 sos_load_get_uload(&load1, &load5, &load15);
>> 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_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 243 "User: %s %s %s ",
>> 244 str1, str5, str15);
>> 245
>> 246 sos_load_get_uratio(&load1, &load5, &load15);
>> 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_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 252 "User CPU %%: %s %s %s ",
>> 253 str1, str5, str15);
>> 254
>> 255
>> 256 sos_load_get_sratio(&load1, &load5, &load15);
>> 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_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 262 "Kernel CPU %% (+ Idle): %s %s %s ",
>> 263 str1, str5, str15);
>> 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_init);
>> 285
>> 286
>> 287 start_uaddr = sos_binfmt_elf32_map(as_init, "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_DEFAULT_USER_STACK_SIZE) + 1;
>> 296 retval = sos_dev_zero_map(as_init, &ustack, SOS_DEFAULT_USER_STACK_SIZE,
>> 297 SOS_VM_MAP_PROT_READ | SOS_VM_MAP_PROT_WRITE,
>> 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 + SOS_DEFAULT_USER_STACK_SIZE - 4,
>> 312 SOS_SCHED_PRIO_TS_LOWEST);
>> 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
332 void sos_main(unsigned long magic, unsigned lo 328 void sos_main(unsigned long magic, unsigned long addr)
333 { 329 {
334 unsigned i; 330 unsigned i;
335 sos_paddr_t sos_kernel_core_base_paddr, sos_ 331 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
>> 332 struct sos_time tick_resolution;
336 333
337 334
338 335
339 336
340 multiboot_info_t *mbi; 337 multiboot_info_t *mbi;
341 mbi = (multiboot_info_t *) addr; 338 mbi = (multiboot_info_t *) addr;
342 339
343 340
344 sos_bochs_setup(); 341 sos_bochs_setup();
345 342
346 sos_x86_videomem_setup(); 343 sos_x86_videomem_setup();
347 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 344 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
348 345
349 346
350 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 347 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
351 348
352 sos_x86_videomem_printf(1, 0, 349 sos_x86_videomem_printf(1, 0,
353 SOS_X86_VIDEO_FG_Y 350 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
354 "Welcome From GRUB 351 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
355 "SOS", ',', !! 352 "SOS article 7.5", ',',
356 (unsigned)(mbi->me 353 (unsigned)(mbi->mem_upper >> 10) + 1,
357 (unsigned)mbi->mem 354 (unsigned)mbi->mem_upper);
358 else 355 else
359 356
360 sos_x86_videomem_printf(1, 0, 357 sos_x86_videomem_printf(1, 0,
361 SOS_X86_VIDEO_FG_Y 358 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
362 "Welcome to SOS"); !! 359 "Welcome to SOS article 7.5");
363 360
364 sos_bochs_putstring("Message in a bochs\n"); !! 361 sos_bochs_putstring("Message in a bochs: This is SOS article 7.5.\n");
365 362
366 363
367 sos_gdt_setup(); !! 364 sos_gdt_subsystem_setup();
368 sos_idt_setup(); !! 365 sos_idt_subsystem_setup();
369 366
370 367
371 sos_exceptions_setup(); !! 368 sos_exception_subsystem_setup();
372 sos_irq_setup(); !! 369 sos_irq_subsystem_setup();
373 370
374 371
375 sos_i8254_set_frequency(100); 372 sos_i8254_set_frequency(100);
376 373
>> 374
>> 375
>> 376 tick_resolution = (struct sos_time) { .sec=0, .nanosec=10000000UL };
>> 377 sos_time_subsysem_setup(& tick_resolution);
377 378
378 379
379 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) 380 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
380 { 381 {
381 sos_x86_videomem_putstring(20, 0, 382 sos_x86_videomem_putstring(20, 0,
382 SOS_X86_VIDEO 383 SOS_X86_VIDEO_FG_LTRED
383 | SOS_X86_V 384 | SOS_X86_VIDEO_BG_BLUE
384 | SOS_X86_V 385 | SOS_X86_VIDEO_FG_BLINKING,
385 "I'm not load 386 "I'm not loaded with Grub !");
386 387
387 for (;;) 388 for (;;)
388 continue; 389 continue;
389 } 390 }
390 391
>> 392
>> 393
>> 394
>> 395
391 396
392 sos_irq_set_routine(SOS_IRQ_TIMER, 397 sos_irq_set_routine(SOS_IRQ_TIMER,
393 clk_it); !! 398 clk_it);
394 !! 399
395 !! 400
396 asm volatile ("sti\n"); !! 401
>> 402
>> 403
397 404
398 405
399 406
400 sos_physmem_setup((mbi->mem_upper<<10) + (1< !! 407 sos_physmem_subsystem_setup((mbi->mem_upper<<10) + (1<<20),
401 & sos_kernel_core_base_pad !! 408 & sos_kernel_core_base_paddr,
402 & sos_kernel_core_top_padd !! 409 & sos_kernel_core_top_paddr);
403 410
404 411
405 412
406 413
407 414
408 415
409 416
410 if (sos_paging_setup(sos_kernel_core_base_pa !! 417 SOS_ASSERT_FATAL(SOS_OK ==
411 sos_kernel_core_top_pad !! 418 sos_paging_subsystem_setup(sos_kernel_core_base_paddr,
412 sos_bochs_printf("Could not setup paged me !! 419 sos_kernel_core_top_paddr));
413 sos_x86_videomem_printf(2, 0, !! 420
414 SOS_X86_VIDEO_FG_YEL !! 421
415 "Paged-memory mode i !! 422 sos_exception_set_routine(SOS_EXCEPT_PAGE_FAULT,
>> 423 pgflt_ex);
416 424
>> 425
>> 426
>> 427
417 428
418 if (sos_kmem_vmm_setup(sos_kernel_core_base_ !! 429 if (sos_kmem_vmm_subsystem_setup(sos_kernel_core_base_paddr,
419 sos_kernel_core_top_p !! 430 sos_kernel_core_top_paddr,
>> 431 bootstrap_stack_bottom,
>> 432 bootstrap_stack_bottom
>> 433 + bootstrap_stack_size))
420 sos_bochs_printf("Could not setup the Kern 434 sos_bochs_printf("Could not setup the Kernel virtual space allocator\n");
421 435
422 if (sos_kmalloc_setup()) !! 436 if (sos_kmalloc_subsystem_setup())
423 sos_bochs_printf("Could not setup the Kmal 437 sos_bochs_printf("Could not setup the Kmalloc subsystem\n");
424 438
425 !! 439
426 bn_test(); !! 440
>> 441
>> 442 sos_mm_context_subsystem_setup();
>> 443
>> 444
>> 445
>> 446
>> 447 sos_cpu_context_subsystem_setup();
427 448
428 !! 449
429 for (;;) !! 450
430 continue; !! 451
>> 452 sos_swintr_subsystem_setup();
>> 453
>> 454
>> 455
>> 456
>> 457
>> 458
>> 459
>> 460 sos_thread_subsystem_setup(bootstrap_stack_bottom,
>> 461 bootstrap_stack_size);
>> 462
>> 463
>> 464 sos_sched_subsystem_setup();
>> 465
>> 466
>> 467 SOS_ASSERT_FATAL(sos_create_kernel_thread("idle", idle_thread, NULL,
>> 468 SOS_SCHED_PRIO_TS_LOWEST) != NULL);
>> 469
>> 470
>> 471 sos_load_subsystem_setup();
>> 472
>> 473
>> 474 SOS_ASSERT_FATAL(sos_create_kernel_thread("stat_thread", stat_thread,
>> 475 NULL,
>> 476 SOS_SCHED_PRIO_TS_LOWEST) != NULL);
431 477
432 return; !! 478
>> 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 !\n");
>> 512 sos_thread_exit();
>> 513 SOS_FATAL_ERROR("No trespassing !");
433 } 514 }