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> <<
028 #include <sos/physmem.h> <<
029 #include <hwcore/paging.h> <<
030 #include <sos/kmem_vmm.h> <<
031 #include <sos/kmalloc.h> <<
032 #include <sos/klibc.h> 027 #include <sos/klibc.h>
033 #include <sos/assert.h> 028 #include <sos/assert.h>
034 #include <drivers/x86_videomem.h> 029 #include <drivers/x86_videomem.h>
035 #include <drivers/bochs.h> 030 #include <drivers/bochs.h>
036 031
037 032
038 033
039 034
040 static void display_bits(unsigned char row, un 035 static void display_bits(unsigned char row, unsigned char col,
041 unsigned char attribu 036 unsigned char attribute,
042 sos_ui32_t integer) 037 sos_ui32_t integer)
043 { 038 {
044 int i; 039 int i;
045 040
046 for (i = 31 ; i >= 0 ; i--) 041 for (i = 31 ; i >= 0 ; i--)
047 { 042 {
048 043
049 int bit_i = (integer & (1 << i)); 044 int bit_i = (integer & (1 << i));
050 045
051 unsigned char ascii_code = bit_i?219:177 046 unsigned char ascii_code = bit_i?219:177;
052 sos_x86_videomem_putchar(row, col++, 047 sos_x86_videomem_putchar(row, col++,
053 attribute, 048 attribute,
054 ascii_code); 049 ascii_code);
055 } 050 }
056 } 051 }
057 052
058 053
059 054
060 static void clk_it(int intid) 055 static void clk_it(int intid)
061 { 056 {
062 static sos_ui32_t clock_count = 0; 057 static sos_ui32_t clock_count = 0;
063 058
064 display_bits(0, 48, 059 display_bits(0, 48,
065 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 060 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
066 clock_count); 061 clock_count);
067 clock_count++; 062 clock_count++;
068 063
069 } 064 }
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(struc <<
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(struc <<
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; <<
108 <<
109 list_init(retval); <<
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) <<
123 { <<
124 big_number_t retval; <<
125 int nb_elts; <<
126 struct digit *d; <<
127 <<
128 list_init(retval); <<
129 list_foreach(bn, d, nb_elts) <<
130 { <<
131 bn_push_lsd(&retval, d->value); <<
132 } <<
133 <<
134 return retval; <<
135 } <<
136 <<
137 <<
138 <<
139 void bn_del(big_number_t * bn) <<
140 { <<
141 struct digit *d; <<
142 <<
143 list_collapse(*bn, d) <<
144 { <<
145 sos_kfree((sos_vaddr_t)d); <<
146 } <<
147 } <<
148 <<
149 <<
150 <<
151 void bn_shift(big_number_t *bn, int shift) <<
152 { <<
153 for ( ; shift > 0 ; shift --) <<
154 { <<
155 bn_push_lsd(bn, 0); <<
156 } <<
157 } <<
158 <<
159 <<
160 <<
161 void bn_print_bochs(const big_number_t bn) <<
162 { <<
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, unsig <<
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, attribut <<
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, <<
192 x += 2; <<
193 } <<
194 else if (nb_elts < nb_decimals) <<
195 { <<
196 sos_x86_videomem_printf(row, x, <<
197 x ++; <<
198 } <<
199 } <<
200 <<
201 sos_x86_videomem_printf(row, x, attribut <<
202 } <<
203 } <<
204 <<
205 <<
206 <<
207 big_number_t bn_add (const big_number_t bn1, c <<
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 065
245 return retval; !! 066
246 } !! 067 static void divide_ex(int exid)
247 <<
248 <<
249 <<
250 big_number_t bn_muli (const big_number_t bn, c <<
251 { 068 {
252 big_number_t retval; !! 069 static sos_ui32_t div_count = 0;
253 int nb_elts; !! 070 display_bits(0, 0,
254 char carry = 0; !! 071 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
255 const struct digit *d; !! 072 div_count);
256 !! 073 div_count++;
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 } 074 }
272 075
273 <<
274 <<
275 big_number_t bn_mult(const big_number_t bn1, c <<
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->v <<
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 <<
309 "%d! = ", (int)i <<
310 bn_print_console(4, 8, SOS_X86_VIDEO_BG_ <<
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 <<
331 076
332 void sos_main(unsigned long magic, unsigned lo 077 void sos_main(unsigned long magic, unsigned long addr)
333 { 078 {
334 unsigned i; 079 unsigned i;
335 sos_paddr_t sos_kernel_core_base_paddr, sos_ <<
336 080
337 081
338 082
339 083
340 multiboot_info_t *mbi; 084 multiboot_info_t *mbi;
341 mbi = (multiboot_info_t *) addr; 085 mbi = (multiboot_info_t *) addr;
342 086
343 087
344 sos_bochs_setup(); 088 sos_bochs_setup();
345 089
346 sos_x86_videomem_setup(); 090 sos_x86_videomem_setup();
347 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 091 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
348 092
349 093
350 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 094 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
351 095
352 sos_x86_videomem_printf(1, 0, 096 sos_x86_videomem_printf(1, 0,
353 SOS_X86_VIDEO_FG_Y 097 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
354 "Welcome From GRUB 098 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
355 "SOS", ',', 099 "SOS", ',',
356 (unsigned)(mbi->me 100 (unsigned)(mbi->mem_upper >> 10) + 1,
357 (unsigned)mbi->mem 101 (unsigned)mbi->mem_upper);
358 else 102 else
359 103
360 sos_x86_videomem_printf(1, 0, 104 sos_x86_videomem_printf(1, 0,
361 SOS_X86_VIDEO_FG_Y 105 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
362 "Welcome to SOS"); 106 "Welcome to SOS");
363 107
364 sos_bochs_putstring("Message in a bochs\n"); 108 sos_bochs_putstring("Message in a bochs\n");
365 109
366 110
367 sos_gdt_setup(); 111 sos_gdt_setup();
368 sos_idt_setup(); 112 sos_idt_setup();
369 113
370 114
371 sos_exceptions_setup(); 115 sos_exceptions_setup();
372 sos_irq_setup(); 116 sos_irq_setup();
373 117
374 118
375 sos_i8254_set_frequency(100); 119 sos_i8254_set_frequency(100);
376 120
377 <<
378 <<
379 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) <<
380 { <<
381 sos_x86_videomem_putstring(20, 0, <<
382 SOS_X86_VIDEO <<
383 | SOS_X86_V <<
384 | SOS_X86_V <<
385 "I'm not load <<
386 <<
387 for (;;) <<
388 continue; <<
389 } <<
390 <<
391 121
392 sos_irq_set_routine(SOS_IRQ_TIMER, 122 sos_irq_set_routine(SOS_IRQ_TIMER,
393 clk_it); 123 clk_it);
>> 124 sos_exception_set_routine(SOS_EXCEPT_DIVIDE_ERROR,
>> 125 divide_ex);
394 126
395 127
396 asm volatile ("sti\n"); 128 asm volatile ("sti\n");
397 !! 129
398 !! 130
399 !! 131
400 sos_physmem_setup((mbi->mem_upper<<10) + (1< !! 132
401 & sos_kernel_core_base_pad !! 133
402 & sos_kernel_core_top_padd !! 134 i = 10;
403 !! 135 while (1)
404 !! 136 {
405 !! 137
406 !! 138 sos_bochs_printf("i = 1 / %d...\n", i);
407 !! 139 i = 1 / i;
408 !! 140 }
409 !! 141
410 if (sos_paging_setup(sos_kernel_core_base_pa !! 142
411 sos_kernel_core_top_pad !! 143
412 sos_bochs_printf("Could not setup paged me !! 144
413 sos_x86_videomem_printf(2, 0, !! 145
414 SOS_X86_VIDEO_FG_YEL !! 146 sos_x86_videomem_putstring(2, 0,
415 "Paged-memory mode i !! 147 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
416 !! 148 "Invisible");
417 <<
418 if (sos_kmem_vmm_setup(sos_kernel_core_base_ <<
419 sos_kernel_core_top_p <<
420 sos_bochs_printf("Could not setup the Kern <<
421 <<
422 if (sos_kmalloc_setup()) <<
423 sos_bochs_printf("Could not setup the Kmal <<
424 <<
425 <<
426 bn_test(); <<
427 <<
428 <<
429 for (;;) <<
430 continue; <<
431 149
432 return; 150 return;
433 } 151 }