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