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