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