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