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