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 <sos/kmem_vmm.h> !! 030 #include <sos/list.h>
030 #include <sos/kmalloc.h> <<
031 #include <sos/time.h> <<
032 #include <sos/thread.h> <<
033 #include <sos/klibc.h> 031 #include <sos/klibc.h>
034 #include <sos/assert.h> 032 #include <sos/assert.h>
035 #include <drivers/x86_videomem.h> 033 #include <drivers/x86_videomem.h>
036 #include <drivers/bochs.h> 034 #include <drivers/bochs.h>
037 035
038 036
039 037
040 038
041 void display_bits(unsigned char row, unsigned !! 039 static void display_bits(unsigned char row, unsigned char col,
042 unsigned char attribute, !! 040 unsigned char attribute,
043 sos_ui32_t integer) !! 041 sos_ui32_t integer)
044 { 042 {
045 int i; 043 int i;
046 044
047 for (i = 31 ; i >= 0 ; i--) 045 for (i = 31 ; i >= 0 ; i--)
048 { 046 {
049 047
050 int bit_i = (integer & (1 << i)); 048 int bit_i = (integer & (1 << i));
051 049
052 unsigned char ascii_code = bit_i?219:177 050 unsigned char ascii_code = bit_i?219:177;
053 sos_x86_videomem_putchar(row, col++, 051 sos_x86_videomem_putchar(row, col++,
054 attribute, 052 attribute,
055 ascii_code); 053 ascii_code);
056 } 054 }
057 } 055 }
058 056
059 057
060 058
061 static void clk_it(int intid) 059 static void clk_it(int intid)
062 { 060 {
063 static sos_ui32_t clock_count = 0; 061 static sos_ui32_t clock_count = 0;
064 062
065 display_bits(0, 48, 063 display_bits(0, 48,
066 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 064 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
067 clock_count); 065 clock_count);
068 clock_count++; 066 clock_count++;
069 067
070 <<
071 sos_time_do_tick(); <<
072 } 068 }
073 069
074 !! 070
075 !! 071 static void pgflt_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 { 072 {
086 static void backtracer(sos_vaddr_t PC, !! 073 sos_bochs_printf("Got page fault\n");
087 sos_vaddr_t params, !! 074 sos_x86_videomem_printf(10, 30,
088 sos_ui32_t depth, !! 075 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
089 void *custom_arg) !! 076 "Got EXPECTED (?) Page fault ! But where ???");
090 { !! 077 for (;;) ;
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 } 078 }
135 079
136 !! 080 static void test_paging(sos_vaddr_t sos_kernel_core_top_vaddr)
137 <<
138 static void pgflt_ex(int intid, const struct s <<
139 { 081 {
140 static sos_ui32_t demand_paging_count = 0; !! 082
141 sos_vaddr_t faulting_vaddr = sos_cpu_context !! 083
142 sos_paddr_t ppage_paddr; !! 084 sos_vaddr_t vpage_code = SOS_PAGE_ALIGN_INF(test_paging);
>> 085
>> 086
>> 087 sos_paddr_t ppage_new;
>> 088
>> 089
>> 090
>> 091 sos_vaddr_t vpage_tmp = sos_kernel_core_top_vaddr;
143 092
144 !! 093 unsigned i;
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 094
>> 095
>> 096 sos_exception_set_routine(SOS_EXCEPT_PAGE_FAULT,
>> 097 pgflt_ex);
160 098
161 099
162 !! 100
>> 101
163 102
164 !! 103 sos_x86_videomem_printf(4, 0,
165 !! 104 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
166 demand_paging_count ++; !! 105 "Moving current code elsewhere in physical memory:");
167 display_bits(0, 0, <<
168 SOS_X86_VIDEO_FG_LTRED | SOS_X8 <<
169 demand_paging_count); <<
170 <<
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 106
203 107
204 static void demo_thread(void *arg) !! 108
205 { !! 109 ppage_new = sos_physmem_ref_physpage_new(FALSE);
206 struct thr_arg *thr_arg = (struct thr_arg*)a !! 110 if (! ppage_new)
207 int progress = 0; <<
208 <<
209 sos_bochs_printf("start %c", thr_arg->charac <<
210 while (1) <<
211 { 111 {
212 progress ++; !! 112
213 display_bits(thr_arg->row, thr_arg->col+ !! 113 sos_x86_videomem_putstring(20, 0,
214 !! 114 SOS_X86_VIDEO_FG_LTRED
215 sos_bochs_putchar(thr_arg->character); !! 115 | SOS_X86_VIDEO_BG_BLUE,
216 !! 116 "test_paging : Cannot allocate page");
217 !! 117 return;
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 } 118 }
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 } <<
282 119
>> 120 sos_x86_videomem_printf(5, 0,
>> 121 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 122 "Hello from the address 0x%x in physical memory",
>> 123 sos_paging_get_paddr(vpage_code));
>> 124
>> 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:");
283 175
284 !! 176
285 !! 177
286 !! 178
287 <<
288 static void idle_thread() <<
289 { <<
290 sos_ui32_t idle_twiddle = 0; <<
291 179
292 while (1) !! 180
>> 181
>> 182
>> 183
>> 184 for (i = vpage_code ; ; i += SOS_PAGE_SIZE)
293 { 185 {
294 !! 186 unsigned *pint = (unsigned *)SOS_PAGE_ALIGN_INF(i);
295 !! 187 sos_bochs_printf("Test vaddr 0x%x : val=", (unsigned)pint);
296 asm("hlt\n"); !! 188 sos_x86_videomem_printf(10, 0,
297 !! 189 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
298 idle_twiddle ++; !! 190 "Test vaddr 0x%x : val= ",
299 display_bits(0, 0, SOS_X86_VIDEO_FG_GREE !! 191 (unsigned)pint);
300 idle_twiddle); !! 192 sos_bochs_printf("0x%x\n", *pint);
301 !! 193 sos_x86_videomem_printf(10, 30,
302 !! 194 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
303 sos_thread_yield(); !! 195 "0x%x ", *pint);
304 } 196 }
305 } <<
306 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 }
307 204
308 !! 205
309 <<
310 <<
311 void sos_main(unsigned long magic, unsigned lo 206 void sos_main(unsigned long magic, unsigned long addr)
312 { 207 {
313 unsigned i; 208 unsigned i;
314 sos_paddr_t sos_kernel_core_base_paddr, sos_ 209 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
315 struct sos_time tick_resolution; <<
316 210
317 211
318 212
319 213
320 multiboot_info_t *mbi; 214 multiboot_info_t *mbi;
321 mbi = (multiboot_info_t *) addr; 215 mbi = (multiboot_info_t *) addr;
322 216
323 217
324 sos_bochs_setup(); 218 sos_bochs_setup();
325 219
326 sos_x86_videomem_setup(); 220 sos_x86_videomem_setup();
327 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 221 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
328 222
329 223
330 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 224 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
331 225
332 sos_x86_videomem_printf(1, 0, 226 sos_x86_videomem_printf(1, 0,
333 SOS_X86_VIDEO_FG_Y 227 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
334 "Welcome From GRUB 228 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
335 "SOS article 6.5", !! 229 "SOS", ',',
336 (unsigned)(mbi->me 230 (unsigned)(mbi->mem_upper >> 10) + 1,
337 (unsigned)mbi->mem 231 (unsigned)mbi->mem_upper);
338 else 232 else
339 233
340 sos_x86_videomem_printf(1, 0, 234 sos_x86_videomem_printf(1, 0,
341 SOS_X86_VIDEO_FG_Y 235 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
342 "Welcome to SOS ar !! 236 "Welcome to SOS");
343 237
344 sos_bochs_putstring("Message in a bochs: Thi !! 238 sos_bochs_putstring("Message in a bochs\n");
345 239
346 240
347 sos_gdt_subsystem_setup(); !! 241 sos_gdt_setup();
348 sos_idt_subsystem_setup(); !! 242 sos_idt_setup();
349 243
350 244
351 sos_exception_subsystem_setup(); !! 245 sos_exceptions_setup();
352 sos_irq_subsystem_setup(); !! 246 sos_irq_setup();
353 247
354 248
355 sos_i8254_set_frequency(100); 249 sos_i8254_set_frequency(100);
356 250
357 <<
358 <<
359 tick_resolution = (struct sos_time) { .sec=0 <<
360 sos_time_subsysem_setup(& tick_resolution); <<
361 251
362 252
363 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) 253 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
364 { 254 {
365 sos_x86_videomem_putstring(20, 0, 255 sos_x86_videomem_putstring(20, 0,
366 SOS_X86_VIDEO 256 SOS_X86_VIDEO_FG_LTRED
367 | SOS_X86_V 257 | SOS_X86_VIDEO_BG_BLUE
368 | SOS_X86_V 258 | SOS_X86_VIDEO_FG_BLINKING,
369 "I'm not load 259 "I'm not loaded with Grub !");
370 260
371 for (;;) 261 for (;;)
372 continue; 262 continue;
373 } 263 }
374 264
375 <<
376 <<
377 <<
378 <<
379 265
380 sos_irq_set_routine(SOS_IRQ_TIMER, 266 sos_irq_set_routine(SOS_IRQ_TIMER,
381 clk_it); !! 267 clk_it);
382 !! 268
383 !! 269
384 !! 270 asm volatile ("sti\n");
385 <<
386 <<
387 271
388 272
389 273
390 sos_physmem_subsystem_setup((mbi->mem_upper< !! 274 sos_physmem_setup((mbi->mem_upper<<10) + (1<<20),
391 & sos_kernel_cor !! 275 & sos_kernel_core_base_paddr,
392 & sos_kernel_cor !! 276 & sos_kernel_core_top_paddr);
393 277
394 278
395 279
396 280
397 281
398 282
399 283
400 SOS_ASSERT_FATAL(SOS_OK == !! 284 if (sos_paging_setup(sos_kernel_core_base_paddr,
401 sos_paging_subsystem_setup( !! 285 sos_kernel_core_top_paddr))
402 !! 286 sos_bochs_printf("Could not setup paged memory mode\n");
403 !! 287 sos_x86_videomem_printf(2, 0,
404 !! 288 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
405 sos_exception_set_routine(SOS_EXCEPT_PAGE_FA !! 289 "Paged-memory mode is activated");
406 pgflt_ex); !! 290
>> 291 test_paging(sos_kernel_core_top_paddr);
>> 292
>> 293
>> 294 for (;;)
>> 295 continue;
407 296
408 !! 297 return;
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 <<
437 <<
438 asm volatile ("sti\n"); <<
439 <<
440 <<
441 <<
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 } 298 }