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