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