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