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 #include <sos/errno.h> <<
020 <<
021 020
022 #include <bootstrap/multiboot.h> 021 #include <bootstrap/multiboot.h>
023 #include <hwcore/idt.h> 022 #include <hwcore/idt.h>
024 #include <hwcore/gdt.h> 023 #include <hwcore/gdt.h>
025 #include <hwcore/irq.h> 024 #include <hwcore/irq.h>
026 #include <hwcore/exception.h> 025 #include <hwcore/exception.h>
027 #include <hwcore/i8254.h> 026 #include <hwcore/i8254.h>
028 #include <sos/list.h> 027 #include <sos/list.h>
029 #include <sos/physmem.h> 028 #include <sos/physmem.h>
030 #include <hwcore/paging.h> 029 #include <hwcore/paging.h>
031 #include <hwcore/mm_context.h> <<
032 #include <hwcore/swintr.h> <<
033 #include <sos/kmem_vmm.h> 030 #include <sos/kmem_vmm.h>
034 #include <sos/kmalloc.h> 031 #include <sos/kmalloc.h>
035 #include <sos/time.h> <<
036 #include <sos/thread.h> <<
037 #include <sos/process.h> <<
038 #include <sos/umem_vmm.h> <<
039 #include <sos/klibc.h> 032 #include <sos/klibc.h>
040 #include <sos/assert.h> 033 #include <sos/assert.h>
041 #include <drivers/x86_videomem.h> 034 #include <drivers/x86_videomem.h>
042 #include <drivers/bochs.h> 035 #include <drivers/bochs.h>
043 #include <sos/calcload.h> !! 036
044 #include <sos/umem_vmm.h> <<
045 #include <sos/binfmt_elf32.h> <<
046 #include <drivers/zero.h> <<
047 #include <sos/fs.h> <<
048 #include <drivers/fs_virtfs.h> <<
049 #include <drivers/devices.h> <<
050 #include <drivers/mem.h> <<
051 #include <drivers/tty.h> <<
052 #include <drivers/console.h> <<
053 #include <drivers/serial.h> <<
054 #include <sos/blkdev.h> <<
055 #include <sos/fs_pagecache.h> <<
056 #include <drivers/ide.h> <<
057 037
058 038
059 039
060 void display_bits(unsigned char row, unsigned !! 040 static void display_bits(unsigned char row, unsigned char col,
061 unsigned char attribute, !! 041 unsigned char attribute,
062 sos_ui32_t integer) !! 042 sos_ui32_t integer)
063 { 043 {
064 int i; 044 int i;
065 045
066 for (i = 31 ; i >= 0 ; i--) 046 for (i = 31 ; i >= 0 ; i--)
067 { 047 {
068 048
069 int bit_i = (integer & (1 << i)); 049 int bit_i = (integer & (1 << i));
070 050
071 unsigned char ascii_code = bit_i?219:177 051 unsigned char ascii_code = bit_i?219:177;
072 sos_x86_videomem_putchar(row, col++, 052 sos_x86_videomem_putchar(row, col++,
073 attribute, 053 attribute,
074 ascii_code); 054 ascii_code);
075 } 055 }
076 } 056 }
077 057
>> 058
078 059
079 static void clk_it(int intid) 060 static void clk_it(int intid)
080 { 061 {
081 static sos_ui32_t clock_count = 0; 062 static sos_ui32_t clock_count = 0;
082 063
083 display_bits(0, 48, 064 display_bits(0, 48,
084 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 065 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
085 clock_count); 066 clock_count);
086 clock_count++; 067 clock_count++;
087 068
088 !! 069 }
089 sos_time_do_tick(); !! 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
090 081
091 !! 082
092 sos_sched_do_timer_tick(); !! 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);
093 } 090 }
094 091
095 092
096 !! 093
097 !! 094 void bn_push_msd(big_number_t * bn, char value)
098 !! 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 }
099 102
100 103
101 !! 104
102 static void pgflt_ex(int intid, struct sos_cpu !! 105 big_number_t bn_new(unsigned long int i)
103 { 106 {
104 static sos_ui32_t demand_paging_count = 0; !! 107 big_number_t retval;
105 struct sos_thread * cur_thr = sos_thread_get <<
106 sos_vaddr_t faulting_vaddr = sos_cpu_contex <<
107 sos_paddr_t ppage_paddr; <<
108 108
109 if (sos_cpu_context_is_in_user_mode(ctxt) !! 109 list_init(retval);
110 || (cur_thr->fixup_uaccess.return_vaddr) !! 110 do
111 { 111 {
112 __label__ unforce_address_space; !! 112 bn_push_msd(&retval, i%10);
113 sos_bool_t need_to_setup_mmu; !! 113 i /= 10;
114 sos_ui32_t errcode = sos_cpu_context_get !! 114 }
115 !! 115 while (i != 0);
116 <<
117 <<
118 need_to_setup_mmu = (cur_thr->squatted_m <<
119 != sos_process_get_ <<
120 if (need_to_setup_mmu) <<
121 sos_thread_prepare_user_space_access(N <<
122 116
123 if (SOS_OK == !! 117 return retval;
124 sos_umem_vmm_try_resolve_page_fault( !! 118 }
125 <<
126 <<
127 goto unforce_address_space; <<
128 119
129 <<
130 <<
131 if (! sos_cpu_context_is_in_user_mode(ct <<
132 { <<
133 cur_thr->fixup_uaccess.faulted_uaddr <<
134 sos_cpu_context_set_EX_return_addres <<
135 <<
136 goto unforce_address_space; <<
137 } <<
138 120
139 if (need_to_setup_mmu) !! 121
140 sos_thread_end_user_space_access(); !! 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;
141 127
142 sos_bochs_printf("\e[35mTHR %p: Unresolv !! 128 list_init(retval);
143 (void*)sos_thread_get_c !! 129 list_foreach(bn, d, nb_elts)
144 sos_cpu_context_get_PC( !! 130 {
145 (unsigned)faulting_vadd !! 131 bn_push_lsd(&retval, d->value);
146 (unsigned)sos_cpu_conte <<
147 sos_bochs_printf("Terminating User threa <<
148 sos_thread_exit(); <<
149 <<
150 unforce_address_space: <<
151 if (need_to_setup_mmu) <<
152 sos_thread_end_user_space_access(); <<
153 return; <<
154 } <<
155 <<
156 <<
157 if (! sos_kmem_vmm_is_valid_vaddr(faulting_v <<
158 { <<
159 <<
160 <<
161 sos_display_fatal_error("Unresolved page <<
162 sos_cpu_context_ <<
163 (unsigned)faulti <<
164 (unsigned)sos_cp <<
165 SOS_ASSERT_FATAL(! "Got page fault (note <<
166 } 132 }
167 133
>> 134 return retval;
>> 135 }
168 136
169 <<
170 <<
171 <<
172 <<
173 <<
174 demand_paging_count ++; <<
175 display_bits(0, 0, <<
176 SOS_X86_VIDEO_FG_LTRED | SOS_X8 <<
177 demand_paging_count); <<
178 <<
179 <<
180 ppage_paddr = sos_physmem_ref_physpage_new(F <<
181 if (! ppage_paddr) <<
182 SOS_ASSERT_FATAL(! "TODO: implement swap. <<
183 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(pp <<
184 SO <<
185 FA <<
186 SO <<
187 | <<
188 | <<
189 sos_physmem_unref_physpage(ppage_paddr); <<
190 <<
191 <<
192 } <<
193 <<
194 <<
195 <<
196 <<
197 <<
198 <<
199 <<
200 static void idle_thread(void* unused) __attrib <<
201 static void idle_thread(void* unused) <<
202 { <<
203 sos_ui32_t idle_twiddle = 0; <<
204 <<
205 while (1) <<
206 { <<
207 <<
208 <<
209 asm("hlt\n"); <<
210 <<
211 idle_twiddle ++; <<
212 display_bits(0, 0, SOS_X86_VIDEO_FG_GREE <<
213 idle_twiddle); <<
214 <<
215 <<
216 sos_thread_yield(); <<
217 } <<
218 } <<
219 <<
220 <<
221 <<
222 <<
223 <<
224 #define LOAD_DISPLAY_BASELINE 4 <<
225 #define LOAD_DISPLAY_STARTROW 34 <<
226 static void stat_thread(void * unused) __attri <<
227 static void stat_thread(void * unused) <<
228 { <<
229 while (1) <<
230 { <<
231 sos_ui32_t flags; <<
232 sos_ui32_t load1, load5, load15; <<
233 char str1[11], str5[11], str15[11]; <<
234 struct sos_time t; <<
235 t.sec = 1; <<
236 t.nanosec = 0; <<
237 <<
238 sos_thread_sleep(& t); <<
239 <<
240 sos_disable_IRQs(flags); <<
241 <<
242 <<
243 sos_load_get_sload(&load1, &load5, &load <<
244 sos_load_to_string(str1, load1); <<
245 sos_load_to_string(str5, load5); <<
246 sos_load_to_string(str15, load15); <<
247 sos_x86_videomem_printf(LOAD_DISPLAY_BAS <<
248 SOS_X86_VIDEO_FG <<
249 "Kernel (- Idle) <<
250 str1, str5, str1 <<
251 <<
252 sos_load_get_uload(&load1, &load5, &load <<
253 sos_load_to_string(str1, load1); <<
254 sos_load_to_string(str5, load5); <<
255 sos_load_to_string(str15, load15); <<
256 sos_x86_videomem_printf(LOAD_DISPLAY_BAS <<
257 SOS_X86_VIDEO_FG <<
258 "User: %s %s %s <<
259 str1, str5, str1 <<
260 <<
261 sos_load_get_uratio(&load1, &load5, &loa <<
262 sos_load_to_string(str1, load1); <<
263 sos_load_to_string(str5, load5); <<
264 sos_load_to_string(str15, load15); <<
265 sos_x86_videomem_printf(LOAD_DISPLAY_BAS <<
266 SOS_X86_VIDEO_FG <<
267 "User CPU %%: %s <<
268 str1, str5, str1 <<
269 <<
270 <<
271 sos_load_get_sratio(&load1, &load5, &loa <<
272 sos_load_to_string(str1, load1); <<
273 sos_load_to_string(str5, load5); <<
274 sos_load_to_string(str15, load15); <<
275 sos_x86_videomem_printf(LOAD_DISPLAY_BAS <<
276 SOS_X86_VIDEO_FG <<
277 "Kernel CPU %% ( <<
278 str1, str5, str1 <<
279 sos_restore_IRQs(flags); <<
280 } <<
281 } <<
282 <<
283 <<
284 <<
285 <<
286 <<
287 static sos_ret_t <<
288 start_init(struct sos_fs_manager_instance * ro <<
289 { <<
290 sos_ret_t retval; <<
291 struct sos_umem_vmm_as *as_init; <<
292 struct sos_process *proc_init; <<
293 struct sos_thread *new_thr; <<
294 sos_uaddr_t ustack, start_uaddr; <<
295 struct sos_fs_opened_file * init_root, * ini <<
296 <<
297 <<
298 proc_init = sos_process_create("init", FALSE <<
299 if (! proc_init) <<
300 return -SOS_ENOMEM; <<
301 as_init = sos_process_get_address_space(proc <<
302 137
>> 138
>> 139 void bn_del(big_number_t * bn)
>> 140 {
>> 141 struct digit *d;
303 142
304 !! 143 list_collapse(*bn, d)
305 <<
306 <<
307 <<
308 <<
309 retval = sos_fs_new_opened_file(proc_init, r <<
310 SOS_FS_OPEN_ <<
311 & init_root) <<
312 if (SOS_OK != retval) <<
313 { 144 {
314 sos_process_unref(proc_init); !! 145 sos_kfree((sos_vaddr_t)d);
315 return -SOS_ENOENT; <<
316 } 146 }
>> 147 }
317 148
318 !! 149
319 !! 150
320 retval = sos_fs_duplicate_opened_file(init_r !! 151 void bn_shift(big_number_t *bn, int shift)
321 & init !! 152 {
322 if (SOS_OK != retval) !! 153 for ( ; shift > 0 ; shift --)
323 { 154 {
324 sos_fs_close(init_root); !! 155 bn_push_lsd(bn, 0);
325 sos_process_unref(proc_init); <<
326 return -SOS_ENOENT; <<
327 } 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 }
328 172
329 !! 173
330 if ( ( SOS_OK != sos_process_chroot(proc_ini !! 174 void bn_print_console(unsigned char row, unsigned char col,
331 || ( SOS_OK != sos_process_chdir(proc_i !! 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
332 { 182 {
333 sos_fs_close(init_root); !! 183 int nb_elts;
334 sos_fs_close(init_cwd); !! 184 const struct digit *d;
335 sos_process_chroot(proc_init, NULL, & un !! 185 unsigned char x = col;
336 sos_process_chdir(proc_init, NULL, & unu !! 186
337 sos_process_unref(proc_init); !! 187 list_foreach(bn, d, nb_elts)
338 return -SOS_ENOENT; !! 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);
339 } 202 }
>> 203 }
340 204
341 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);
342 239
343 !! 240 if (carry > 0)
344 start_uaddr = sos_binfmt_elf32_map(as_init, <<
345 if (0 == start_uaddr) <<
346 { 241 {
347 sos_process_unref(proc_init); !! 242 bn_push_msd(&retval, carry);
348 return -SOS_ENOENT; <<
349 } 243 }
350 244
351 !! 245 return retval;
352 ustack = (SOS_PAGING_TOP_USER_ADDRESS - SOS_ !! 246 }
353 retval = sos_dev_zero_map(as_init, &ustack, !! 247
354 SOS_VM_MAP_PROT_RE !! 248
355 0); !! 249
356 if (SOS_OK != retval) !! 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)
357 { 259 {
358 sos_process_unref(proc_init); !! 260 carry += d->value * digit;
359 return -SOS_ENOMEM; !! 261 bn_push_msd(&retval, carry % 10);
>> 262 carry /= 10;
360 } 263 }
361 264
362 !! 265 if (carry > 0)
363 new_thr = sos_create_user_thread(NULL, <<
364 proc_init, <<
365 start_uaddr <<
366 0, 0, <<
367 ustack + SO <<
368 SOS_SCHED_P <<
369 if (! new_thr) <<
370 { 266 {
371 sos_process_unref(proc_init); !! 267 bn_push_msd(&retval, carry);
372 return -SOS_ENOMEM; !! 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;
373 } 315 }
374 316
375 sos_process_unref(proc_init); !! 317 return retval;
376 return SOS_OK; <<
377 } 318 }
378 319
379 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
380 330
381 !! 331
382 !! 332 void sos_main(unsigned long magic, unsigned long addr)
383 <<
384 void sos_main(unsigned long magic, unsigned lo <<
385 __attribute__((noreturn)); <<
386 void sos_main(unsigned long magic, unsigned lo <<
387 { 333 {
>> 334 unsigned i;
388 sos_paddr_t sos_kernel_core_base_paddr, sos_ 335 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
389 struct sos_time tick_resolution; <<
390 struct sos_fs_manager_instance * rootfs; <<
391 336
392 !! 337
393 unsigned long int upper_mem = 0; !! 338
>> 339
>> 340 multiboot_info_t *mbi;
>> 341 mbi = (multiboot_info_t *) addr;
394 342
395 343
396 sos_bochs_subsystem_setup(); !! 344 sos_bochs_setup();
397 345
398 sos_x86_videomem_setup(); 346 sos_x86_videomem_setup();
399 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 347 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
400 348
401 349
402 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 350 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
403 { !! 351
404 !! 352 sos_x86_videomem_printf(1, 0,
405 !! 353 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
406 !! 354 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
407 multiboot_info_t *mbi = (multiboot_info_ !! 355 "SOS", ',',
408 !! 356 (unsigned)(mbi->mem_upper >> 10) + 1,
409 !! 357 (unsigned)mbi->mem_upper);
410 <<
411 <<
412 <<
413 upper_mem = mbi->mem_upper; <<
414 sos_x86_videomem_printf(1, 0, <<
415 SOS_X86_VIDEO_FG <<
416 "Welcome From GR <<
417 "SOS article 9.5 <<
418 (unsigned)(upper <<
419 (unsigned)upper_ <<
420 } <<
421 else if (magic == 0x42244224) <<
422 { <<
423 <<
424 upper_mem = arg; <<
425 sos_x86_videomem_printf(1, 0, <<
426 SOS_X86_VIDEO_FG <<
427 "Welcome to %s%c <<
428 "SOS article 9.5 <<
429 (unsigned)(upper <<
430 (unsigned)upper_ <<
431 } <<
432 else 358 else
433 !! 359
434 sos_x86_videomem_printf(1, 0, 360 sos_x86_videomem_printf(1, 0,
435 SOS_X86_VIDEO_FG_Y 361 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
436 "Welcome to SOS ar !! 362 "Welcome to SOS");
437 363
438 sos_bochs_putstring("Message in a bochs: Thi !! 364 sos_bochs_putstring("Message in a bochs\n");
439 365
440 366
441 sos_gdt_subsystem_setup(); !! 367 sos_gdt_setup();
442 sos_idt_subsystem_setup(); !! 368 sos_idt_setup();
443 369
444 370
445 sos_exception_subsystem_setup(); !! 371 sos_exceptions_setup();
446 sos_irq_subsystem_setup(); !! 372 sos_irq_setup();
447 373
448 374
449 sos_i8254_set_frequency(100); 375 sos_i8254_set_frequency(100);
450 376
451 <<
452 <<
453 tick_resolution = (struct sos_time) { .sec=0 <<
454 sos_time_subsysem_setup(& tick_resolution); <<
455 377
456 !! 378
457 if (upper_mem == 0) !! 379 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
458 { 380 {
459 sos_x86_videomem_putstring(20, 0, 381 sos_x86_videomem_putstring(20, 0,
460 SOS_X86_VIDEO 382 SOS_X86_VIDEO_FG_LTRED
461 | SOS_X86_V 383 | SOS_X86_VIDEO_BG_BLUE
462 | SOS_X86_V 384 | SOS_X86_VIDEO_FG_BLINKING,
463 "I don't know !! 385 "I'm not loaded with Grub !");
464 386
465 for (;;) 387 for (;;)
466 continue; 388 continue;
467 } 389 }
468 390
469 <<
470 <<
471 <<
472 <<
473 391
474 sos_irq_set_routine(SOS_IRQ_TIMER, 392 sos_irq_set_routine(SOS_IRQ_TIMER,
475 clk_it); !! 393 clk_it);
476 !! 394
477 !! 395
478 !! 396 asm volatile ("sti\n");
479 !! 397
480 !! 398
481 SOS_ASSERT_FATAL(SOS_OK !! 399
482 == sos_physmem_subsystem_se !! 400 sos_physmem_setup((mbi->mem_upper<<10) + (1<<20),
483 !! 401 & sos_kernel_core_base_paddr,
484 !! 402 & sos_kernel_core_top_paddr);
485 403
486 404
487 405
488 406
489 407
490 408
491 409
492 SOS_ASSERT_FATAL(SOS_OK == !! 410 if (sos_paging_setup(sos_kernel_core_base_paddr,
493 sos_paging_subsystem_setup( !! 411 sos_kernel_core_top_paddr))
494 !! 412 sos_bochs_printf("Could not setup paged memory mode\n");
495 !! 413 sos_x86_videomem_printf(2, 0,
496 !! 414 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
497 sos_exception_set_routine(SOS_EXCEPT_PAGE_FA !! 415 "Paged-memory mode is activated");
498 pgflt_ex); <<
499 416
500 <<
501 <<
502 <<
503 417
504 if (sos_kmem_vmm_subsystem_setup(sos_kernel_ !! 418 if (sos_kmem_vmm_setup(sos_kernel_core_base_paddr,
505 sos_kernel_ !! 419 sos_kernel_core_top_paddr))
506 bootstrap_s <<
507 bootstrap_s <<
508 + bootstrap <<
509 sos_bochs_printf("Could not setup the Kern 420 sos_bochs_printf("Could not setup the Kernel virtual space allocator\n");
510 421
511 if (sos_kmalloc_subsystem_setup()) !! 422 if (sos_kmalloc_setup())
512 sos_bochs_printf("Could not setup the Kmal 423 sos_bochs_printf("Could not setup the Kmalloc subsystem\n");
513 424
514 !! 425
515 !! 426 bn_test();
516 <<
517 sos_mm_context_subsystem_setup(); <<
518 <<
519 <<
520 <<
521 <<
522 sos_cpu_context_subsystem_setup(); <<
523 <<
524 <<
525 <<
526 <<
527 sos_swintr_subsystem_setup(); <<
528 <<
529 <<
530 <<
531 <<
532 <<
533 <<
534 <<
535 sos_thread_subsystem_setup(bootstrap_stack_b <<
536 bootstrap_stack_s <<
537 <<
538 <<
539 sos_sched_subsystem_setup(); <<
540 <<
541 <<
542 SOS_ASSERT_FATAL(sos_create_kernel_thread("i <<
543 SO <<
544 <<
545 <<
546 sos_load_subsystem_setup(); <<
547 <<
548 <<
549 SOS_ASSERT_FATAL(sos_create_kernel_thread("s <<
550 NU <<
551 SO <<
552 <<
553 <<
554 <<
555 <<
556 <<
557 sos_umem_vmm_subsystem_setup(); <<
558 sos_dev_zero_subsystem_setup(); <<
559 <<
560 <<
561 sos_fs_pagecache_subsystem_setup(); <<
562 sos_blockdev_subsystem_setup(); <<
563 sos_dev_mem_chardev_setup(); <<
564 <<
565 <<
566 <<
567 <<
568 sos_process_subsystem_setup(); <<
569 <<
570 <<
571 <<
572 <<
573 asm volatile ("sti\n"); <<
574 <<
575 <<
576 SOS_ASSERT_FATAL(SOS_OK == sos_fs_virtfs_sub <<
577 SOS_ASSERT_FATAL(SOS_OK == sos_fs_subsystem_ <<
578 <<
579 <<
580 <<
581 427
>> 428
>> 429 for (;;)
>> 430 continue;
582 431
583 tty_subsystem_setup(); !! 432 return;
584 sos_ttyS0_subsystem_setup(); <<
585 sos_console_subsystem_setup(); <<
586 <<
587 <<
588 sos_ide_subsystem_setup(); <<
589 <<
590 <<
591 <<
592 <<
593 <<
594 start_init(rootfs); <<
595 <<
596 <<
597 <<
598 <<
599 <<
600 <<
601 <<
602 <<
603 <<
604 <<
605 <<
606 <<
607 sos_bochs_printf("Bye from primary thread !\ <<
608 sos_thread_exit(); <<
609 SOS_FATAL_ERROR("No trespassing !"); <<
610 } 433 }