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 019
020 020
021 #include <bootstrap/multiboot.h> 021 #include <bootstrap/multiboot.h>
022 #include <hwcore/idt.h> 022 #include <hwcore/idt.h>
023 #include <hwcore/gdt.h> 023 #include <hwcore/gdt.h>
024 #include <hwcore/irq.h> 024 #include <hwcore/irq.h>
025 #include <hwcore/exception.h> 025 #include <hwcore/exception.h>
026 #include <hwcore/i8254.h> 026 #include <hwcore/i8254.h>
027 #include <sos/list.h> <<
028 #include <sos/physmem.h> <<
029 #include <hwcore/paging.h> <<
030 #include <sos/list.h> <<
031 #include <sos/klibc.h> 027 #include <sos/klibc.h>
032 #include <sos/assert.h> 028 #include <sos/assert.h>
033 #include <drivers/x86_videomem.h> 029 #include <drivers/x86_videomem.h>
034 #include <drivers/bochs.h> 030 #include <drivers/bochs.h>
035 031
036 032
037 033
038 034
039 static void display_bits(unsigned char row, un 035 static void display_bits(unsigned char row, unsigned char col,
040 unsigned char attribu 036 unsigned char attribute,
041 sos_ui32_t integer) 037 sos_ui32_t integer)
042 { 038 {
043 int i; 039 int i;
044 040
045 for (i = 31 ; i >= 0 ; i--) 041 for (i = 31 ; i >= 0 ; i--)
046 { 042 {
047 043
048 int bit_i = (integer & (1 << i)); 044 int bit_i = (integer & (1 << i));
049 045
050 unsigned char ascii_code = bit_i?219:177 046 unsigned char ascii_code = bit_i?219:177;
051 sos_x86_videomem_putchar(row, col++, 047 sos_x86_videomem_putchar(row, col++,
052 attribute, 048 attribute,
053 ascii_code); 049 ascii_code);
054 } 050 }
055 } 051 }
056 052
057 053
058 054
059 static void clk_it(int intid) 055 static void clk_it(int intid)
060 { 056 {
061 static sos_ui32_t clock_count = 0; 057 static sos_ui32_t clock_count = 0;
062 058
063 display_bits(0, 48, 059 display_bits(0, 48,
064 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 060 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
065 clock_count); 061 clock_count);
066 clock_count++; 062 clock_count++;
067 063
068 } 064 }
069 065
070 !! 066
071 static void pgflt_ex(int exid) !! 067 static void divide_ex(int exid)
072 { 068 {
073 sos_bochs_printf("Got page fault\n"); !! 069 static sos_ui32_t div_count = 0;
074 sos_x86_videomem_printf(10, 30, !! 070 display_bits(0, 0,
075 SOS_X86_VIDEO_FG_LTR !! 071 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
076 "Got EXPECTED (?) Pa !! 072 div_count);
077 for (;;) ; !! 073 div_count++;
078 } <<
079 <<
080 static void test_paging(sos_vaddr_t sos_kernel <<
081 { <<
082 <<
083 <<
084 sos_vaddr_t vpage_code = SOS_PAGE_ALIGN_INF( <<
085 <<
086 <<
087 sos_paddr_t ppage_new; <<
088 <<
089 <<
090 <<
091 sos_vaddr_t vpage_tmp = sos_kernel_core_top_ <<
092 <<
093 unsigned i; <<
094 <<
095 <<
096 sos_exception_set_routine(SOS_EXCEPT_PAGE_FA <<
097 pgflt_ex); <<
098 <<
099 <<
100 <<
101 <<
102 <<
103 sos_x86_videomem_printf(4, 0, <<
104 SOS_X86_VIDEO_FG_LTG <<
105 "Moving current code <<
106 <<
107 <<
108 <<
109 ppage_new = sos_physmem_ref_physpage_new(FAL <<
110 if (! ppage_new) <<
111 { <<
112 <<
113 sos_x86_videomem_putstring(20, 0, <<
114 SOS_X86_VIDEO <<
115 | SOS_X86_V <<
116 "test_paging <<
117 return; <<
118 } <<
119 <<
120 sos_x86_videomem_printf(5, 0, <<
121 SOS_X86_VIDEO_FG_YEL <<
122 "Hello from the addr <<
123 sos_paging_get_paddr <<
124 <<
125 sos_x86_videomem_printf(6, 0, <<
126 SOS_X86_VIDEO_FG_YEL <<
127 "Transfer vpage 0x%x <<
128 vpage_code, <<
129 sos_paging_get_paddr <<
130 ppage_new, <<
131 (unsigned)vpage_tmp) <<
132 <<
133 <<
134 <<
135 sos_paging_map(ppage_new, vpage_tmp, <<
136 FALSE, <<
137 SOS_VM_MAP_ATOMIC <<
138 | SOS_VM_MAP_PROT_READ <<
139 | SOS_VM_MAP_PROT_WRITE); <<
140 <<
141 <<
142 <<
143 sos_physmem_unref_physpage(ppage_new); <<
144 <<
145 <<
146 <<
147 memcpy((void*)vpage_tmp, <<
148 (void*)vpage_code, <<
149 SOS_PAGE_SIZE); <<
150 <<
151 <<
152 sos_paging_map(ppage_new, vpage_code, <<
153 FALSE, <<
154 SOS_VM_MAP_ATOMIC <<
155 | SOS_VM_MAP_PROT_READ <<
156 | SOS_VM_MAP_PROT_WRITE); <<
157 <<
158 <<
159 <<
160 <<
161 <<
162 <<
163 <<
164 <<
165 sos_paging_unmap(vpage_tmp); <<
166 <<
167 sos_x86_videomem_printf(7, 0, <<
168 SOS_X86_VIDEO_FG_YEL <<
169 "Hello from the addr <<
170 sos_paging_get_paddr <<
171 <<
172 sos_x86_videomem_printf(9, 0, <<
173 SOS_X86_VIDEO_FG_LTG <<
174 "Provoking a page fa <<
175 <<
176 <<
177 <<
178 <<
179 <<
180 <<
181 <<
182 <<
183 <<
184 for (i = vpage_code ; ; i += SOS_ <<
185 { <<
186 unsigned *pint = (unsigned *)SOS_PAGE_AL <<
187 sos_bochs_printf("Test vaddr 0x%x : val= <<
188 sos_x86_videomem_printf(10, 0, <<
189 SOS_X86_VIDEO_FG <<
190 "Test vaddr 0x%x <<
191 (unsigned)pint); <<
192 sos_bochs_printf("0x%x\n", *pint); <<
193 sos_x86_videomem_printf(10, 30, <<
194 SOS_X86_VIDEO_FG <<
195 "0x%x " <<
196 } <<
197 <<
198 <<
199 sos_x86_videomem_printf(20, 0, <<
200 SOS_X86_VIDEO_FG_LTR <<
201 "We should have had <<
202 vpage_tmp); <<
203 } 074 }
204 075
205 076
206 void sos_main(unsigned long magic, unsigned lo 077 void sos_main(unsigned long magic, unsigned long addr)
207 { 078 {
208 unsigned i; 079 unsigned i;
209 sos_paddr_t sos_kernel_core_base_paddr, sos_ <<
210 080
211 081
212 082
213 083
214 multiboot_info_t *mbi; 084 multiboot_info_t *mbi;
215 mbi = (multiboot_info_t *) addr; 085 mbi = (multiboot_info_t *) addr;
216 086
217 087
218 sos_bochs_setup(); 088 sos_bochs_setup();
219 089
220 sos_x86_videomem_setup(); 090 sos_x86_videomem_setup();
221 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 091 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
222 092
223 093
224 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 094 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
225 095
226 sos_x86_videomem_printf(1, 0, 096 sos_x86_videomem_printf(1, 0,
227 SOS_X86_VIDEO_FG_Y 097 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
228 "Welcome From GRUB 098 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
229 "SOS", ',', 099 "SOS", ',',
230 (unsigned)(mbi->me 100 (unsigned)(mbi->mem_upper >> 10) + 1,
231 (unsigned)mbi->mem 101 (unsigned)mbi->mem_upper);
232 else 102 else
233 103
234 sos_x86_videomem_printf(1, 0, 104 sos_x86_videomem_printf(1, 0,
235 SOS_X86_VIDEO_FG_Y 105 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
236 "Welcome to SOS"); 106 "Welcome to SOS");
237 107
238 sos_bochs_putstring("Message in a bochs\n"); 108 sos_bochs_putstring("Message in a bochs\n");
239 109
240 110
241 sos_gdt_setup(); 111 sos_gdt_setup();
242 sos_idt_setup(); 112 sos_idt_setup();
243 113
244 114
245 sos_exceptions_setup(); 115 sos_exceptions_setup();
246 sos_irq_setup(); 116 sos_irq_setup();
247 117
248 118
249 sos_i8254_set_frequency(100); 119 sos_i8254_set_frequency(100);
250 120
251 <<
252 <<
253 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) <<
254 { <<
255 sos_x86_videomem_putstring(20, 0, <<
256 SOS_X86_VIDEO <<
257 | SOS_X86_V <<
258 | SOS_X86_V <<
259 "I'm not load <<
260 <<
261 for (;;) <<
262 continue; <<
263 } <<
264 <<
265 121
266 sos_irq_set_routine(SOS_IRQ_TIMER, 122 sos_irq_set_routine(SOS_IRQ_TIMER,
267 clk_it); 123 clk_it);
>> 124 sos_exception_set_routine(SOS_EXCEPT_DIVIDE_ERROR,
>> 125 divide_ex);
268 126
269 127
270 asm volatile ("sti\n"); 128 asm volatile ("sti\n");
271 !! 129
272 !! 130
273 !! 131
274 sos_physmem_setup((mbi->mem_upper<<10) + (1< !! 132
275 & sos_kernel_core_base_pad !! 133
276 & sos_kernel_core_top_padd !! 134 i = 10;
277 !! 135 while (1)
278 !! 136 {
279 !! 137
280 !! 138 sos_bochs_printf("i = 1 / %d...\n", i);
281 !! 139 i = 1 / i;
282 !! 140 }
283 !! 141
284 if (sos_paging_setup(sos_kernel_core_base_pa !! 142
285 sos_kernel_core_top_pad !! 143
286 sos_bochs_printf("Could not setup paged me !! 144
287 sos_x86_videomem_printf(2, 0, !! 145
288 SOS_X86_VIDEO_FG_YEL !! 146 sos_x86_videomem_putstring(2, 0,
289 "Paged-memory mode i !! 147 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
290 !! 148 "Invisible");
291 test_paging(sos_kernel_core_top_paddr); <<
292 <<
293 <<
294 for (;;) <<
295 continue; <<
296 149
297 return; 150 return;
298 } 151 }