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