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