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
020 #include <bootstrap/multiboot.h> 021 #include <bootstrap/multiboot.h>
021 #include <hwcore/idt.h> 022 #include <hwcore/idt.h>
022 #include <hwcore/gdt.h> 023 #include <hwcore/gdt.h>
023 #include <hwcore/irq.h> 024 #include <hwcore/irq.h>
024 #include <hwcore/exception.h> 025 #include <hwcore/exception.h>
025 #include <hwcore/i8254.h> 026 #include <hwcore/i8254.h>
026 #include <sos/list.h> 027 #include <sos/list.h>
027 #include <sos/physmem.h> 028 #include <sos/physmem.h>
028 #include <hwcore/paging.h> 029 #include <hwcore/paging.h>
029 #include <hwcore/mm_context.h> !! 030 #include <sos/list.h>
030 #include <hwcore/swintr.h> <<
031 #include <sos/kmem_vmm.h> <<
032 #include <sos/kmalloc.h> <<
033 #include <sos/time.h> <<
034 #include <sos/thread.h> <<
035 #include <sos/process.h> <<
036 #include <sos/klibc.h> 031 #include <sos/klibc.h>
037 #include <sos/assert.h> 032 #include <sos/assert.h>
038 #include <drivers/x86_videomem.h> 033 #include <drivers/x86_videomem.h>
039 #include <drivers/bochs.h> 034 #include <drivers/bochs.h>
040 #include <sos/calcload.h> <<
041 035
042 036
043 037
044 038
045 void display_bits(unsigned char row, unsigned !! 039 static void display_bits(unsigned char row, unsigned char col,
046 unsigned char attribute, !! 040 unsigned char attribute,
047 sos_ui32_t integer) !! 041 sos_ui32_t integer)
048 { 042 {
049 int i; 043 int i;
050 044
051 for (i = 31 ; i >= 0 ; i--) 045 for (i = 31 ; i >= 0 ; i--)
052 { 046 {
053 047
054 int bit_i = (integer & (1 << i)); 048 int bit_i = (integer & (1 << i));
055 049
056 unsigned char ascii_code = bit_i?219:177 050 unsigned char ascii_code = bit_i?219:177;
057 sos_x86_videomem_putchar(row, col++, 051 sos_x86_videomem_putchar(row, col++,
058 attribute, 052 attribute,
059 ascii_code); 053 ascii_code);
060 } 054 }
061 } 055 }
062 056
063 057
064 058
065 static void clk_it(int intid) 059 static void clk_it(int intid)
066 { 060 {
067 static sos_ui32_t clock_count = 0; 061 static sos_ui32_t clock_count = 0;
068 062
069 display_bits(0, 48, 063 display_bits(0, 48,
070 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 064 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
071 clock_count); 065 clock_count);
072 clock_count++; 066 clock_count++;
073 067
074 <<
075 sos_time_do_tick(); <<
076 <<
077 <<
078 sos_sched_do_timer_tick(); <<
079 } 068 }
080 069
081 !! 070
082 !! 071 static void pgflt_ex(int exid)
083 <<
084 <<
085 <<
086 <<
087 <<
088 static void pgflt_ex(int intid, struct sos_cpu <<
089 { <<
090 static sos_ui32_t demand_paging_count = 0; <<
091 sos_vaddr_t faulting_vaddr = sos_cpu_contex <<
092 sos_paddr_t ppage_paddr; <<
093 <<
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 <<
107 if (! sos_kmem_vmm_is_valid_vaddr(faulting_v <<
108 { <<
109 <<
110 <<
111 sos_display_fatal_error("Unresolved page <<
112 sos_cpu_context_ <<
113 (unsigned)faulti <<
114 (unsigned)sos_cp <<
115 SOS_ASSERT_FATAL(! "Got page fault (note <<
116 } <<
117 <<
118 <<
119 <<
120 <<
121 <<
122 <<
123 <<
124 demand_paging_count ++; <<
125 display_bits(0, 0, <<
126 SOS_X86_VIDEO_FG_LTRED | SOS_X8 <<
127 demand_paging_count); <<
128 <<
129 <<
130 ppage_paddr = sos_physmem_ref_physpage_new(F <<
131 if (! ppage_paddr) <<
132 SOS_ASSERT_FATAL(! "TODO: implement swap. <<
133 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(pp <<
134 SO <<
135 FA <<
136 SO <<
137 | <<
138 | <<
139 sos_physmem_unref_physpage(ppage_paddr); <<
140 <<
141 <<
142 } <<
143 <<
144 <<
145 <<
146 <<
147 <<
148 <<
149 <<
150 <<
151 <<
152 struct thr_arg <<
153 { <<
154 char character; <<
155 int color; <<
156 <<
157 int col; <<
158 int row; <<
159 }; <<
160 <<
161 <<
162 static void demo_thread(void *arg) <<
163 { 072 {
164 struct thr_arg *thr_arg = (struct thr_arg*)a !! 073 sos_bochs_printf("Got page fault\n");
165 int progress = 0; !! 074 sos_x86_videomem_printf(10, 30,
166 !! 075 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
167 sos_bochs_printf("start %c", thr_arg->charac !! 076 "Got EXPECTED (?) Page fault ! But where ???");
168 while (1) !! 077 for (;;) ;
169 { <<
170 progress ++; <<
171 display_bits(thr_arg->row, thr_arg->col+ <<
172 <<
173 sos_bochs_putchar(thr_arg->character); <<
174 <<
175 <<
176 if ((random() % 100) == 0) <<
177 { <<
178 sos_bochs_printf("[37myield(%c)[m\ <<
179 sos_x86_videomem_putchar(thr_arg->ro <<
180 SOS_ASSERT_FATAL(SOS_OK == sos_threa <<
181 sos_x86_videomem_putchar(thr_arg->ro <<
182 } <<
183 <<
184 <<
185 else if ((random() % 200) == 0) <<
186 { <<
187 struct sos_time t = (struct sos_time <<
188 sos_bochs_printf("[37msleep1(%c)[m <<
189 sos_x86_videomem_putchar(thr_arg->ro <<
190 SOS_ASSERT_FATAL(SOS_OK == sos_threa <<
191 SOS_ASSERT_FATAL(sos_time_is_zero(& <<
192 sos_x86_videomem_putchar(thr_arg->ro <<
193 } <<
194 <<
195 <<
196 else if ((random() % 300) == 0) <<
197 { <<
198 struct sos_time t = (struct sos_time <<
199 sos_bochs_printf("[37msleep2(%c)[m <<
200 sos_x86_videomem_putchar(thr_arg->ro <<
201 SOS_ASSERT_FATAL(SOS_OK == sos_threa <<
202 SOS_ASSERT_FATAL(sos_time_is_zero(& <<
203 sos_x86_videomem_putchar(thr_arg->ro <<
204 } <<
205 <<
206 <<
207 } <<
208 } 078 }
209 079
210 !! 080 static void test_paging(sos_vaddr_t sos_kernel_core_top_vaddr)
211 static void test_thread() <<
212 { 081 {
213 !! 082
214 !! 083
215 static struct thr_arg arg_b, arg_c, arg_d, a !! 084 sos_vaddr_t vpage_code = SOS_PAGE_ALIGN_INF(test_paging);
216 sos_ui32_t flags; !! 085
217 !! 086
218 sos_disable_IRQs(flags); !! 087 sos_paddr_t ppage_new;
219 !! 088
220 arg_b = (struct thr_arg) { .character='b', . !! 089
221 sos_create_kernel_thread("YO[b]", demo_threa !! 090
222 !! 091 sos_vaddr_t vpage_tmp = sos_kernel_core_top_vaddr;
223 arg_c = (struct thr_arg) { .character='c', . <<
224 sos_create_kernel_thread("YO[c]", demo_threa <<
225 <<
226 arg_d = (struct thr_arg) { .character='d', . <<
227 sos_create_kernel_thread("YO[d]", demo_threa <<
228 <<
229 arg_e = (struct thr_arg) { .character='e', . <<
230 sos_create_kernel_thread("YO[e]", demo_threa <<
231 <<
232 arg_R = (struct thr_arg) { .character='R', . <<
233 sos_create_kernel_thread("YO[R]", demo_threa <<
234 092
235 arg_S = (struct thr_arg) { .character='S', . !! 093 unsigned i;
236 sos_create_kernel_thread("YO[S]", demo_threa <<
237 094
238 sos_restore_IRQs(flags); !! 095
239 } !! 096 sos_exception_set_routine(SOS_EXCEPT_PAGE_FAULT,
>> 097 pgflt_ex);
240 098
>> 099
>> 100
>> 101
>> 102
>> 103 sos_x86_videomem_printf(4, 0,
>> 104 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
>> 105 "Moving current code elsewhere in physical memory:");
241 106
242 <<
243 <<
244 <<
245 <<
246 static void idle_thread() <<
247 { <<
248 sos_ui32_t idle_twiddle = 0; <<
249 107
250 while (1) !! 108
>> 109 ppage_new = sos_physmem_ref_physpage_new(FALSE);
>> 110 if (! ppage_new)
251 { 111 {
252 !! 112
253 !! 113 sos_x86_videomem_putstring(20, 0,
254 asm("hlt\n"); !! 114 SOS_X86_VIDEO_FG_LTRED
255 !! 115 | SOS_X86_VIDEO_BG_BLUE,
256 idle_twiddle ++; !! 116 "test_paging : Cannot allocate page");
257 display_bits(0, 0, SOS_X86_VIDEO_FG_GREE !! 117 return;
258 idle_twiddle); <<
259 <<
260 <<
261 sos_thread_yield(); <<
262 } 118 }
263 } <<
264 <<
265 119
266 !! 120 sos_x86_videomem_printf(5, 0,
267 !! 121 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
268 !! 122 "Hello from the address 0x%x in physical memory",
269 static void stat_thread() !! 123 sos_paging_get_paddr(vpage_code));
270 { !! 124
271 while (1) !! 125 sos_x86_videomem_printf(6, 0,
>> 126 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 127 "Transfer vpage 0x%x: ppage 0x%x -> 0x%x (tmp vpage 0x%x)",
>> 128 vpage_code,
>> 129 sos_paging_get_paddr(vpage_code),
>> 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)
272 { 185 {
273 sos_ui32_t flags; !! 186 unsigned *pint = (unsigned *)SOS_PAGE_ALIGN_INF(i);
274 sos_ui32_t load1, load5, load15; !! 187 sos_bochs_printf("Test vaddr 0x%x : val=", (unsigned)pint);
275 char str1[11], str5[11], str15[11]; !! 188 sos_x86_videomem_printf(10, 0,
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 189 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
300 "User: %s %s %s !! 190 "Test vaddr 0x%x : val= ",
301 str1, str5, str1 !! 191 (unsigned)pint);
302 !! 192 sos_bochs_printf("0x%x\n", *pint);
303 sos_load_get_uratio(&load1, &load5, &loa !! 193 sos_x86_videomem_printf(10, 30,
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 194 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
309 "User CPU %%: %s !! 195 "0x%x ", *pint);
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 } 196 }
323 } <<
324 197
>> 198
>> 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);
>> 203 }
325 204
326 !! 205
327 <<
328 <<
329 void sos_main(unsigned long magic, unsigned lo 206 void sos_main(unsigned long magic, unsigned long addr)
330 { 207 {
331 unsigned i; 208 unsigned i;
332 sos_paddr_t sos_kernel_core_base_paddr, sos_ 209 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
333 struct sos_time tick_resolution; <<
334 210
335 211
336 212
337 213
338 multiboot_info_t *mbi; 214 multiboot_info_t *mbi;
339 mbi = (multiboot_info_t *) addr; 215 mbi = (multiboot_info_t *) addr;
340 216
341 217
342 sos_bochs_setup(); 218 sos_bochs_setup();
343 219
344 sos_x86_videomem_setup(); 220 sos_x86_videomem_setup();
345 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 221 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
346 222
347 223
348 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 224 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
349 225
350 sos_x86_videomem_printf(1, 0, 226 sos_x86_videomem_printf(1, 0,
351 SOS_X86_VIDEO_FG_Y 227 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
352 "Welcome From GRUB 228 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
353 "SOS article 7", ' !! 229 "SOS", ',',
354 (unsigned)(mbi->me 230 (unsigned)(mbi->mem_upper >> 10) + 1,
355 (unsigned)mbi->mem 231 (unsigned)mbi->mem_upper);
356 else 232 else
357 233
358 sos_x86_videomem_printf(1, 0, 234 sos_x86_videomem_printf(1, 0,
359 SOS_X86_VIDEO_FG_Y 235 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
360 "Welcome to SOS ar !! 236 "Welcome to SOS");
361 237
362 sos_bochs_putstring("Message in a bochs: Thi !! 238 sos_bochs_putstring("Message in a bochs\n");
363 239
364 240
365 sos_gdt_subsystem_setup(); !! 241 sos_gdt_setup();
366 sos_idt_subsystem_setup(); !! 242 sos_idt_setup();
367 243
368 244
369 sos_exception_subsystem_setup(); !! 245 sos_exceptions_setup();
370 sos_irq_subsystem_setup(); !! 246 sos_irq_setup();
371 247
372 248
373 sos_i8254_set_frequency(100); 249 sos_i8254_set_frequency(100);
374 250
375 <<
376 <<
377 tick_resolution = (struct sos_time) { .sec=0 <<
378 sos_time_subsysem_setup(& tick_resolution); <<
379 251
380 252
381 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) 253 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
382 { 254 {
383 sos_x86_videomem_putstring(20, 0, 255 sos_x86_videomem_putstring(20, 0,
384 SOS_X86_VIDEO 256 SOS_X86_VIDEO_FG_LTRED
385 | SOS_X86_V 257 | SOS_X86_VIDEO_BG_BLUE
386 | SOS_X86_V 258 | SOS_X86_VIDEO_FG_BLINKING,
387 "I'm not load 259 "I'm not loaded with Grub !");
388 260
389 for (;;) 261 for (;;)
390 continue; 262 continue;
391 } 263 }
392 264
393 <<
394 <<
395 <<
396 <<
397 265
398 sos_irq_set_routine(SOS_IRQ_TIMER, 266 sos_irq_set_routine(SOS_IRQ_TIMER,
399 clk_it); !! 267 clk_it);
400 !! 268
401 !! 269
402 !! 270 asm volatile ("sti\n");
403 <<
404 <<
405 271
406 272
407 273
408 sos_physmem_subsystem_setup((mbi->mem_upper< !! 274 sos_physmem_setup((mbi->mem_upper<<10) + (1<<20),
409 & sos_kernel_cor !! 275 & sos_kernel_core_base_paddr,
410 & sos_kernel_cor !! 276 & sos_kernel_core_top_paddr);
411 277
412 278
413 279
414 280
415 281
416 282
417 283
418 SOS_ASSERT_FATAL(SOS_OK == !! 284 if (sos_paging_setup(sos_kernel_core_base_paddr,
419 sos_paging_subsystem_setup( !! 285 sos_kernel_core_top_paddr))
420 !! 286 sos_bochs_printf("Could not setup paged memory mode\n");
421 !! 287 sos_x86_videomem_printf(2, 0,
422 !! 288 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
423 sos_exception_set_routine(SOS_EXCEPT_PAGE_FA !! 289 "Paged-memory mode is activated");
424 pgflt_ex); !! 290
425 !! 291 test_paging(sos_kernel_core_top_paddr);
426 !! 292
427 !! 293
428 !! 294 for (;;)
429 !! 295 continue;
430 if (sos_kmem_vmm_subsystem_setup(sos_kernel_ <<
431 sos_kernel_ <<
432 bootstrap_s <<
433 bootstrap_s <<
434 + bootstrap <<
435 sos_bochs_printf("Could not setup the Kern <<
436 <<
437 if (sos_kmalloc_subsystem_setup()) <<
438 sos_bochs_printf("Could not setup the Kmal <<
439 296
440 !! 297 return;
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_b <<
462 bootstrap_stack_s <<
463 <<
464 <<
465 sos_sched_subsystem_setup(); <<
466 <<
467 <<
468 SOS_ASSERT_FATAL(sos_create_kernel_thread("i <<
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 <<
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 !\ <<
512 sos_thread_exit(); <<
513 SOS_FATAL_ERROR("No trespassing !"); <<
514 } 298 }