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