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