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