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