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