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
021 #include <bootstrap/multiboot.h> 021 #include <bootstrap/multiboot.h>
022 #include <hwcore/idt.h> 022 #include <hwcore/idt.h>
023 #include <hwcore/gdt.h> 023 #include <hwcore/gdt.h>
024 #include <hwcore/irq.h> 024 #include <hwcore/irq.h>
025 #include <hwcore/exception.h> 025 #include <hwcore/exception.h>
026 #include <hwcore/i8254.h> 026 #include <hwcore/i8254.h>
027 #include <sos/list.h> 027 #include <sos/list.h>
028 #include <sos/physmem.h> 028 #include <sos/physmem.h>
029 #include <hwcore/paging.h> 029 #include <hwcore/paging.h>
030 #include <sos/list.h> !! 030 #include <sos/kmem_vmm.h>
>> 031 #include <sos/kmalloc.h>
031 #include <sos/klibc.h> 032 #include <sos/klibc.h>
032 #include <sos/assert.h> 033 #include <sos/assert.h>
033 #include <drivers/x86_videomem.h> 034 #include <drivers/x86_videomem.h>
034 #include <drivers/bochs.h> 035 #include <drivers/bochs.h>
035 036
036 037
037 038
038 039
039 static void display_bits(unsigned char row, un 040 static void display_bits(unsigned char row, unsigned char col,
040 unsigned char attribu 041 unsigned char attribute,
041 sos_ui32_t integer) 042 sos_ui32_t integer)
042 { 043 {
043 int i; 044 int i;
044 045
045 for (i = 31 ; i >= 0 ; i--) 046 for (i = 31 ; i >= 0 ; i--)
046 { 047 {
047 048
048 int bit_i = (integer & (1 << i)); 049 int bit_i = (integer & (1 << i));
049 050
050 unsigned char ascii_code = bit_i?219:177 051 unsigned char ascii_code = bit_i?219:177;
051 sos_x86_videomem_putchar(row, col++, 052 sos_x86_videomem_putchar(row, col++,
052 attribute, 053 attribute,
053 ascii_code); 054 ascii_code);
054 } 055 }
055 } 056 }
056 057
057 058
058 059
059 static void clk_it(int intid) 060 static void clk_it(int intid)
060 { 061 {
061 static sos_ui32_t clock_count = 0; 062 static sos_ui32_t clock_count = 0;
062 063
063 display_bits(0, 48, 064 display_bits(0, 48,
064 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 065 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
065 clock_count); 066 clock_count);
066 clock_count++; 067 clock_count++;
067 068
068 } 069 }
>> 070 struct digit
>> 071 {
>> 072 struct digit *prev, *next;
>> 073 char value;
>> 074 };
>> 075
>> 076
>> 077
>> 078
>> 079 typedef struct digit * big_number_t;
>> 080
069 081
070 !! 082
071 static void pgflt_ex(int exid) !! 083 void bn_push_lsd(big_number_t * bn, char value)
072 { 084 {
073 sos_bochs_printf("Got page fault\n"); !! 085 struct digit *d;
074 sos_x86_videomem_printf(10, 30, !! 086 d = (struct digit*) sos_kmalloc(sizeof(struct digit), 0);
075 SOS_X86_VIDEO_FG_LTR !! 087 SOS_ASSERT_FATAL(d != NULL);
076 "Got EXPECTED (?) Pa !! 088 d->value = value;
077 for (;;) ; !! 089 list_add_tail(*bn, d);
078 } 090 }
079 091
080 static void test_paging(sos_vaddr_t sos_kernel !! 092
>> 093
>> 094 void bn_push_msd(big_number_t * bn, char value)
081 { 095 {
082 !! 096 struct digit *d;
083 !! 097 d = (struct digit*) sos_kmalloc(sizeof(struct digit), 0);
084 sos_vaddr_t vpage_code = SOS_PAGE_ALIGN_INF( !! 098 SOS_ASSERT_FATAL(d != NULL);
>> 099 d->value = value;
>> 100 list_add_head(*bn, d);
>> 101 }
085 102
086 <<
087 sos_paddr_t ppage_new; <<
088 103
089 !! 104
090 !! 105 big_number_t bn_new(unsigned long int i)
091 sos_vaddr_t vpage_tmp = sos_kernel_core_top_ !! 106 {
>> 107 big_number_t retval;
092 108
093 unsigned i; !! 109 list_init(retval);
>> 110 do
>> 111 {
>> 112 bn_push_msd(&retval, i%10);
>> 113 i /= 10;
>> 114 }
>> 115 while (i != 0);
094 116
095 !! 117 return retval;
096 sos_exception_set_routine(SOS_EXCEPT_PAGE_FA !! 118 }
097 pgflt_ex); <<
098 119
099 <<
100 <<
101 <<
102 <<
103 sos_x86_videomem_printf(4, 0, <<
104 SOS_X86_VIDEO_FG_LTG <<
105 "Moving current code <<
106 120
>> 121
>> 122 big_number_t bn_copy(const big_number_t bn)
>> 123 {
>> 124 big_number_t retval;
>> 125 int nb_elts;
>> 126 struct digit *d;
107 127
108 !! 128 list_init(retval);
109 ppage_new = sos_physmem_ref_physpage_new(FAL !! 129 list_foreach(bn, d, nb_elts)
110 if (! ppage_new) <<
111 { 130 {
112 !! 131 bn_push_lsd(&retval, d->value);
113 sos_x86_videomem_putstring(20, 0, <<
114 SOS_X86_VIDEO <<
115 | SOS_X86_V <<
116 "test_paging <<
117 return; <<
118 } 132 }
119 133
120 sos_x86_videomem_printf(5, 0, !! 134 return retval;
121 SOS_X86_VIDEO_FG_YEL !! 135 }
122 "Hello from the addr <<
123 sos_paging_get_paddr <<
124 136
125 sos_x86_videomem_printf(6, 0, <<
126 SOS_X86_VIDEO_FG_YEL <<
127 "Transfer vpage 0x%x <<
128 vpage_code, <<
129 sos_paging_get_paddr <<
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 137
167 sos_x86_videomem_printf(7, 0, !! 138
168 SOS_X86_VIDEO_FG_YEL !! 139 void bn_del(big_number_t * bn)
169 "Hello from the addr !! 140 {
170 sos_paging_get_paddr !! 141 struct digit *d;
171 142
172 sos_x86_videomem_printf(9, 0, !! 143 list_collapse(*bn, d)
173 SOS_X86_VIDEO_FG_LTG !! 144 {
174 "Provoking a page fa !! 145 sos_kfree((sos_vaddr_t)d);
>> 146 }
>> 147 }
175 148
176 <<
177 <<
178 <<
179 149
180 !! 150
181 !! 151 void bn_shift(big_number_t *bn, int shift)
182 !! 152 {
183 !! 153 for ( ; shift > 0 ; shift --)
184 for (i = vpage_code ; ; i += SOS_ !! 154 {
185 { !! 155 bn_push_lsd(bn, 0);
186 unsigned *pint = (unsigned *)SOS_PAGE_AL !! 156 }
187 sos_bochs_printf("Test vaddr 0x%x : val= !! 157 }
188 sos_x86_videomem_printf(10, 0, !! 158
189 SOS_X86_VIDEO_FG !! 159
190 "Test vaddr 0x%x !! 160
191 (unsigned)pint); !! 161 void bn_print_bochs(const big_number_t bn)
192 sos_bochs_printf("0x%x\n", *pint); !! 162 {
193 sos_x86_videomem_printf(10, 30, !! 163 int nb_elts;
194 SOS_X86_VIDEO_FG !! 164 const struct digit *d;
195 "0x%x " !! 165
196 } !! 166 if (list_is_empty(bn))
197 !! 167 sos_bochs_printf("0");
198 !! 168 else
199 sos_x86_videomem_printf(20, 0, !! 169 list_foreach(bn, d, nb_elts)
200 SOS_X86_VIDEO_FG_LTR !! 170 sos_bochs_printf("%d", d->value);
201 "We should have had !! 171 }
202 vpage_tmp); !! 172
>> 173
>> 174 void bn_print_console(unsigned char row, unsigned char col,
>> 175 unsigned char attribute,
>> 176 const big_number_t bn,
>> 177 int nb_decimals)
>> 178 {
>> 179 if (list_is_empty(bn))
>> 180 sos_x86_videomem_printf(row, col, attribute, "0");
>> 181 else
>> 182 {
>> 183 int nb_elts;
>> 184 const struct digit *d;
>> 185 unsigned char x = col;
>> 186
>> 187 list_foreach(bn, d, nb_elts)
>> 188 {
>> 189 if (nb_elts == 0)
>> 190 {
>> 191 sos_x86_videomem_printf(row, x, attribute, "%d.", d->value);
>> 192 x += 2;
>> 193 }
>> 194 else if (nb_elts < nb_decimals)
>> 195 {
>> 196 sos_x86_videomem_printf(row, x, attribute, "%d", d->value);
>> 197 x ++;
>> 198 }
>> 199 }
>> 200
>> 201 sos_x86_videomem_printf(row, x, attribute, " . 10^{%d} ", nb_elts-1);
>> 202 }
>> 203 }
>> 204
>> 205
>> 206
>> 207 big_number_t bn_add (const big_number_t bn1, const big_number_t bn2)
>> 208 {
>> 209 big_number_t retval;
>> 210 const struct digit *d1, *d2;
>> 211 sos_bool_t bn1_end = FALSE, bn2_end = FALSE;
>> 212 char carry = 0;
>> 213
>> 214 list_init(retval);
>> 215 d1 = list_get_tail(bn1);
>> 216 bn1_end = list_is_empty(bn1);
>> 217 d2 = list_get_tail(bn2);
>> 218 bn2_end = list_is_empty(bn2);
>> 219 do
>> 220 {
>> 221 if (! bn1_end)
>> 222 carry += d1->value;
>> 223 if (! bn2_end)
>> 224 carry += d2->value;
>> 225
>> 226 bn_push_msd(&retval, carry % 10);
>> 227 carry /= 10;
>> 228
>> 229 if (! bn1_end)
>> 230 d1 = d1->prev;
>> 231 if (! bn2_end)
>> 232 d2 = d2->prev;
>> 233 if (d1 == list_get_tail(bn1))
>> 234 bn1_end = TRUE;
>> 235 if (d2 == list_get_tail(bn2))
>> 236 bn2_end = TRUE;
>> 237 }
>> 238 while (!bn1_end || !bn2_end);
>> 239
>> 240 if (carry > 0)
>> 241 {
>> 242 bn_push_msd(&retval, carry);
>> 243 }
>> 244
>> 245 return retval;
>> 246 }
>> 247
>> 248
>> 249
>> 250 big_number_t bn_muli (const big_number_t bn, char digit)
>> 251 {
>> 252 big_number_t retval;
>> 253 int nb_elts;
>> 254 char carry = 0;
>> 255 const struct digit *d;
>> 256
>> 257 list_init(retval);
>> 258 list_foreach_backward(bn, d, nb_elts)
>> 259 {
>> 260 carry += d->value * digit;
>> 261 bn_push_msd(&retval, carry % 10);
>> 262 carry /= 10;
>> 263 }
>> 264
>> 265 if (carry > 0)
>> 266 {
>> 267 bn_push_msd(&retval, carry);
>> 268 }
>> 269
>> 270 return retval;
203 } 271 }
204 272
>> 273
>> 274
>> 275 big_number_t bn_mult(const big_number_t bn1, const big_number_t bn2)
>> 276 {
>> 277 int shift = 0;
>> 278 big_number_t retval;
>> 279 int nb_elts;
>> 280 struct digit *d;
>> 281
>> 282 list_init(retval);
>> 283 list_foreach_backward(bn2, d, nb_elts)
>> 284 {
>> 285 big_number_t retmult = bn_muli(bn1, d->value);
>> 286 big_number_t old_retval = retval;
>> 287 bn_shift(& retmult, shift);
>> 288 retval = bn_add(old_retval, retmult);
>> 289 bn_del(& retmult);
>> 290 bn_del(& old_retval);
>> 291 shift ++;
>> 292 }
>> 293
>> 294 return retval;
>> 295 }
>> 296
>> 297
>> 298
>> 299 big_number_t bn_fact(unsigned long int v)
>> 300 {
>> 301 unsigned long int i;
>> 302 big_number_t retval = bn_new(1);
>> 303 for (i = 1 ; i <= v ; i++)
>> 304 {
>> 305 big_number_t I = bn_new(i);
>> 306 big_number_t tmp = bn_mult(retval, I);
>> 307 sos_x86_videomem_printf(4, 0,
>> 308 SOS_X86_VIDEO_BG_BLUE | SOS_X86_VIDEO_FG_LTGREEN,
>> 309 "%d! = ", (int)i);
>> 310 bn_print_console(4, 8, SOS_X86_VIDEO_BG_BLUE | SOS_X86_VIDEO_FG_WHITE,
>> 311 tmp, 55);
>> 312 bn_del(& I);
>> 313 bn_del(& retval);
>> 314 retval = tmp;
>> 315 }
>> 316
>> 317 return retval;
>> 318 }
>> 319
>> 320
>> 321 void bn_test()
>> 322 {
>> 323 big_number_t bn = bn_fact(1000);
>> 324 sos_bochs_printf("1000! = ");
>> 325 bn_print_bochs(bn);
>> 326 sos_bochs_printf("\n");
>> 327
>> 328 }
>> 329
>> 330
205 331
206 void sos_main(unsigned long magic, unsigned lo 332 void sos_main(unsigned long magic, unsigned long addr)
207 { 333 {
208 unsigned i; 334 unsigned i;
209 sos_paddr_t sos_kernel_core_base_paddr, sos_ 335 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
210 336
211 337
212 338
213 339
214 multiboot_info_t *mbi; 340 multiboot_info_t *mbi;
215 mbi = (multiboot_info_t *) addr; 341 mbi = (multiboot_info_t *) addr;
216 342
217 343
218 sos_bochs_setup(); 344 sos_bochs_setup();
219 345
220 sos_x86_videomem_setup(); 346 sos_x86_videomem_setup();
221 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 347 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
222 348
223 349
224 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 350 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
225 351
226 sos_x86_videomem_printf(1, 0, 352 sos_x86_videomem_printf(1, 0,
227 SOS_X86_VIDEO_FG_Y 353 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
228 "Welcome From GRUB 354 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
229 "SOS", ',', 355 "SOS", ',',
230 (unsigned)(mbi->me 356 (unsigned)(mbi->mem_upper >> 10) + 1,
231 (unsigned)mbi->mem 357 (unsigned)mbi->mem_upper);
232 else 358 else
233 359
234 sos_x86_videomem_printf(1, 0, 360 sos_x86_videomem_printf(1, 0,
235 SOS_X86_VIDEO_FG_Y 361 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
236 "Welcome to SOS"); 362 "Welcome to SOS");
237 363
238 sos_bochs_putstring("Message in a bochs\n"); 364 sos_bochs_putstring("Message in a bochs\n");
239 365
240 366
241 sos_gdt_setup(); 367 sos_gdt_setup();
242 sos_idt_setup(); 368 sos_idt_setup();
243 369
244 370
245 sos_exceptions_setup(); 371 sos_exceptions_setup();
246 sos_irq_setup(); 372 sos_irq_setup();
247 373
248 374
249 sos_i8254_set_frequency(100); 375 sos_i8254_set_frequency(100);
250 376
251 377
252 378
253 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) 379 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
254 { 380 {
255 sos_x86_videomem_putstring(20, 0, 381 sos_x86_videomem_putstring(20, 0,
256 SOS_X86_VIDEO 382 SOS_X86_VIDEO_FG_LTRED
257 | SOS_X86_V 383 | SOS_X86_VIDEO_BG_BLUE
258 | SOS_X86_V 384 | SOS_X86_VIDEO_FG_BLINKING,
259 "I'm not load 385 "I'm not loaded with Grub !");
260 386
261 for (;;) 387 for (;;)
262 continue; 388 continue;
263 } 389 }
264 390
265 391
266 sos_irq_set_routine(SOS_IRQ_TIMER, 392 sos_irq_set_routine(SOS_IRQ_TIMER,
267 clk_it); 393 clk_it);
268 394
269 395
270 asm volatile ("sti\n"); 396 asm volatile ("sti\n");
271 397
272 398
273 399
274 sos_physmem_setup((mbi->mem_upper<<10) + (1< 400 sos_physmem_setup((mbi->mem_upper<<10) + (1<<20),
275 & sos_kernel_core_base_pad 401 & sos_kernel_core_base_paddr,
276 & sos_kernel_core_top_padd 402 & sos_kernel_core_top_paddr);
277 403
278 404
279 405
280 406
281 407
282 408
283 409
284 if (sos_paging_setup(sos_kernel_core_base_pa 410 if (sos_paging_setup(sos_kernel_core_base_paddr,
285 sos_kernel_core_top_pad 411 sos_kernel_core_top_paddr))
286 sos_bochs_printf("Could not setup paged me 412 sos_bochs_printf("Could not setup paged memory mode\n");
287 sos_x86_videomem_printf(2, 0, 413 sos_x86_videomem_printf(2, 0,
288 SOS_X86_VIDEO_FG_YEL 414 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
289 "Paged-memory mode i 415 "Paged-memory mode is activated");
290 416
291 test_paging(sos_kernel_core_top_paddr); !! 417
>> 418 if (sos_kmem_vmm_setup(sos_kernel_core_base_paddr,
>> 419 sos_kernel_core_top_paddr))
>> 420 sos_bochs_printf("Could not setup the Kernel virtual space allocator\n");
>> 421
>> 422 if (sos_kmalloc_setup())
>> 423 sos_bochs_printf("Could not setup the Kmalloc subsystem\n");
>> 424
>> 425
>> 426 bn_test();
292 427
293 428
294 for (;;) 429 for (;;)
295 continue; 430 continue;
296 431
297 return; 432 return;
298 } 433 }