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