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