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/umem_vmm.h> <<
037 #include <sos/klibc.h> 029 #include <sos/klibc.h>
038 #include <sos/assert.h> 030 #include <sos/assert.h>
039 #include <drivers/x86_videomem.h> 031 #include <drivers/x86_videomem.h>
040 #include <drivers/bochs.h> 032 #include <drivers/bochs.h>
041 #include <sos/calcload.h> <<
042 #include <sos/umem_vmm.h> <<
043 #include <sos/binfmt_elf32.h> <<
044 #include <drivers/zero.h> <<
045 033
046 034
047 035
048 036
049 void display_bits(unsigned char row, unsigned !! 037 static void display_bits(unsigned char row, unsigned char col,
050 unsigned char attribute, !! 038 unsigned char attribute,
051 sos_ui32_t integer) !! 039 sos_ui32_t integer)
052 { 040 {
053 int i; 041 int i;
054 042
055 for (i = 31 ; i >= 0 ; i--) 043 for (i = 31 ; i >= 0 ; i--)
056 { 044 {
057 045
058 int bit_i = (integer & (1 << i)); 046 int bit_i = (integer & (1 << i));
059 047
060 unsigned char ascii_code = bit_i?219:177 048 unsigned char ascii_code = bit_i?219:177;
061 sos_x86_videomem_putchar(row, col++, 049 sos_x86_videomem_putchar(row, col++,
062 attribute, 050 attribute,
063 ascii_code); 051 ascii_code);
064 } 052 }
065 } 053 }
066 054
067 055
068 056
069 static void clk_it(int intid) 057 static void clk_it(int intid)
070 { 058 {
071 static sos_ui32_t clock_count = 0; 059 static sos_ui32_t clock_count = 0;
072 060
073 display_bits(0, 48, 061 display_bits(0, 48,
074 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 062 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
075 clock_count); 063 clock_count);
076 clock_count++; 064 clock_count++;
077 065
078 <<
079 sos_time_do_tick(); <<
080 <<
081 <<
082 sos_sched_do_timer_tick(); <<
083 } 066 }
084 067
085 !! 068 #define MY_PPAGE_NUM_INT 511
086 !! 069 struct my_ppage
087 <<
088 <<
089 <<
090 <<
091 <<
092 static void pgflt_ex(int intid, struct sos_cpu <<
093 { 070 {
094 static sos_ui32_t demand_paging_count = 0; !! 071 sos_ui32_t before[MY_PPAGE_NUM_INT];
095 struct sos_thread * cur_thr = sos_thread_get !! 072 struct my_ppage *prev, *next;
096 sos_vaddr_t faulting_vaddr = sos_cpu_contex !! 073 sos_ui32_t after[MY_PPAGE_NUM_INT];
097 sos_paddr_t ppage_paddr; !! 074 };
098 !! 075
099 if (sos_cpu_context_is_in_user_mode(ctxt) !! 076 static void test_physmem()
100 || (cur_thr->fixup_uaccess.return_vaddr) !! 077 {
>> 078
>> 079 struct my_ppage *ppage_list, *my_ppage;
>> 080 sos_count_t num_alloc_ppages = 0, num_free_ppages = 0;
>> 081
>> 082 ppage_list = NULL;
>> 083 while ((my_ppage = (struct my_ppage*)sos_physmem_ref_physpage_new(FALSE))
>> 084 != NULL)
101 { 085 {
102 __label__ unforce_address_space; !! 086 int i;
103 sos_bool_t need_to_setup_mmu; !! 087 num_alloc_ppages++;
104 sos_ui32_t errcode = sos_cpu_context_get !! 088
105 !! 089
106 !! 090 sos_x86_videomem_printf(2, 0,
107 !! 091 SOS_X86_VIDEO_FG_YELLOW
108 need_to_setup_mmu = (cur_thr->squatted_m !! 092 | SOS_X86_VIDEO_BG_BLUE,
109 != sos_process_get_ !! 093 "Could allocate %d pages ",
110 if (need_to_setup_mmu) !! 094 num_alloc_ppages);
111 sos_thread_prepare_user_space_access(N !! 095
112 !! 096
113 if (SOS_OK == !! 097 for (i = 0 ; i < MY_PPAGE_NUM_INT ; i++)
114 sos_umem_vmm_try_resolve_page_fault( !! 098 my_ppage->before[i] = my_ppage->after[i] = (sos_ui32_t)my_ppage;
115 !! 099
116 !! 100
117 goto unforce_address_space; !! 101 list_add_tail(ppage_list, my_ppage);
118 !! 102 }
119 !! 103
120 !! 104
121 if (! sos_cpu_context_is_in_user_mode(ct !! 105 while ((my_ppage = list_pop_head(ppage_list)) != NULL)
>> 106 {
>> 107
>> 108
>> 109 int i;
>> 110 for (i = 0 ; i < MY_PPAGE_NUM_INT ; i++)
122 { 111 {
123 cur_thr->fixup_uaccess.faulted_uaddr !! 112
124 sos_cpu_context_set_EX_return_addres !! 113 if ((my_ppage->before[i] != (sos_ui32_t)my_ppage)
125 !! 114 || (my_ppage->after[i] != (sos_ui32_t)my_ppage))
126 goto unforce_address_space; !! 115 {
>> 116
>> 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 }
127 } 123 }
128 124
129 if (need_to_setup_mmu) !! 125
130 sos_thread_end_user_space_access(); !! 126 if (sos_physmem_unref_physpage((sos_paddr_t)my_ppage) < 0)
131 !! 127 {
132 sos_bochs_printf("Unresolved USER page F !! 128
133 sos_cpu_context_get_PC( !! 129 sos_x86_videomem_putstring(20, 0,
134 (unsigned)faulting_vadd !! 130 SOS_X86_VIDEO_FG_LTRED
135 (unsigned)sos_cpu_conte !! 131 | SOS_X86_VIDEO_BG_BLUE,
136 sos_bochs_printf("Terminating User threa !! 132 "Cannot release page");
137 sos_thread_exit(); !! 133 return;
138 !! 134 }
139 unforce_address_space: <<
140 if (need_to_setup_mmu) <<
141 sos_thread_end_user_space_access(); <<
142 return; <<
143 } <<
144 <<
145 <<
146 if (! sos_kmem_vmm_is_valid_vaddr(faulting_v <<
147 { <<
148 <<
149 <<
150 sos_display_fatal_error("Unresolved page <<
151 sos_cpu_context_ <<
152 (unsigned)faulti <<
153 (unsigned)sos_cp <<
154 SOS_ASSERT_FATAL(! "Got page fault (note <<
155 } <<
156 <<
157 <<
158 <<
159 <<
160 <<
161 <<
162 <<
163 demand_paging_count ++; <<
164 display_bits(0, 0, <<
165 SOS_X86_VIDEO_FG_LTRED | SOS_X8 <<
166 demand_paging_count); <<
167 <<
168 <<
169 ppage_paddr = sos_physmem_ref_physpage_new(F <<
170 if (! ppage_paddr) <<
171 SOS_ASSERT_FATAL(! "TODO: implement swap. <<
172 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(pp <<
173 SO <<
174 FA <<
175 SO <<
176 | <<
177 | <<
178 sos_physmem_unref_physpage(ppage_paddr); <<
179 <<
180 <<
181 } <<
182 <<
183 <<
184 <<
185 <<
186 <<
187 <<
188 <<
189 static void idle_thread() <<
190 { <<
191 sos_ui32_t idle_twiddle = 0; <<
192 <<
193 while (1) <<
194 { <<
195 <<
196 <<
197 asm("hlt\n"); <<
198 <<
199 idle_twiddle ++; <<
200 display_bits(0, 0, SOS_X86_VIDEO_FG_GREE <<
201 idle_twiddle); <<
202 <<
203 <<
204 sos_thread_yield(); <<
205 } <<
206 } <<
207 <<
208 <<
209 <<
210 <<
211 <<
212 static void stat_thread() <<
213 { <<
214 while (1) <<
215 { <<
216 sos_ui32_t flags; <<
217 sos_ui32_t load1, load5, load15; <<
218 char str1[11], str5[11], str15[11]; <<
219 struct sos_time t; <<
220 t.sec = 1; <<
221 t.nanosec = 0; <<
222 <<
223 sos_thread_sleep(& t); <<
224 <<
225 sos_disable_IRQs(flags); <<
226 <<
227 <<
228 sos_load_get_sload(&load1, &load5, &load <<
229 sos_load_to_string(str1, load1); <<
230 sos_load_to_string(str5, load5); <<
231 sos_load_to_string(str15, load15); <<
232 sos_x86_videomem_printf(16, 34, <<
233 SOS_X86_VIDEO_FG <<
234 "Kernel (- Idle) <<
235 str1, str5, str1 <<
236 <<
237 sos_load_get_uload(&load1, &load5, &load <<
238 sos_load_to_string(str1, load1); <<
239 sos_load_to_string(str5, load5); <<
240 sos_load_to_string(str15, load15); <<
241 sos_x86_videomem_printf(17, 34, <<
242 SOS_X86_VIDEO_FG <<
243 "User: %s %s %s <<
244 str1, str5, str1 <<
245 <<
246 sos_load_get_uratio(&load1, &load5, &loa <<
247 sos_load_to_string(str1, load1); <<
248 sos_load_to_string(str5, load5); <<
249 sos_load_to_string(str15, load15); <<
250 sos_x86_videomem_printf(18, 34, <<
251 SOS_X86_VIDEO_FG <<
252 "User CPU %%: %s <<
253 str1, str5, str1 <<
254 <<
255 <<
256 sos_load_get_sratio(&load1, &load5, &loa <<
257 sos_load_to_string(str1, load1); <<
258 sos_load_to_string(str5, load5); <<
259 sos_load_to_string(str15, load15); <<
260 sos_x86_videomem_printf(19, 34, <<
261 SOS_X86_VIDEO_FG <<
262 "Kernel CPU %% ( <<
263 str1, str5, str1 <<
264 sos_restore_IRQs(flags); <<
265 } <<
266 } <<
267 <<
268 135
269 !! 136
270 !! 137 num_free_ppages ++;
271 !! 138 sos_x86_videomem_printf(2, 0,
272 static sos_ret_t start_init() !! 139 SOS_X86_VIDEO_FG_YELLOW
273 { !! 140 | SOS_X86_VIDEO_BG_BLUE,
274 sos_ret_t retval; !! 141 "Could free %d pages ",
275 struct sos_umem_vmm_as *as_init; !! 142 num_free_ppages);
276 struct sos_process *proc_init; <<
277 struct sos_thread *new_thr; <<
278 sos_uaddr_t ustack, start_uaddr; <<
279 <<
280 <<
281 proc_init = sos_process_create("init", FALSE <<
282 if (! proc_init) <<
283 return -SOS_ENOMEM; <<
284 as_init = sos_process_get_address_space(proc <<
285 <<
286 <<
287 start_uaddr = sos_binfmt_elf32_map(as_init, <<
288 if (0 == start_uaddr) <<
289 { <<
290 sos_process_unref(proc_init); <<
291 return -SOS_ENOENT; <<
292 } <<
293 <<
294 <<
295 ustack = (SOS_PAGING_TOP_USER_ADDRESS - SOS_ <<
296 retval = sos_dev_zero_map(as_init, &ustack, <<
297 SOS_VM_MAP_PROT_RE <<
298 0); <<
299 if (SOS_OK != retval) <<
300 { <<
301 sos_bochs_printf("ici 2\n"); <<
302 sos_process_unref(proc_init); <<
303 return -SOS_ENOMEM; <<
304 } 143 }
305 144
306 !! 145
307 new_thr = sos_create_user_thread(NULL, !! 146 sos_x86_videomem_printf(2, 0,
308 proc_init, !! 147 SOS_X86_VIDEO_FG_LTGREEN
309 start_uaddr !! 148 | SOS_X86_VIDEO_BG_BLUE,
310 0, 0, !! 149 "Could allocate %d bytes, could free %d bytes ",
311 ustack + SO !! 150 num_alloc_ppages << SOS_PAGE_SHIFT,
312 SOS_SCHED_P !! 151 num_free_ppages << SOS_PAGE_SHIFT);
313 if (! new_thr) <<
314 { <<
315 sos_bochs_printf("ici 3\n"); <<
316 sos_process_unref(proc_init); <<
317 return -SOS_ENOMEM; <<
318 } <<
319 152
320 sos_process_unref(proc_init); !! 153 SOS_ASSERT_FATAL(num_alloc_ppages == num_free_ppages);
321 return SOS_OK; <<
322 } 154 }
323 155
324 156
325 !! 157
326 <<
327 <<
328 void sos_main(unsigned long magic, unsigned lo 158 void sos_main(unsigned long magic, unsigned long addr)
329 { 159 {
330 unsigned i; 160 unsigned i;
331 sos_paddr_t sos_kernel_core_base_paddr, sos_ 161 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
332 struct sos_time tick_resolution; <<
333 162
334 163
335 164
336 165
337 multiboot_info_t *mbi; 166 multiboot_info_t *mbi;
338 mbi = (multiboot_info_t *) addr; 167 mbi = (multiboot_info_t *) addr;
339 168
340 169
341 sos_bochs_setup(); 170 sos_bochs_setup();
342 171
343 sos_x86_videomem_setup(); 172 sos_x86_videomem_setup();
344 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 173 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
345 174
346 175
347 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 176 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
348 177
349 sos_x86_videomem_printf(1, 0, 178 sos_x86_videomem_printf(1, 0,
350 SOS_X86_VIDEO_FG_Y 179 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
351 "Welcome From GRUB 180 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
352 "SOS article 7.5", !! 181 "SOS", ',',
353 (unsigned)(mbi->me 182 (unsigned)(mbi->mem_upper >> 10) + 1,
354 (unsigned)mbi->mem 183 (unsigned)mbi->mem_upper);
355 else 184 else
356 185
357 sos_x86_videomem_printf(1, 0, 186 sos_x86_videomem_printf(1, 0,
358 SOS_X86_VIDEO_FG_Y 187 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
359 "Welcome to SOS ar !! 188 "Welcome to SOS");
360 189
361 sos_bochs_putstring("Message in a bochs: Thi !! 190 sos_bochs_putstring("Message in a bochs\n");
362 191
363 192
364 sos_gdt_subsystem_setup(); !! 193 sos_gdt_setup();
365 sos_idt_subsystem_setup(); !! 194 sos_idt_setup();
366 195
367 196
368 sos_exception_subsystem_setup(); !! 197 sos_exceptions_setup();
369 sos_irq_subsystem_setup(); !! 198 sos_irq_setup();
370 199
371 200
372 sos_i8254_set_frequency(100); 201 sos_i8254_set_frequency(100);
373 202
374 <<
375 <<
376 tick_resolution = (struct sos_time) { .sec=0 <<
377 sos_time_subsysem_setup(& tick_resolution); <<
378 203
379 204
380 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) 205 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
381 { 206 {
382 sos_x86_videomem_putstring(20, 0, 207 sos_x86_videomem_putstring(20, 0,
383 SOS_X86_VIDEO 208 SOS_X86_VIDEO_FG_LTRED
384 | SOS_X86_V 209 | SOS_X86_VIDEO_BG_BLUE
385 | SOS_X86_V 210 | SOS_X86_VIDEO_FG_BLINKING,
386 "I'm not load 211 "I'm not loaded with Grub !");
387 212
388 for (;;) 213 for (;;)
389 continue; 214 continue;
390 } 215 }
391 216
392 <<
393 <<
394 <<
395 <<
396 217
397 sos_irq_set_routine(SOS_IRQ_TIMER, 218 sos_irq_set_routine(SOS_IRQ_TIMER,
398 clk_it); !! 219 clk_it);
399 !! 220
400 !! 221
401 !! 222 asm volatile ("sti\n");
402 <<
403 <<
404 223
405 224
406 225
407 sos_physmem_subsystem_setup((mbi->mem_upper< !! 226 sos_physmem_setup((mbi->mem_upper<<10) + (1<<20),
408 & sos_kernel_cor !! 227 & sos_kernel_core_base_paddr,
409 & sos_kernel_cor !! 228 & sos_kernel_core_top_paddr);
410 !! 229 test_physmem();
411 !! 230
412 !! 231
413 !! 232 for (;;)
414 !! 233 continue;
415 <<
416 <<
417 SOS_ASSERT_FATAL(SOS_OK == <<
418 sos_paging_subsystem_setup( <<
419 <<
420 <<
421 <<
422 sos_exception_set_routine(SOS_EXCEPT_PAGE_FA <<
423 pgflt_ex); <<
424 <<
425 <<
426 <<
427 <<
428 <<
429 if (sos_kmem_vmm_subsystem_setup(sos_kernel_ <<
430 sos_kernel_ <<
431 bootstrap_s <<
432 bootstrap_s <<
433 + bootstrap <<
434 sos_bochs_printf("Could not setup the Kern <<
435 <<
436 if (sos_kmalloc_subsystem_setup()) <<
437 sos_bochs_printf("Could not setup the Kmal <<
438 <<
439 <<
440 <<
441 <<
442 sos_mm_context_subsystem_setup(); <<
443 <<
444 <<
445 <<
446 <<
447 sos_cpu_context_subsystem_setup(); <<
448 <<
449 <<
450 <<
451 <<
452 sos_swintr_subsystem_setup(); <<
453 <<
454 <<
455 <<
456 <<
457 <<
458 <<
459 <<
460 sos_thread_subsystem_setup(bootstrap_stack_b <<
461 bootstrap_stack_s <<
462 <<
463 <<
464 sos_sched_subsystem_setup(); <<
465 <<
466 <<
467 SOS_ASSERT_FATAL(sos_create_kernel_thread("i <<
468 SO <<
469 <<
470 <<
471 sos_load_subsystem_setup(); <<
472 <<
473 <<
474 SOS_ASSERT_FATAL(sos_create_kernel_thread("s <<
475 NU <<
476 SO <<
477 <<
478 <<
479 <<
480 <<
481 <<
482 sos_umem_vmm_subsystem_setup(); <<
483 sos_dev_zero_subsystem_setup(); <<
484 <<
485 <<
486 <<
487 <<
488 sos_process_subsystem_setup(); <<
489 <<
490 <<
491 <<
492 <<
493 asm volatile ("sti\n"); <<
494 234
495 !! 235 return;
496 <<
497 start_init(); <<
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 }