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>
>> 030 #include <sos/kmem_vmm.h>
>> 031 #include <sos/kmalloc.h>
029 #include <sos/klibc.h> 032 #include <sos/klibc.h>
030 #include <sos/assert.h> 033 #include <sos/assert.h>
031 #include <drivers/x86_videomem.h> 034 #include <drivers/x86_videomem.h>
032 #include <drivers/bochs.h> 035 #include <drivers/bochs.h>
033 036
034 037
035 038
036 039
037 static void display_bits(unsigned char row, un 040 static void display_bits(unsigned char row, unsigned char col,
038 unsigned char attribu 041 unsigned char attribute,
039 sos_ui32_t integer) 042 sos_ui32_t integer)
040 { 043 {
041 int i; 044 int i;
042 045
043 for (i = 31 ; i >= 0 ; i--) 046 for (i = 31 ; i >= 0 ; i--)
044 { 047 {
045 048
046 int bit_i = (integer & (1 << i)); 049 int bit_i = (integer & (1 << i));
047 050
048 unsigned char ascii_code = bit_i?219:177 051 unsigned char ascii_code = bit_i?219:177;
049 sos_x86_videomem_putchar(row, col++, 052 sos_x86_videomem_putchar(row, col++,
050 attribute, 053 attribute,
051 ascii_code); 054 ascii_code);
052 } 055 }
053 } 056 }
054 057
055 058
056 059
057 static void clk_it(int intid) 060 static void clk_it(int intid)
058 { 061 {
059 static sos_ui32_t clock_count = 0; 062 static sos_ui32_t clock_count = 0;
060 063
061 display_bits(0, 48, 064 display_bits(0, 48,
062 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 065 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
063 clock_count); 066 clock_count);
064 clock_count++; 067 clock_count++;
065 068
066 } 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
>> 081
>> 082
>> 083 void bn_push_lsd(big_number_t * bn, char value)
>> 084 {
>> 085 struct digit *d;
>> 086 d = (struct digit*) sos_kmalloc(sizeof(struct digit), 0);
>> 087 SOS_ASSERT_FATAL(d != NULL);
>> 088 d->value = value;
>> 089 list_add_tail(*bn, d);
>> 090 }
>> 091
>> 092
>> 093
>> 094 void bn_push_msd(big_number_t * bn, char value)
>> 095 {
>> 096 struct digit *d;
>> 097 d = (struct digit*) sos_kmalloc(sizeof(struct digit), 0);
>> 098 SOS_ASSERT_FATAL(d != NULL);
>> 099 d->value = value;
>> 100 list_add_head(*bn, d);
>> 101 }
>> 102
>> 103
>> 104
>> 105 big_number_t bn_new(unsigned long int i)
>> 106 {
>> 107 big_number_t retval;
067 108
068 #define MY_PPAGE_NUM_INT 511 !! 109 list_init(retval);
069 struct my_ppage !! 110 do
>> 111 {
>> 112 bn_push_msd(&retval, i%10);
>> 113 i /= 10;
>> 114 }
>> 115 while (i != 0);
>> 116
>> 117 return retval;
>> 118 }
>> 119
>> 120
>> 121
>> 122 big_number_t bn_copy(const big_number_t bn)
070 { 123 {
071 sos_ui32_t before[MY_PPAGE_NUM_INT]; !! 124 big_number_t retval;
072 struct my_ppage *prev, *next; !! 125 int nb_elts;
073 sos_ui32_t after[MY_PPAGE_NUM_INT]; !! 126 struct digit *d;
074 }; !! 127
075 !! 128 list_init(retval);
076 static void test_physmem() !! 129 list_foreach(bn, d, nb_elts)
077 { !! 130 {
078 !! 131 bn_push_lsd(&retval, d->value);
079 struct my_ppage *ppage_list, *my_ppage; !! 132 }
080 sos_count_t num_alloc_ppages = 0, num_free_p !! 133
081 !! 134 return retval;
082 ppage_list = NULL; !! 135 }
083 while ((my_ppage = (struct my_ppage*)sos_phy !! 136
084 != NULL) !! 137
085 { !! 138
086 int i; !! 139 void bn_del(big_number_t * bn)
087 num_alloc_ppages++; !! 140 {
088 !! 141 struct digit *d;
089 !! 142
090 sos_x86_videomem_printf(2, 0, !! 143 list_collapse(*bn, d)
091 SOS_X86_VIDEO_FG !! 144 {
092 | SOS_X86_VIDEO_ !! 145 sos_kfree((sos_vaddr_t)d);
093 "Could allocate !! 146 }
094 num_alloc_ppages !! 147 }
095 !! 148
096 !! 149
097 for (i = 0 ; i < MY_PPAGE_NUM_INT ; i++) !! 150
098 my_ppage->before[i] = my_ppage->after[ !! 151 void bn_shift(big_number_t *bn, int shift)
099 !! 152 {
100 !! 153 for ( ; shift > 0 ; shift --)
101 list_add_tail(ppage_list, my_ppage); !! 154 {
102 } !! 155 bn_push_lsd(bn, 0);
103 !! 156 }
104 !! 157 }
105 while ((my_ppage = list_pop_head(ppage_list) !! 158
106 { !! 159
107 !! 160
108 !! 161 void bn_print_bochs(const big_number_t bn)
109 int i; !! 162 {
110 for (i = 0 ; i < MY_PPAGE_NUM_INT ; i++) !! 163 int nb_elts;
>> 164 const struct digit *d;
>> 165
>> 166 if (list_is_empty(bn))
>> 167 sos_bochs_printf("0");
>> 168 else
>> 169 list_foreach(bn, d, nb_elts)
>> 170 sos_bochs_printf("%d", d->value);
>> 171 }
>> 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)
111 { 188 {
112 !! 189 if (nb_elts == 0)
113 if ((my_ppage->before[i] != (sos_ui <<
114 || (my_ppage->after[i] != (sos_ <<
115 { 190 {
116 !! 191 sos_x86_videomem_printf(row, x, attribute, "%d.", d->value);
117 sos_x86_videomem_putstring(20, 0 !! 192 x += 2;
118 SOS_X !! 193 }
119 | S !! 194 else if (nb_elts < nb_decimals)
120 "Page !! 195 {
121 return; !! 196 sos_x86_videomem_printf(row, x, attribute, "%d", d->value);
>> 197 x ++;
122 } 198 }
123 } 199 }
124 200
125 !! 201 sos_x86_videomem_printf(row, x, attribute, " . 10^{%d} ", nb_elts-1);
126 if (sos_physmem_unref_physpage((sos_padd !! 202 }
127 { !! 203 }
128 <<
129 sos_x86_videomem_putstring(20, 0, <<
130 SOS_X86_V <<
131 | SOS_X <<
132 "Cannot r <<
133 return; <<
134 } <<
135 204
136 !! 205
137 num_free_ppages ++; !! 206
138 sos_x86_videomem_printf(2, 0, !! 207 big_number_t bn_add (const big_number_t bn1, const big_number_t bn2)
139 SOS_X86_VIDEO_FG !! 208 {
140 | SOS_X86_VIDEO_ !! 209 big_number_t retval;
141 "Could free %d p !! 210 const struct digit *d1, *d2;
142 num_free_ppages) !! 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;
143 } 237 }
>> 238 while (!bn1_end || !bn2_end);
144 239
145 !! 240 if (carry > 0)
146 sos_x86_videomem_printf(2, 0, !! 241 {
147 SOS_X86_VIDEO_FG_LTG !! 242 bn_push_msd(&retval, carry);
148 | SOS_X86_VIDEO_BG_B !! 243 }
149 "Could allocate %d b <<
150 num_alloc_ppages << <<
151 num_free_ppages << S <<
152 244
153 SOS_ASSERT_FATAL(num_alloc_ppages == num_fre !! 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;
>> 271 }
>> 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
154 } 328 }
155 329
156 330
157 331
158 void sos_main(unsigned long magic, unsigned lo 332 void sos_main(unsigned long magic, unsigned long addr)
159 { 333 {
160 unsigned i; 334 unsigned i;
161 sos_paddr_t sos_kernel_core_base_paddr, sos_ 335 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
162 336
163 337
164 338
165 339
166 multiboot_info_t *mbi; 340 multiboot_info_t *mbi;
167 mbi = (multiboot_info_t *) addr; 341 mbi = (multiboot_info_t *) addr;
168 342
169 343
170 sos_bochs_setup(); 344 sos_bochs_setup();
171 345
172 sos_x86_videomem_setup(); 346 sos_x86_videomem_setup();
173 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 347 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
174 348
175 349
176 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 350 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
177 351
178 sos_x86_videomem_printf(1, 0, 352 sos_x86_videomem_printf(1, 0,
179 SOS_X86_VIDEO_FG_Y 353 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
180 "Welcome From GRUB 354 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
181 "SOS", ',', 355 "SOS", ',',
182 (unsigned)(mbi->me 356 (unsigned)(mbi->mem_upper >> 10) + 1,
183 (unsigned)mbi->mem 357 (unsigned)mbi->mem_upper);
184 else 358 else
185 359
186 sos_x86_videomem_printf(1, 0, 360 sos_x86_videomem_printf(1, 0,
187 SOS_X86_VIDEO_FG_Y 361 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
188 "Welcome to SOS"); 362 "Welcome to SOS");
189 363
190 sos_bochs_putstring("Message in a bochs\n"); 364 sos_bochs_putstring("Message in a bochs\n");
191 365
192 366
193 sos_gdt_setup(); 367 sos_gdt_setup();
194 sos_idt_setup(); 368 sos_idt_setup();
195 369
196 370
197 sos_exceptions_setup(); 371 sos_exceptions_setup();
198 sos_irq_setup(); 372 sos_irq_setup();
199 373
200 374
201 sos_i8254_set_frequency(100); 375 sos_i8254_set_frequency(100);
202 376
203 377
204 378
205 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) 379 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
206 { 380 {
207 sos_x86_videomem_putstring(20, 0, 381 sos_x86_videomem_putstring(20, 0,
208 SOS_X86_VIDEO 382 SOS_X86_VIDEO_FG_LTRED
209 | SOS_X86_V 383 | SOS_X86_VIDEO_BG_BLUE
210 | SOS_X86_V 384 | SOS_X86_VIDEO_FG_BLINKING,
211 "I'm not load 385 "I'm not loaded with Grub !");
212 386
213 for (;;) 387 for (;;)
214 continue; 388 continue;
215 } 389 }
216 390
217 391
218 sos_irq_set_routine(SOS_IRQ_TIMER, 392 sos_irq_set_routine(SOS_IRQ_TIMER,
219 clk_it); 393 clk_it);
220 394
221 395
222 asm volatile ("sti\n"); 396 asm volatile ("sti\n");
223 397
224 398
225 399
226 sos_physmem_setup((mbi->mem_upper<<10) + (1< 400 sos_physmem_setup((mbi->mem_upper<<10) + (1<<20),
227 & sos_kernel_core_base_pad 401 & sos_kernel_core_base_paddr,
228 & sos_kernel_core_top_padd 402 & sos_kernel_core_top_paddr);
229 test_physmem(); !! 403
>> 404
>> 405
>> 406
>> 407
>> 408
>> 409
>> 410 if (sos_paging_setup(sos_kernel_core_base_paddr,
>> 411 sos_kernel_core_top_paddr))
>> 412 sos_bochs_printf("Could not setup paged memory mode\n");
>> 413 sos_x86_videomem_printf(2, 0,
>> 414 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 415 "Paged-memory mode is activated");
>> 416
>> 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();
230 427
231 428
232 for (;;) 429 for (;;)
233 continue; 430 continue;
234 431
235 return; 432 return;
236 } 433 }