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