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/mm_context.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> 029 #include <sos/klibc.h>
037 #include <sos/assert.h> 030 #include <sos/assert.h>
038 #include <drivers/x86_videomem.h> 031 #include <drivers/x86_videomem.h>
039 #include <drivers/bochs.h> 032 #include <drivers/bochs.h>
040 #include <sos/calcload.h> <<
041 033
042 034
043 035
044 036
045 void display_bits(unsigned char row, unsigned !! 037 static void display_bits(unsigned char row, unsigned char col,
046 unsigned char attribute, !! 038 unsigned char attribute,
047 sos_ui32_t integer) !! 039 sos_ui32_t integer)
048 { 040 {
049 int i; 041 int i;
050 042
051 for (i = 31 ; i >= 0 ; i--) 043 for (i = 31 ; i >= 0 ; i--)
052 { 044 {
053 045
054 int bit_i = (integer & (1 << i)); 046 int bit_i = (integer & (1 << i));
055 047
056 unsigned char ascii_code = bit_i?219:177 048 unsigned char ascii_code = bit_i?219:177;
057 sos_x86_videomem_putchar(row, col++, 049 sos_x86_videomem_putchar(row, col++,
058 attribute, 050 attribute,
059 ascii_code); 051 ascii_code);
060 } 052 }
061 } 053 }
062 054
063 055
064 056
065 static void clk_it(int intid) 057 static void clk_it(int intid)
066 { 058 {
067 static sos_ui32_t clock_count = 0; 059 static sos_ui32_t clock_count = 0;
068 060
069 display_bits(0, 48, 061 display_bits(0, 48,
070 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 062 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
071 clock_count); 063 clock_count);
072 clock_count++; 064 clock_count++;
073 065
074 <<
075 sos_time_do_tick(); <<
076 <<
077 <<
078 sos_sched_do_timer_tick(); <<
079 } 066 }
080 067
081 !! 068 #define MY_PPAGE_NUM_INT 511
082 !! 069 struct my_ppage
083 <<
084 <<
085 <<
086 <<
087 <<
088 static void pgflt_ex(int intid, struct sos_cpu <<
089 { 070 {
090 static sos_ui32_t demand_paging_count = 0; !! 071 sos_ui32_t before[MY_PPAGE_NUM_INT];
091 sos_vaddr_t faulting_vaddr = sos_cpu_contex !! 072 struct my_ppage *prev, *next;
092 sos_paddr_t ppage_paddr; !! 073 sos_ui32_t after[MY_PPAGE_NUM_INT];
093 !! 074 };
094 if (sos_cpu_context_is_in_user_mode(ctxt)) !! 075
095 { !! 076 static void test_physmem()
096 !! 077 {
097 !! 078
098 sos_bochs_printf("Unresolved USER page F !! 079 struct my_ppage *ppage_list, *my_ppage;
099 sos_cpu_context_get_PC( !! 080 sos_count_t num_alloc_ppages = 0, num_free_ppages = 0;
100 (unsigned)faulting_vadd !! 081
101 (unsigned)sos_cpu_conte !! 082 ppage_list = NULL;
102 sos_bochs_printf("Terminating User threa !! 083 while ((my_ppage = (struct my_ppage*)sos_physmem_ref_physpage_new(FALSE))
103 sos_thread_exit(); !! 084 != NULL)
104 } <<
105 <<
106 <<
107 if (! sos_kmem_vmm_is_valid_vaddr(faulting_v <<
108 { 085 {
109 !! 086 int i;
110 !! 087 num_alloc_ppages++;
111 sos_display_fatal_error("Unresolved page !! 088
112 sos_cpu_context_ !! 089
113 (unsigned)faulti !! 090 sos_x86_videomem_printf(2, 0,
114 (unsigned)sos_cp !! 091 SOS_X86_VIDEO_FG_YELLOW
115 SOS_ASSERT_FATAL(! "Got page fault (note !! 092 | SOS_X86_VIDEO_BG_BLUE,
116 } !! 093 "Could allocate %d pages ",
117 !! 094 num_alloc_ppages);
118 !! 095
119 !! 096
120 !! 097 for (i = 0 ; i < MY_PPAGE_NUM_INT ; i++)
121 !! 098 my_ppage->before[i] = my_ppage->after[i] = (sos_ui32_t)my_ppage;
122 !! 099
123 !! 100
124 demand_paging_count ++; !! 101 list_add_tail(ppage_list, my_ppage);
125 display_bits(0, 0, !! 102 }
126 SOS_X86_VIDEO_FG_LTRED | SOS_X8 !! 103
127 demand_paging_count); !! 104
128 !! 105 while ((my_ppage = list_pop_head(ppage_list)) != NULL)
129 !! 106 {
130 ppage_paddr = sos_physmem_ref_physpage_new(F !! 107
131 if (! ppage_paddr) !! 108
132 SOS_ASSERT_FATAL(! "TODO: implement swap. !! 109 int i;
133 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(pp !! 110 for (i = 0 ; i < MY_PPAGE_NUM_INT ; i++)
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 { <<
164 struct thr_arg *thr_arg = (struct thr_arg*)a <<
165 int progress = 0; <<
166 <<
167 sos_bochs_printf("start %c", thr_arg->charac <<
168 while (1) <<
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 { 111 {
187 struct sos_time t = (struct sos_time !! 112
188 sos_bochs_printf("[37msleep1(%c)[m !! 113 if ((my_ppage->before[i] != (sos_ui32_t)my_ppage)
189 sos_x86_videomem_putchar(thr_arg->ro !! 114 || (my_ppage->after[i] != (sos_ui32_t)my_ppage))
190 SOS_ASSERT_FATAL(SOS_OK == sos_threa !! 115 {
191 SOS_ASSERT_FATAL(sos_time_is_zero(& !! 116
192 sos_x86_videomem_putchar(thr_arg->ro !! 117 sos_x86_videomem_putstring(20, 0,
>> 118 SOS_X86_VIDEO_FG_LTRED
>> 119 | SOS_X86_VIDEO_BG_BLUE,
>> 120 "Page overwritten");
>> 121 return;
>> 122 }
193 } 123 }
194 124
195 !! 125
196 else if ((random() % 300) == 0) !! 126 if (sos_physmem_unref_physpage((sos_paddr_t)my_ppage) < 0)
197 { 127 {
198 struct sos_time t = (struct sos_time !! 128
199 sos_bochs_printf("[37msleep2(%c)[m !! 129 sos_x86_videomem_putstring(20, 0,
200 sos_x86_videomem_putchar(thr_arg->ro !! 130 SOS_X86_VIDEO_FG_LTRED
201 SOS_ASSERT_FATAL(SOS_OK == sos_threa !! 131 | SOS_X86_VIDEO_BG_BLUE,
202 SOS_ASSERT_FATAL(sos_time_is_zero(& !! 132 "Cannot release page");
203 sos_x86_videomem_putchar(thr_arg->ro !! 133 return;
204 } 134 }
205 135
206 !! 136
207 } !! 137 num_free_ppages ++;
208 } !! 138 sos_x86_videomem_printf(2, 0,
209 !! 139 SOS_X86_VIDEO_FG_YELLOW
210 !! 140 | SOS_X86_VIDEO_BG_BLUE,
211 static void test_thread() !! 141 "Could free %d pages ",
212 { !! 142 num_free_ppages);
213 <<
214 <<
215 static struct thr_arg arg_b, arg_c, arg_d, a <<
216 sos_ui32_t flags; <<
217 <<
218 sos_disable_IRQs(flags); <<
219 <<
220 arg_b = (struct thr_arg) { .character='b', . <<
221 sos_create_kernel_thread("YO[b]", demo_threa <<
222 <<
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 <<
235 arg_S = (struct thr_arg) { .character='S', . <<
236 sos_create_kernel_thread("YO[S]", demo_threa <<
237 <<
238 sos_restore_IRQs(flags); <<
239 } <<
240 <<
241 <<
242 <<
243 <<
244 <<
245 <<
246 static void idle_thread() <<
247 { <<
248 sos_ui32_t idle_twiddle = 0; <<
249 <<
250 while (1) <<
251 { <<
252 <<
253 <<
254 asm("hlt\n"); <<
255 <<
256 idle_twiddle ++; <<
257 display_bits(0, 0, SOS_X86_VIDEO_FG_GREE <<
258 idle_twiddle); <<
259 <<
260 <<
261 sos_thread_yield(); <<
262 } 143 }
263 } <<
264 144
>> 145
>> 146 sos_x86_videomem_printf(2, 0,
>> 147 SOS_X86_VIDEO_FG_LTGREEN
>> 148 | SOS_X86_VIDEO_BG_BLUE,
>> 149 "Could allocate %d bytes, could free %d bytes ",
>> 150 num_alloc_ppages << SOS_PAGE_SHIFT,
>> 151 num_free_ppages << SOS_PAGE_SHIFT);
265 152
266 !! 153 SOS_ASSERT_FATAL(num_alloc_ppages == num_free_ppages);
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 } 154 }
324 155
325 156
326 !! 157
327 <<
328 <<
329 void sos_main(unsigned long magic, unsigned lo 158 void sos_main(unsigned long magic, unsigned long addr)
330 { 159 {
331 unsigned i; 160 unsigned i;
332 sos_paddr_t sos_kernel_core_base_paddr, sos_ 161 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
333 struct sos_time tick_resolution; <<
334 162
335 163
336 164
337 165
338 multiboot_info_t *mbi; 166 multiboot_info_t *mbi;
339 mbi = (multiboot_info_t *) addr; 167 mbi = (multiboot_info_t *) addr;
340 168
341 169
342 sos_bochs_setup(); 170 sos_bochs_setup();
343 171
344 sos_x86_videomem_setup(); 172 sos_x86_videomem_setup();
345 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 173 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
346 174
347 175
348 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 176 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
349 177
350 sos_x86_videomem_printf(1, 0, 178 sos_x86_videomem_printf(1, 0,
351 SOS_X86_VIDEO_FG_Y 179 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
352 "Welcome From GRUB 180 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
353 "SOS article 7", ' !! 181 "SOS", ',',
354 (unsigned)(mbi->me 182 (unsigned)(mbi->mem_upper >> 10) + 1,
355 (unsigned)mbi->mem 183 (unsigned)mbi->mem_upper);
356 else 184 else
357 185
358 sos_x86_videomem_printf(1, 0, 186 sos_x86_videomem_printf(1, 0,
359 SOS_X86_VIDEO_FG_Y 187 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
360 "Welcome to SOS ar !! 188 "Welcome to SOS");
361 189
362 sos_bochs_putstring("Message in a bochs: Thi !! 190 sos_bochs_putstring("Message in a bochs\n");
363 191
364 192
365 sos_gdt_subsystem_setup(); !! 193 sos_gdt_setup();
366 sos_idt_subsystem_setup(); !! 194 sos_idt_setup();
367 195
368 196
369 sos_exception_subsystem_setup(); !! 197 sos_exceptions_setup();
370 sos_irq_subsystem_setup(); !! 198 sos_irq_setup();
371 199
372 200
373 sos_i8254_set_frequency(100); 201 sos_i8254_set_frequency(100);
374 202
375 <<
376 <<
377 tick_resolution = (struct sos_time) { .sec=0 <<
378 sos_time_subsysem_setup(& tick_resolution); <<
379 203
380 204
381 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) 205 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
382 { 206 {
383 sos_x86_videomem_putstring(20, 0, 207 sos_x86_videomem_putstring(20, 0,
384 SOS_X86_VIDEO 208 SOS_X86_VIDEO_FG_LTRED
385 | SOS_X86_V 209 | SOS_X86_VIDEO_BG_BLUE
386 | SOS_X86_V 210 | SOS_X86_VIDEO_FG_BLINKING,
387 "I'm not load 211 "I'm not loaded with Grub !");
388 212
389 for (;;) 213 for (;;)
390 continue; 214 continue;
391 } 215 }
392 216
393 <<
394 <<
395 <<
396 <<
397 217
398 sos_irq_set_routine(SOS_IRQ_TIMER, 218 sos_irq_set_routine(SOS_IRQ_TIMER,
399 clk_it); !! 219 clk_it);
400 !! 220
401 !! 221
402 !! 222 asm volatile ("sti\n");
403 <<
404 <<
405 223
406 224
407 225
408 sos_physmem_subsystem_setup((mbi->mem_upper< !! 226 sos_physmem_setup((mbi->mem_upper<<10) + (1<<20),
409 & sos_kernel_cor !! 227 & sos_kernel_core_base_paddr,
410 & sos_kernel_cor !! 228 & sos_kernel_core_top_paddr);
411 !! 229 test_physmem();
412 !! 230
413 !! 231
414 !! 232 for (;;)
415 !! 233 continue;
416 <<
417 <<
418 SOS_ASSERT_FATAL(SOS_OK == <<
419 sos_paging_subsystem_setup( <<
420 <<
421 <<
422 <<
423 sos_exception_set_routine(SOS_EXCEPT_PAGE_FA <<
424 pgflt_ex); <<
425 <<
426 <<
427 <<
428 <<
429 <<
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 <<
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 <<
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 234
490 !! 235 return;
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 } 236 }