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