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