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>
032 #include <sos/klibc.h> 036 #include <sos/klibc.h>
033 #include <sos/assert.h> 037 #include <sos/assert.h>
034 #include <drivers/x86_videomem.h> 038 #include <drivers/x86_videomem.h>
035 #include <drivers/bochs.h> 039 #include <drivers/bochs.h>
>> 040 #include <sos/calcload.h>
036 041
037 042
038 043
039 044
040 static void display_bits(unsigned char row, un !! 045 void display_bits(unsigned char row, unsigned char col,
041 unsigned char attribu !! 046 unsigned char attribute,
042 sos_ui32_t integer) !! 047 sos_ui32_t integer)
043 { 048 {
044 int i; 049 int i;
045 050
046 for (i = 31 ; i >= 0 ; i--) 051 for (i = 31 ; i >= 0 ; i--)
047 { 052 {
048 053
049 int bit_i = (integer & (1 << i)); 054 int bit_i = (integer & (1 << i));
050 055
051 unsigned char ascii_code = bit_i?219:177 056 unsigned char ascii_code = bit_i?219:177;
052 sos_x86_videomem_putchar(row, col++, 057 sos_x86_videomem_putchar(row, col++,
053 attribute, 058 attribute,
054 ascii_code); 059 ascii_code);
055 } 060 }
056 } 061 }
057 062
058 063
059 064
060 static void clk_it(int intid) 065 static void clk_it(int intid)
061 { 066 {
062 static sos_ui32_t clock_count = 0; 067 static sos_ui32_t clock_count = 0;
063 068
064 display_bits(0, 48, 069 display_bits(0, 48,
065 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 070 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
066 clock_count); 071 clock_count);
067 clock_count++; 072 clock_count++;
068 073
069 } !! 074
070 struct digit !! 075 sos_time_do_tick();
071 { <<
072 struct digit *prev, *next; <<
073 char value; <<
074 }; <<
075 076
076 !! 077
077 !! 078 sos_sched_do_timer_tick();
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 } 079 }
091 080
092 081
093 !! 082
094 void bn_push_msd(big_number_t * bn, char value !! 083
095 { !! 084
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 085
103 086
104 !! 087
105 big_number_t bn_new(unsigned long int i) !! 088 static void pgflt_ex(int intid, struct sos_cpu_state *ctxt)
106 { 089 {
107 big_number_t retval; !! 090 static sos_ui32_t demand_paging_count = 0;
>> 091 sos_vaddr_t faulting_vaddr = sos_cpu_context_get_EX_faulting_vaddr(ctxt);
>> 092 sos_paddr_t ppage_paddr;
108 093
109 list_init(retval); !! 094 if (sos_cpu_context_is_in_user_mode(ctxt))
110 do <<
111 { 095 {
112 bn_push_msd(&retval, i%10); !! 096
113 i /= 10; !! 097
>> 098 sos_bochs_printf("Unresolved USER page Fault at instruction 0x%x on access to address 0x%x (info=%x)!\n",
>> 099 sos_cpu_context_get_PC(ctxt),
>> 100 (unsigned)faulting_vaddr,
>> 101 (unsigned)sos_cpu_context_get_EX_info(ctxt));
>> 102 sos_bochs_printf("Terminating User thread\n");
>> 103 sos_thread_exit();
114 } 104 }
115 while (i != 0); <<
116 <<
117 return retval; <<
118 } <<
119 <<
120 105
121 !! 106
122 big_number_t bn_copy(const big_number_t bn) !! 107 if (! sos_kmem_vmm_is_valid_vaddr(faulting_vaddr))
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 { 108 {
131 bn_push_lsd(&retval, d->value); !! 109
>> 110
>> 111 sos_display_fatal_error("Unresolved page Fault at instruction 0x%x on access to address 0x%x (info=%x)!",
>> 112 sos_cpu_context_get_PC(ctxt),
>> 113 (unsigned)faulting_vaddr,
>> 114 (unsigned)sos_cpu_context_get_EX_info(ctxt));
>> 115 SOS_ASSERT_FATAL(! "Got page fault (note: demand paging is disabled)");
132 } 116 }
133 117
134 return retval; !! 118
>> 119
>> 120
>> 121
>> 122
>> 123
>> 124 demand_paging_count ++;
>> 125 display_bits(0, 0,
>> 126 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
>> 127 demand_paging_count);
>> 128
>> 129
>> 130 ppage_paddr = sos_physmem_ref_physpage_new(FALSE);
>> 131 if (! ppage_paddr)
>> 132 SOS_ASSERT_FATAL(! "TODO: implement swap. (Out of mem in demand paging because no swap for kernel yet !)");
>> 133 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(ppage_paddr,
>> 134 SOS_PAGE_ALIGN_INF(faulting_vaddr),
>> 135 FALSE,
>> 136 SOS_VM_MAP_PROT_READ
>> 137 | SOS_VM_MAP_PROT_WRITE
>> 138 | SOS_VM_MAP_ATOMIC));
>> 139 sos_physmem_unref_physpage(ppage_paddr);
>> 140
>> 141
135 } 142 }
136 143
137 144
138 !! 145
139 void bn_del(big_number_t * bn) !! 146
>> 147
>> 148
>> 149
>> 150
>> 151
>> 152 struct thr_arg
140 { 153 {
141 struct digit *d; !! 154 char character;
>> 155 int color;
142 156
143 list_collapse(*bn, d) !! 157 int col;
144 { !! 158 int row;
145 sos_kfree((sos_vaddr_t)d); !! 159 };
146 } <<
147 } <<
148 160
149 161
150 !! 162 static void demo_thread(void *arg)
151 void bn_shift(big_number_t *bn, int shift) <<
152 { 163 {
153 for ( ; shift > 0 ; shift --) !! 164 struct thr_arg *thr_arg = (struct thr_arg*)arg;
154 { !! 165 int progress = 0;
155 bn_push_lsd(bn, 0); <<
156 } <<
157 } <<
158 166
>> 167 sos_bochs_printf("start %c", thr_arg->character);
>> 168 while (1)
>> 169 {
>> 170 progress ++;
>> 171 display_bits(thr_arg->row, thr_arg->col+1, thr_arg->color, progress);
159 172
160 !! 173 sos_bochs_putchar(thr_arg->character);
161 void bn_print_bochs(const big_number_t bn) <<
162 { <<
163 int nb_elts; <<
164 const struct digit *d; <<
165 174
166 if (list_is_empty(bn)) !! 175
167 sos_bochs_printf("0"); !! 176 if ((random() % 100) == 0)
168 else !! 177 {
169 list_foreach(bn, d, nb_elts) !! 178 sos_bochs_printf("[37myield(%c)[m\n", thr_arg->character);
170 sos_bochs_printf("%d", d->value); !! 179 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'Y');
171 } !! 180 SOS_ASSERT_FATAL(SOS_OK == sos_thread_yield());
>> 181 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'R');
>> 182 }
172 183
173 !! 184
174 void bn_print_console(unsigned char row, unsig !! 185 else if ((random() % 200) == 0)
175 unsigned char attribute, !! 186 {
176 const big_number_t bn, !! 187 struct sos_time t = (struct sos_time){ .sec=0, .nanosec=50000000 };
177 int nb_decimals) !! 188 sos_bochs_printf("[37msleep1(%c)[m\n", thr_arg->character);
178 { !! 189 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 's');
179 if (list_is_empty(bn)) !! 190 SOS_ASSERT_FATAL(SOS_OK == sos_thread_sleep(& t));
180 sos_x86_videomem_printf(row, col, attribut !! 191 SOS_ASSERT_FATAL(sos_time_is_zero(& t));
181 else !! 192 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'R');
182 { !! 193 }
183 int nb_elts; <<
184 const struct digit *d; <<
185 unsigned char x = col; <<
186 194
187 list_foreach(bn, d, nb_elts) !! 195
>> 196 else if ((random() % 300) == 0)
188 { 197 {
189 if (nb_elts == 0) !! 198 struct sos_time t = (struct sos_time){ .sec=0, .nanosec=300000000 };
190 { !! 199 sos_bochs_printf("[37msleep2(%c)[m\n", thr_arg->character);
191 sos_x86_videomem_printf(row, x, !! 200 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'S');
192 x += 2; !! 201 SOS_ASSERT_FATAL(SOS_OK == sos_thread_sleep(& t));
193 } !! 202 SOS_ASSERT_FATAL(sos_time_is_zero(& t));
194 else if (nb_elts < nb_decimals) !! 203 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'R');
195 { <<
196 sos_x86_videomem_printf(row, x, <<
197 x ++; <<
198 } <<
199 } 204 }
200 205
201 sos_x86_videomem_printf(row, x, attribut !! 206
202 } 207 }
203 } 208 }
204 209
205 210
206 !! 211 static void test_thread()
207 big_number_t bn_add (const big_number_t bn1, c <<
208 { 212 {
209 big_number_t retval; !! 213
210 const struct digit *d1, *d2; !! 214
211 sos_bool_t bn1_end = FALSE, bn2_end = FALSE !! 215 static struct thr_arg arg_b, arg_c, arg_d, arg_e, arg_R, arg_S;
212 char carry = 0; !! 216 sos_ui32_t flags;
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 217
240 if (carry > 0) !! 218 sos_disable_IRQs(flags);
241 { <<
242 bn_push_msd(&retval, carry); <<
243 } <<
244 219
245 return retval; !! 220 arg_b = (struct thr_arg) { .character='b', .col=0, .row=21, .color=0x14 };
246 } !! 221 sos_create_kernel_thread("YO[b]", demo_thread, (void*)&arg_b, SOS_SCHED_PRIO_TS_LOWEST);
247 222
>> 223 arg_c = (struct thr_arg) { .character='c', .col=46, .row=21, .color=0x14 };
>> 224 sos_create_kernel_thread("YO[c]", demo_thread, (void*)&arg_c, SOS_SCHED_PRIO_TS_LOWEST);
248 225
249 !! 226 arg_d = (struct thr_arg) { .character='d', .col=0, .row=20, .color=0x14 };
250 big_number_t bn_muli (const big_number_t bn, c !! 227 sos_create_kernel_thread("YO[d]", demo_thread, (void*)&arg_d, SOS_SCHED_PRIO_TS_LOWEST-1);
251 { <<
252 big_number_t retval; <<
253 int nb_elts; <<
254 char carry = 0; <<
255 const struct digit *d; <<
256 228
257 list_init(retval); !! 229 arg_e = (struct thr_arg) { .character='e', .col=0, .row=19, .color=0x14 };
258 list_foreach_backward(bn, d, nb_elts) !! 230 sos_create_kernel_thread("YO[e]", demo_thread, (void*)&arg_e, SOS_SCHED_PRIO_TS_LOWEST-2);
259 { <<
260 carry += d->value * digit; <<
261 bn_push_msd(&retval, carry % 10); <<
262 carry /= 10; <<
263 } <<
264 231
265 if (carry > 0) !! 232 arg_R = (struct thr_arg) { .character='R', .col=0, .row=17, .color=0x1c };
266 { !! 233 sos_create_kernel_thread("YO[R]", demo_thread, (void*)&arg_R, SOS_SCHED_PRIO_RT_LOWEST);
267 bn_push_msd(&retval, carry); !! 234
268 } !! 235 arg_S = (struct thr_arg) { .character='S', .col=0, .row=16, .color=0x1c };
>> 236 sos_create_kernel_thread("YO[S]", demo_thread, (void*)&arg_S, SOS_SCHED_PRIO_RT_LOWEST-1);
269 237
270 return retval; !! 238 sos_restore_IRQs(flags);
271 } 239 }
272 240
273 241
274 !! 242
275 big_number_t bn_mult(const big_number_t bn1, c !! 243
>> 244
>> 245
>> 246 static void idle_thread()
276 { 247 {
277 int shift = 0; !! 248 sos_ui32_t idle_twiddle = 0;
278 big_number_t retval; <<
279 int nb_elts; <<
280 struct digit *d; <<
281 249
282 list_init(retval); !! 250 while (1)
283 list_foreach_backward(bn2, d, nb_elts) <<
284 { 251 {
285 big_number_t retmult = bn_muli(bn1, d->v !! 252
286 big_number_t old_retval = retval; !! 253
287 bn_shift(& retmult, shift); !! 254 asm("hlt\n");
288 retval = bn_add(old_retval, retmult); <<
289 bn_del(& retmult); <<
290 bn_del(& old_retval); <<
291 shift ++; <<
292 } <<
293 255
294 return retval; !! 256 idle_twiddle ++;
>> 257 display_bits(0, 0, SOS_X86_VIDEO_FG_GREEN | SOS_X86_VIDEO_BG_BLUE,
>> 258 idle_twiddle);
>> 259
>> 260
>> 261 sos_thread_yield();
>> 262 }
295 } 263 }
296 264
297 265
298 !! 266
299 big_number_t bn_fact(unsigned long int v) !! 267
>> 268
>> 269 static void stat_thread()
300 { 270 {
301 unsigned long int i; !! 271 while (1)
302 big_number_t retval = bn_new(1); <<
303 for (i = 1 ; i <= v ; i++) <<
304 { 272 {
305 big_number_t I = bn_new(i); !! 273 sos_ui32_t flags;
306 big_number_t tmp = bn_mult(retval, I); !! 274 sos_ui32_t load1, load5, load15;
307 sos_x86_videomem_printf(4, 0, !! 275 char str1[11], str5[11], str15[11];
308 SOS_X86_VIDEO_BG !! 276 struct sos_time t;
309 "%d! = ", (int)i !! 277 t.sec = 1;
310 bn_print_console(4, 8, SOS_X86_VIDEO_BG_ !! 278 t.nanosec = 0;
311 tmp, 55); <<
312 bn_del(& I); <<
313 bn_del(& retval); <<
314 retval = tmp; <<
315 } <<
316 279
317 return retval; !! 280 sos_thread_sleep(& t);
318 } <<
319 281
>> 282 sos_disable_IRQs(flags);
320 283
321 void bn_test() !! 284
322 { !! 285 sos_load_get_sload(&load1, &load5, &load15);
323 big_number_t bn = bn_fact(1000); !! 286 sos_load_to_string(str1, load1);
324 sos_bochs_printf("1000! = "); !! 287 sos_load_to_string(str5, load5);
325 bn_print_bochs(bn); !! 288 sos_load_to_string(str15, load15);
326 sos_bochs_printf("\n"); !! 289 sos_x86_videomem_printf(16, 34,
327 !! 290 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 291 "Kernel (- Idle): %s %s %s ",
>> 292 str1, str5, str15);
>> 293
>> 294 sos_load_get_uload(&load1, &load5, &load15);
>> 295 sos_load_to_string(str1, load1);
>> 296 sos_load_to_string(str5, load5);
>> 297 sos_load_to_string(str15, load15);
>> 298 sos_x86_videomem_printf(17, 34,
>> 299 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 300 "User: %s %s %s ",
>> 301 str1, str5, str15);
>> 302
>> 303 sos_load_get_uratio(&load1, &load5, &load15);
>> 304 sos_load_to_string(str1, load1);
>> 305 sos_load_to_string(str5, load5);
>> 306 sos_load_to_string(str15, load15);
>> 307 sos_x86_videomem_printf(18, 34,
>> 308 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 309 "User CPU %%: %s %s %s ",
>> 310 str1, str5, str15);
>> 311
>> 312
>> 313 sos_load_get_sratio(&load1, &load5, &load15);
>> 314 sos_load_to_string(str1, load1);
>> 315 sos_load_to_string(str5, load5);
>> 316 sos_load_to_string(str15, load15);
>> 317 sos_x86_videomem_printf(19, 34,
>> 318 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 319 "Kernel CPU %% (+ Idle): %s %s %s ",
>> 320 str1, str5, str15);
>> 321 sos_restore_IRQs(flags);
>> 322 }
328 } 323 }
329 324
330 325
331 !! 326
>> 327
>> 328
332 void sos_main(unsigned long magic, unsigned lo 329 void sos_main(unsigned long magic, unsigned long addr)
333 { 330 {
334 unsigned i; 331 unsigned i;
335 sos_paddr_t sos_kernel_core_base_paddr, sos_ 332 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
>> 333 struct sos_time tick_resolution;
336 334
337 335
338 336
339 337
340 multiboot_info_t *mbi; 338 multiboot_info_t *mbi;
341 mbi = (multiboot_info_t *) addr; 339 mbi = (multiboot_info_t *) addr;
342 340
343 341
344 sos_bochs_setup(); 342 sos_bochs_setup();
345 343
346 sos_x86_videomem_setup(); 344 sos_x86_videomem_setup();
347 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 345 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
348 346
349 347
350 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 348 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
351 349
352 sos_x86_videomem_printf(1, 0, 350 sos_x86_videomem_printf(1, 0,
353 SOS_X86_VIDEO_FG_Y 351 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
354 "Welcome From GRUB 352 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
355 "SOS", ',', !! 353 "SOS article 7", ',',
356 (unsigned)(mbi->me 354 (unsigned)(mbi->mem_upper >> 10) + 1,
357 (unsigned)mbi->mem 355 (unsigned)mbi->mem_upper);
358 else 356 else
359 357
360 sos_x86_videomem_printf(1, 0, 358 sos_x86_videomem_printf(1, 0,
361 SOS_X86_VIDEO_FG_Y 359 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
362 "Welcome to SOS"); !! 360 "Welcome to SOS article 7");
363 361
364 sos_bochs_putstring("Message in a bochs\n"); !! 362 sos_bochs_putstring("Message in a bochs: This is SOS article 7.\n");
365 363
366 364
367 sos_gdt_setup(); !! 365 sos_gdt_subsystem_setup();
368 sos_idt_setup(); !! 366 sos_idt_subsystem_setup();
369 367
370 368
371 sos_exceptions_setup(); !! 369 sos_exception_subsystem_setup();
372 sos_irq_setup(); !! 370 sos_irq_subsystem_setup();
373 371
374 372
375 sos_i8254_set_frequency(100); 373 sos_i8254_set_frequency(100);
376 374
>> 375
>> 376
>> 377 tick_resolution = (struct sos_time) { .sec=0, .nanosec=10000000UL };
>> 378 sos_time_subsysem_setup(& tick_resolution);
377 379
378 380
379 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) 381 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
380 { 382 {
381 sos_x86_videomem_putstring(20, 0, 383 sos_x86_videomem_putstring(20, 0,
382 SOS_X86_VIDEO 384 SOS_X86_VIDEO_FG_LTRED
383 | SOS_X86_V 385 | SOS_X86_VIDEO_BG_BLUE
384 | SOS_X86_V 386 | SOS_X86_VIDEO_FG_BLINKING,
385 "I'm not load 387 "I'm not loaded with Grub !");
386 388
387 for (;;) 389 for (;;)
388 continue; 390 continue;
389 } 391 }
390 392
>> 393
>> 394
>> 395
>> 396
391 397
392 sos_irq_set_routine(SOS_IRQ_TIMER, 398 sos_irq_set_routine(SOS_IRQ_TIMER,
393 clk_it); !! 399 clk_it);
394 !! 400
395 !! 401
396 asm volatile ("sti\n"); !! 402
>> 403
>> 404
397 405
398 406
399 407
400 sos_physmem_setup((mbi->mem_upper<<10) + (1< !! 408 sos_physmem_subsystem_setup((mbi->mem_upper<<10) + (1<<20),
401 & sos_kernel_core_base_pad !! 409 & sos_kernel_core_base_paddr,
402 & sos_kernel_core_top_padd !! 410 & sos_kernel_core_top_paddr);
403 411
404 412
405 413
406 414
407 415
408 416
409 417
410 if (sos_paging_setup(sos_kernel_core_base_pa !! 418 SOS_ASSERT_FATAL(SOS_OK ==
411 sos_kernel_core_top_pad !! 419 sos_paging_subsystem_setup(sos_kernel_core_base_paddr,
412 sos_bochs_printf("Could not setup paged me !! 420 sos_kernel_core_top_paddr));
413 sos_x86_videomem_printf(2, 0, !! 421
414 SOS_X86_VIDEO_FG_YEL !! 422
415 "Paged-memory mode i !! 423 sos_exception_set_routine(SOS_EXCEPT_PAGE_FAULT,
>> 424 pgflt_ex);
416 425
>> 426
>> 427
>> 428
417 429
418 if (sos_kmem_vmm_setup(sos_kernel_core_base_ !! 430 if (sos_kmem_vmm_subsystem_setup(sos_kernel_core_base_paddr,
419 sos_kernel_core_top_p !! 431 sos_kernel_core_top_paddr,
>> 432 bootstrap_stack_bottom,
>> 433 bootstrap_stack_bottom
>> 434 + bootstrap_stack_size))
420 sos_bochs_printf("Could not setup the Kern 435 sos_bochs_printf("Could not setup the Kernel virtual space allocator\n");
421 436
422 if (sos_kmalloc_setup()) !! 437 if (sos_kmalloc_subsystem_setup())
423 sos_bochs_printf("Could not setup the Kmal 438 sos_bochs_printf("Could not setup the Kmalloc subsystem\n");
424 439
425 !! 440
426 bn_test(); !! 441
>> 442
>> 443 sos_mm_context_subsystem_setup();
>> 444
>> 445
>> 446
>> 447
>> 448 sos_cpu_context_subsystem_setup();
>> 449
>> 450
>> 451
>> 452
>> 453 sos_swintr_subsystem_setup();
>> 454
>> 455
>> 456
>> 457
>> 458
>> 459
>> 460
>> 461 sos_thread_subsystem_setup(bootstrap_stack_bottom,
>> 462 bootstrap_stack_size);
>> 463
>> 464
>> 465 sos_sched_subsystem_setup();
>> 466
>> 467
>> 468 SOS_ASSERT_FATAL(sos_create_kernel_thread("idle", idle_thread, NULL,
>> 469 SOS_SCHED_PRIO_TS_LOWEST) != NULL);
>> 470
>> 471
>> 472 sos_load_subsystem_setup();
>> 473
>> 474
>> 475 SOS_ASSERT_FATAL(sos_create_kernel_thread("stat_thread", stat_thread,
>> 476 NULL,
>> 477 SOS_SCHED_PRIO_TS_LOWEST) != NULL);
>> 478
>> 479
>> 480
>> 481
>> 482
>> 483 sos_process_subsystem_setup();
427 484
428 <<
429 for (;;) <<
430 continue; <<
431 485
432 return; !! 486
>> 487
>> 488 asm volatile ("sti\n");
>> 489
>> 490
>> 491 extern void test_art7();
>> 492 test_art7();
>> 493
>> 494
>> 495 extern void MouseSim();
>> 496 MouseSim();
>> 497 test_thread();
>> 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 }