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