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