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