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