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 #include <bootstrap/multiboot.h> 020 #include <bootstrap/multiboot.h>
021 #include <hwcore/idt.h> 021 #include <hwcore/idt.h>
022 #include <hwcore/gdt.h> 022 #include <hwcore/gdt.h>
023 #include <hwcore/irq.h> 023 #include <hwcore/irq.h>
024 #include <hwcore/exception.h> 024 #include <hwcore/exception.h>
025 #include <hwcore/i8254.h> 025 #include <hwcore/i8254.h>
026 #include <sos/list.h> 026 #include <sos/list.h>
027 #include <sos/physmem.h> 027 #include <sos/physmem.h>
028 #include <hwcore/paging.h> 028 #include <hwcore/paging.h>
029 #include <hwcore/mm_context.h> <<
030 #include <hwcore/swintr.h> <<
031 #include <sos/kmem_vmm.h> 029 #include <sos/kmem_vmm.h>
032 #include <sos/kmalloc.h> 030 #include <sos/kmalloc.h>
033 #include <sos/time.h> 031 #include <sos/time.h>
034 #include <sos/thread.h> 032 #include <sos/thread.h>
035 #include <sos/process.h> <<
036 #include <sos/klibc.h> 033 #include <sos/klibc.h>
037 #include <sos/assert.h> 034 #include <sos/assert.h>
038 #include <drivers/x86_videomem.h> 035 #include <drivers/x86_videomem.h>
039 #include <drivers/bochs.h> 036 #include <drivers/bochs.h>
040 #include <sos/calcload.h> <<
041 037
042 038
043 039
044 040
045 void display_bits(unsigned char row, unsigned 041 void display_bits(unsigned char row, unsigned char col,
046 unsigned char attribute, 042 unsigned char attribute,
047 sos_ui32_t integer) 043 sos_ui32_t integer)
048 { 044 {
049 int i; 045 int i;
050 046
051 for (i = 31 ; i >= 0 ; i--) 047 for (i = 31 ; i >= 0 ; i--)
052 { 048 {
053 049
054 int bit_i = (integer & (1 << i)); 050 int bit_i = (integer & (1 << i));
055 051
056 unsigned char ascii_code = bit_i?219:177 052 unsigned char ascii_code = bit_i?219:177;
057 sos_x86_videomem_putchar(row, col++, 053 sos_x86_videomem_putchar(row, col++,
058 attribute, 054 attribute,
059 ascii_code); 055 ascii_code);
060 } 056 }
061 } 057 }
062 058
063 059
064 060
065 static void clk_it(int intid) 061 static void clk_it(int intid)
066 { 062 {
067 static sos_ui32_t clock_count = 0; 063 static sos_ui32_t clock_count = 0;
068 064
069 display_bits(0, 48, 065 display_bits(0, 48,
070 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 066 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
071 clock_count); 067 clock_count);
072 clock_count++; 068 clock_count++;
073 069
074 070
075 sos_time_do_tick(); 071 sos_time_do_tick();
076 <<
077 <<
078 sos_sched_do_timer_tick(); <<
079 } 072 }
080 073
081 074
082 075
083 076
084 077
085 078
>> 079
>> 080 static void dump_backtrace(const struct sos_cpu_state *cpu_state,
>> 081 sos_vaddr_t stack_bottom,
>> 082 sos_size_t stack_size,
>> 083 sos_bool_t on_console,
>> 084 sos_bool_t on_bochs)
>> 085 {
>> 086 static void backtracer(sos_vaddr_t PC,
>> 087 sos_vaddr_t params,
>> 088 sos_ui32_t depth,
>> 089 void *custom_arg)
>> 090 {
>> 091 sos_ui32_t invalid = 0xffffffff, *arg1, *arg2, *arg3, *arg4;
>> 092
>> 093
>> 094
>> 095
>> 096
>> 097 arg1 = (sos_ui32_t*)params;
>> 098 arg2 = (sos_ui32_t*)(params+4);
>> 099 arg3 = (sos_ui32_t*)(params+8);
>> 100 arg4 = (sos_ui32_t*)(params+12);
>> 101
>> 102
>> 103
>> 104 #define INTERVAL_OK(b,v,u) ( ((b) <= (sos_vaddr_t)(v)) \
>> 105 && ((sos_vaddr_t)(v) < (u)) )
>> 106 if (!INTERVAL_OK(stack_bottom, arg1, stack_bottom + stack_size))
>> 107 arg1 = &invalid;
>> 108 if (!INTERVAL_OK(stack_bottom, arg2, stack_bottom + stack_size))
>> 109 arg2 = &invalid;
>> 110 if (!INTERVAL_OK(stack_bottom, arg3, stack_bottom + stack_size))
>> 111 arg3 = &invalid;
>> 112 if (!INTERVAL_OK(stack_bottom, arg4, stack_bottom + stack_size))
>> 113 arg4 = &invalid;
>> 114
>> 115
>> 116 if (on_bochs)
>> 117 sos_bochs_printf("[%d] PC=0x%x arg1=0x%x arg2=0x%x arg3=0x%x\n",
>> 118 (unsigned)depth, (unsigned)PC,
>> 119 (unsigned)*arg1, (unsigned)*arg2,
>> 120 (unsigned)*arg3);
>> 121
>> 122 if (on_console)
>> 123 sos_x86_videomem_printf(23-depth, 3,
>> 124 SOS_X86_VIDEO_BG_BLUE
>> 125 | SOS_X86_VIDEO_FG_LTGREEN,
>> 126 "[%d] PC=0x%x arg1=0x%x arg2=0x%x arg3=0x%x arg4=0x%x",
>> 127 (unsigned)depth, PC,
>> 128 (unsigned)*arg1, (unsigned)*arg2,
>> 129 (unsigned)*arg3, (unsigned)*arg4);
>> 130
>> 131 }
>> 132
>> 133 sos_backtrace(cpu_state, 15, stack_bottom, stack_size, backtracer, NULL);
>> 134 }
>> 135
086 136
087 137
088 static void pgflt_ex(int intid, struct sos_cpu !! 138 static void pgflt_ex(int intid, const struct sos_cpu_state *ctxt)
089 { 139 {
090 static sos_ui32_t demand_paging_count = 0; 140 static sos_ui32_t demand_paging_count = 0;
091 sos_vaddr_t faulting_vaddr = sos_cpu_contex !! 141 sos_vaddr_t faulting_vaddr = sos_cpu_context_get_EX_faulting_vaddr(ctxt);
092 sos_paddr_t ppage_paddr; 142 sos_paddr_t ppage_paddr;
093 143
094 if (sos_cpu_context_is_in_user_mode(ctxt)) <<
095 { <<
096 <<
097 <<
098 sos_bochs_printf("Unresolved USER page F <<
099 sos_cpu_context_get_PC( <<
100 (unsigned)faulting_vadd <<
101 (unsigned)sos_cpu_conte <<
102 sos_bochs_printf("Terminating User threa <<
103 sos_thread_exit(); <<
104 } <<
105 <<
106 144
107 if (! sos_kmem_vmm_is_valid_vaddr(faulting_v 145 if (! sos_kmem_vmm_is_valid_vaddr(faulting_vaddr))
108 { 146 {
109 147
110 148
>> 149 dump_backtrace(ctxt,
>> 150 bootstrap_stack_bottom,
>> 151 bootstrap_stack_size,
>> 152 TRUE, TRUE);
111 sos_display_fatal_error("Unresolved page 153 sos_display_fatal_error("Unresolved page Fault at instruction 0x%x on access to address 0x%x (info=%x)!",
112 sos_cpu_context_ 154 sos_cpu_context_get_PC(ctxt),
113 (unsigned)faulti 155 (unsigned)faulting_vaddr,
114 (unsigned)sos_cp 156 (unsigned)sos_cpu_context_get_EX_info(ctxt));
115 SOS_ASSERT_FATAL(! "Got page fault (note 157 SOS_ASSERT_FATAL(! "Got page fault (note: demand paging is disabled)");
116 } 158 }
117 159
118 160
119 161
120 !! 162
121 163
122 164
123 165
124 demand_paging_count ++; 166 demand_paging_count ++;
125 display_bits(0, 0, 167 display_bits(0, 0,
126 SOS_X86_VIDEO_FG_LTRED | SOS_X8 168 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
127 demand_paging_count); 169 demand_paging_count);
128 170
129 171
130 ppage_paddr = sos_physmem_ref_physpage_new(F 172 ppage_paddr = sos_physmem_ref_physpage_new(FALSE);
131 if (! ppage_paddr) 173 if (! ppage_paddr)
132 SOS_ASSERT_FATAL(! "TODO: implement swap. 174 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(pp 175 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(ppage_paddr,
134 SO 176 SOS_PAGE_ALIGN_INF(faulting_vaddr),
135 FA 177 FALSE,
136 SO 178 SOS_VM_MAP_PROT_READ
137 | 179 | SOS_VM_MAP_PROT_WRITE
138 | 180 | SOS_VM_MAP_ATOMIC));
139 sos_physmem_unref_physpage(ppage_paddr); 181 sos_physmem_unref_physpage(ppage_paddr);
140 182
141 183
142 } 184 }
143 185
144 186
145 187
146 188
147 189
148 190
149 191
150 192
151 193
152 struct thr_arg 194 struct thr_arg
153 { 195 {
154 char character; 196 char character;
155 int color; 197 int color;
156 198
157 int col; 199 int col;
158 int row; 200 int row;
159 }; 201 };
160 202
161 203
162 static void demo_thread(void *arg) 204 static void demo_thread(void *arg)
163 { 205 {
164 struct thr_arg *thr_arg = (struct thr_arg*)a 206 struct thr_arg *thr_arg = (struct thr_arg*)arg;
165 int progress = 0; 207 int progress = 0;
166 208
167 sos_bochs_printf("start %c", thr_arg->charac 209 sos_bochs_printf("start %c", thr_arg->character);
168 while (1) 210 while (1)
169 { 211 {
170 progress ++; 212 progress ++;
171 display_bits(thr_arg->row, thr_arg->col+ 213 display_bits(thr_arg->row, thr_arg->col+1, thr_arg->color, progress);
172 214
173 sos_bochs_putchar(thr_arg->character); 215 sos_bochs_putchar(thr_arg->character);
174 216
175 217
176 if ((random() % 100) == 0) 218 if ((random() % 100) == 0)
177 { 219 {
178 sos_bochs_printf("[37myield(%c)[m\ 220 sos_bochs_printf("[37myield(%c)[m\n", thr_arg->character);
179 sos_x86_videomem_putchar(thr_arg->ro 221 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'Y');
180 SOS_ASSERT_FATAL(SOS_OK == sos_threa 222 SOS_ASSERT_FATAL(SOS_OK == sos_thread_yield());
181 sos_x86_videomem_putchar(thr_arg->ro 223 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'R');
182 } 224 }
183 225
184 226
185 else if ((random() % 200) == 0) 227 else if ((random() % 200) == 0)
186 { 228 {
187 struct sos_time t = (struct sos_time 229 struct sos_time t = (struct sos_time){ .sec=0, .nanosec=50000000 };
188 sos_bochs_printf("[37msleep1(%c)[m 230 sos_bochs_printf("[37msleep1(%c)[m\n", thr_arg->character);
189 sos_x86_videomem_putchar(thr_arg->ro 231 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 's');
190 SOS_ASSERT_FATAL(SOS_OK == sos_threa 232 SOS_ASSERT_FATAL(SOS_OK == sos_thread_sleep(& t));
191 SOS_ASSERT_FATAL(sos_time_is_zero(& 233 SOS_ASSERT_FATAL(sos_time_is_zero(& t));
192 sos_x86_videomem_putchar(thr_arg->ro 234 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'R');
193 } 235 }
194 236
195 237
196 else if ((random() % 300) == 0) 238 else if ((random() % 300) == 0)
197 { 239 {
198 struct sos_time t = (struct sos_time 240 struct sos_time t = (struct sos_time){ .sec=0, .nanosec=300000000 };
199 sos_bochs_printf("[37msleep2(%c)[m 241 sos_bochs_printf("[37msleep2(%c)[m\n", thr_arg->character);
200 sos_x86_videomem_putchar(thr_arg->ro 242 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'S');
201 SOS_ASSERT_FATAL(SOS_OK == sos_threa 243 SOS_ASSERT_FATAL(SOS_OK == sos_thread_sleep(& t));
202 SOS_ASSERT_FATAL(sos_time_is_zero(& 244 SOS_ASSERT_FATAL(sos_time_is_zero(& t));
203 sos_x86_videomem_putchar(thr_arg->ro 245 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'R');
204 } 246 }
205 247
206 248
207 } 249 }
208 } 250 }
209 251
210 252
211 static void test_thread() 253 static void test_thread()
212 { 254 {
213 255
214 256
215 static struct thr_arg arg_b, arg_c, arg_d, a 257 static struct thr_arg arg_b, arg_c, arg_d, arg_e, arg_R, arg_S;
216 sos_ui32_t flags; 258 sos_ui32_t flags;
217 259
218 sos_disable_IRQs(flags); 260 sos_disable_IRQs(flags);
219 261
220 arg_b = (struct thr_arg) { .character='b', . 262 arg_b = (struct thr_arg) { .character='b', .col=0, .row=21, .color=0x14 };
221 sos_create_kernel_thread("YO[b]", demo_threa !! 263 sos_create_kernel_thread("YO[b]", demo_thread, (void*)&arg_b);
222 264
223 arg_c = (struct thr_arg) { .character='c', . 265 arg_c = (struct thr_arg) { .character='c', .col=46, .row=21, .color=0x14 };
224 sos_create_kernel_thread("YO[c]", demo_threa !! 266 sos_create_kernel_thread("YO[c]", demo_thread, (void*)&arg_c);
225 267
226 arg_d = (struct thr_arg) { .character='d', . 268 arg_d = (struct thr_arg) { .character='d', .col=0, .row=20, .color=0x14 };
227 sos_create_kernel_thread("YO[d]", demo_threa !! 269 sos_create_kernel_thread("YO[d]", demo_thread, (void*)&arg_d);
228 270
229 arg_e = (struct thr_arg) { .character='e', . 271 arg_e = (struct thr_arg) { .character='e', .col=0, .row=19, .color=0x14 };
230 sos_create_kernel_thread("YO[e]", demo_threa !! 272 sos_create_kernel_thread("YO[e]", demo_thread, (void*)&arg_e);
231 273
232 arg_R = (struct thr_arg) { .character='R', . 274 arg_R = (struct thr_arg) { .character='R', .col=0, .row=17, .color=0x1c };
233 sos_create_kernel_thread("YO[R]", demo_threa !! 275 sos_create_kernel_thread("YO[R]", demo_thread, (void*)&arg_R);
234 276
235 arg_S = (struct thr_arg) { .character='S', . 277 arg_S = (struct thr_arg) { .character='S', .col=0, .row=16, .color=0x1c };
236 sos_create_kernel_thread("YO[S]", demo_threa !! 278 sos_create_kernel_thread("YO[S]", demo_thread, (void*)&arg_S);
237 279
238 sos_restore_IRQs(flags); 280 sos_restore_IRQs(flags);
239 } 281 }
240 282
241 283
242 284
243 285
244 286
245 287
246 static void idle_thread() 288 static void idle_thread()
247 { 289 {
248 sos_ui32_t idle_twiddle = 0; 290 sos_ui32_t idle_twiddle = 0;
249 291
250 while (1) 292 while (1)
251 { 293 {
252 294
253 295
254 asm("hlt\n"); 296 asm("hlt\n");
255 297
256 idle_twiddle ++; 298 idle_twiddle ++;
257 display_bits(0, 0, SOS_X86_VIDEO_FG_GREE 299 display_bits(0, 0, SOS_X86_VIDEO_FG_GREEN | SOS_X86_VIDEO_BG_BLUE,
258 idle_twiddle); 300 idle_twiddle);
259 301
260 302
261 sos_thread_yield(); 303 sos_thread_yield();
262 } 304 }
263 } 305 }
264 306
265 307
266 308
267 <<
268 <<
269 static void stat_thread() <<
270 { <<
271 while (1) <<
272 { <<
273 sos_ui32_t flags; <<
274 sos_ui32_t load1, load5, load15; <<
275 char str1[11], str5[11], str15[11]; <<
276 struct sos_time t; <<
277 t.sec = 1; <<
278 t.nanosec = 0; <<
279 <<
280 sos_thread_sleep(& t); <<
281 <<
282 sos_disable_IRQs(flags); <<
283 <<
284 <<
285 sos_load_get_sload(&load1, &load5, &load <<
286 sos_load_to_string(str1, load1); <<
287 sos_load_to_string(str5, load5); <<
288 sos_load_to_string(str15, load15); <<
289 sos_x86_videomem_printf(16, 34, <<
290 SOS_X86_VIDEO_FG <<
291 "Kernel (- Idle) <<
292 str1, str5, str1 <<
293 <<
294 sos_load_get_uload(&load1, &load5, &load <<
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 <<
300 "User: %s %s %s <<
301 str1, str5, str1 <<
302 <<
303 sos_load_get_uratio(&load1, &load5, &loa <<
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 <<
309 "User CPU %%: %s <<
310 str1, str5, str1 <<
311 <<
312 <<
313 sos_load_get_sratio(&load1, &load5, &loa <<
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 <<
319 "Kernel CPU %% ( <<
320 str1, str5, str1 <<
321 sos_restore_IRQs(flags); <<
322 } <<
323 } <<
324 <<
325 <<
326 <<
327 309
328 310
329 void sos_main(unsigned long magic, unsigned lo 311 void sos_main(unsigned long magic, unsigned long addr)
330 { 312 {
331 unsigned i; 313 unsigned i;
332 sos_paddr_t sos_kernel_core_base_paddr, sos_ 314 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
333 struct sos_time tick_resolution; 315 struct sos_time tick_resolution;
334 316
335 317
336 318
337 319
338 multiboot_info_t *mbi; 320 multiboot_info_t *mbi;
339 mbi = (multiboot_info_t *) addr; 321 mbi = (multiboot_info_t *) addr;
340 322
341 323
342 sos_bochs_setup(); 324 sos_bochs_setup();
343 325
344 sos_x86_videomem_setup(); 326 sos_x86_videomem_setup();
345 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 327 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
346 328
347 329
348 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 330 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
349 331
350 sos_x86_videomem_printf(1, 0, 332 sos_x86_videomem_printf(1, 0,
351 SOS_X86_VIDEO_FG_Y 333 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
352 "Welcome From GRUB 334 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
353 "SOS article 7", ' !! 335 "SOS article 6.5", ',',
354 (unsigned)(mbi->me 336 (unsigned)(mbi->mem_upper >> 10) + 1,
355 (unsigned)mbi->mem 337 (unsigned)mbi->mem_upper);
356 else 338 else
357 339
358 sos_x86_videomem_printf(1, 0, 340 sos_x86_videomem_printf(1, 0,
359 SOS_X86_VIDEO_FG_Y 341 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
360 "Welcome to SOS ar !! 342 "Welcome to SOS article 6.5");
361 343
362 sos_bochs_putstring("Message in a bochs: Thi !! 344 sos_bochs_putstring("Message in a bochs: This is SOS article 6.5.\n");
363 345
364 346
365 sos_gdt_subsystem_setup(); 347 sos_gdt_subsystem_setup();
366 sos_idt_subsystem_setup(); 348 sos_idt_subsystem_setup();
367 349
368 350
369 sos_exception_subsystem_setup(); 351 sos_exception_subsystem_setup();
370 sos_irq_subsystem_setup(); 352 sos_irq_subsystem_setup();
371 353
372 354
373 sos_i8254_set_frequency(100); 355 sos_i8254_set_frequency(100);
374 356
375 357
376 358
377 tick_resolution = (struct sos_time) { .sec=0 359 tick_resolution = (struct sos_time) { .sec=0, .nanosec=10000000UL };
378 sos_time_subsysem_setup(& tick_resolution); 360 sos_time_subsysem_setup(& tick_resolution);
379 361
380 362
381 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) 363 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
382 { 364 {
383 sos_x86_videomem_putstring(20, 0, 365 sos_x86_videomem_putstring(20, 0,
384 SOS_X86_VIDEO 366 SOS_X86_VIDEO_FG_LTRED
385 | SOS_X86_V 367 | SOS_X86_VIDEO_BG_BLUE
386 | SOS_X86_V 368 | SOS_X86_VIDEO_FG_BLINKING,
387 "I'm not load 369 "I'm not loaded with Grub !");
388 370
389 for (;;) 371 for (;;)
390 continue; 372 continue;
391 } 373 }
392 374
393 375
394 376
395 377
396 378
397 379
398 sos_irq_set_routine(SOS_IRQ_TIMER, 380 sos_irq_set_routine(SOS_IRQ_TIMER,
399 clk_it); 381 clk_it);
400 382
401 383
402 384
403 385
404 386
405 387
406 388
407 389
408 sos_physmem_subsystem_setup((mbi->mem_upper< 390 sos_physmem_subsystem_setup((mbi->mem_upper<<10) + (1<<20),
409 & sos_kernel_cor 391 & sos_kernel_core_base_paddr,
410 & sos_kernel_cor 392 & sos_kernel_core_top_paddr);
411 393
412 394
413 395
414 396
415 397
416 398
417 399
418 SOS_ASSERT_FATAL(SOS_OK == 400 SOS_ASSERT_FATAL(SOS_OK ==
419 sos_paging_subsystem_setup( 401 sos_paging_subsystem_setup(sos_kernel_core_base_paddr,
420 402 sos_kernel_core_top_paddr));
421 403
422 404
423 sos_exception_set_routine(SOS_EXCEPT_PAGE_FA 405 sos_exception_set_routine(SOS_EXCEPT_PAGE_FAULT,
424 pgflt_ex); 406 pgflt_ex);
425 407
426 408
427 409
428 410
429 411
430 if (sos_kmem_vmm_subsystem_setup(sos_kernel_ 412 if (sos_kmem_vmm_subsystem_setup(sos_kernel_core_base_paddr,
431 sos_kernel_ 413 sos_kernel_core_top_paddr,
432 bootstrap_s 414 bootstrap_stack_bottom,
433 bootstrap_s 415 bootstrap_stack_bottom
434 + bootstrap 416 + bootstrap_stack_size))
435 sos_bochs_printf("Could not setup the Kern 417 sos_bochs_printf("Could not setup the Kernel virtual space allocator\n");
436 418
437 if (sos_kmalloc_subsystem_setup()) 419 if (sos_kmalloc_subsystem_setup())
438 sos_bochs_printf("Could not setup the Kmal 420 sos_bochs_printf("Could not setup the Kmalloc subsystem\n");
439 421
440 422
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 423
458 424
459 425
460 426
461 sos_thread_subsystem_setup(bootstrap_stack_b 427 sos_thread_subsystem_setup(bootstrap_stack_bottom,
462 bootstrap_stack_s 428 bootstrap_stack_size);
463 429
464 430
465 sos_sched_subsystem_setup(); 431 sos_sched_subsystem_setup();
466 432
467 433
468 SOS_ASSERT_FATAL(sos_create_kernel_thread("i !! 434 SOS_ASSERT_FATAL(sos_create_kernel_thread("idle", idle_thread, NULL) != NULL);
469 SO <<
470 <<
471 <<
472 sos_load_subsystem_setup(); <<
473 <<
474 <<
475 SOS_ASSERT_FATAL(sos_create_kernel_thread("s <<
476 NU <<
477 SO <<
478 <<
479 <<
480 <<
481 <<
482 <<
483 sos_process_subsystem_setup(); <<
484 <<
485 435
486 436
487 437
488 asm volatile ("sti\n"); 438 asm volatile ("sti\n");
489 439
490 <<
491 extern void test_art7(); <<
492 test_art7(); <<
493 440
494 441
495 extern void MouseSim(); 442 extern void MouseSim();
496 MouseSim(); 443 MouseSim();
497 test_thread(); 444 test_thread();
498 445
499 446
500 447
501 448
502 449
503 450
504 451
505 452
506 453
507 454
508 455
509 456
510 457
511 sos_bochs_printf("Bye from primary thread !\ 458 sos_bochs_printf("Bye from primary thread !\n");
512 sos_thread_exit(); 459 sos_thread_exit();
513 SOS_FATAL_ERROR("No trespassing !"); 460 SOS_FATAL_ERROR("No trespassing !");
514 } 461 }