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