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