001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021 #include <bootstrap/multiboot.h>
022 #include <hwcore/idt.h>
023 #include <hwcore/gdt.h>
024 #include <hwcore/irq.h>
025 #include <hwcore/exception.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>
032 #include <sos/assert.h>
033 #include <drivers/x86_videomem.h>
034 #include <drivers/bochs.h>
035
036
037
038
039 static void display_bits(unsigned char row, unsigned char col,
040 unsigned char attribute,
041 sos_ui32_t integer)
042 {
043 int i;
044
045 for (i = 31 ; i >= 0 ; i--)
046 {
047
048 int bit_i = (integer & (1 << i));
049
050 unsigned char ascii_code = bit_i?219:177;
051 sos_x86_videomem_putchar(row, col++,
052 attribute,
053 ascii_code);
054 }
055 }
056
057
058
059 static void clk_it(int intid)
060 {
061 static sos_ui32_t clock_count = 0;
062
063 display_bits(0, 48,
064 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
065 clock_count);
066 clock_count++;
067
068 }
069
070
071 static void pgflt_ex(int exid)
072 {
073 sos_bochs_printf("Got page fault\n");
074 sos_x86_videomem_printf(10, 30,
075 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
076 "Got EXPECTED (?) Page fault ! But where ???");
077 for (;;) ;
078 }
079
080 static void test_paging(sos_vaddr_t sos_kernel_core_top_vaddr)
081 {
082
083
084 sos_vaddr_t vpage_code = SOS_PAGE_ALIGN_INF(test_paging);
085
086
087 sos_paddr_t ppage_new;
088
089
090
091 sos_vaddr_t vpage_tmp = sos_kernel_core_top_vaddr;
092
093 unsigned i;
094
095
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)
111 {
112
113 sos_x86_videomem_putstring(20, 0,
114 SOS_X86_VIDEO_FG_LTRED
115 | SOS_X86_VIDEO_BG_BLUE,
116 "test_paging : Cannot allocate page");
117 return;
118 }
119
120 sos_x86_videomem_printf(5, 0,
121 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
122 "Hello from the address 0x%x in physical memory",
123 sos_paging_get_paddr(vpage_code));
124
125 sos_x86_videomem_printf(6, 0,
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 }
197
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);
203 }
204
205
206 void sos_main(unsigned long magic, unsigned long addr)
207 {
208 unsigned i;
209 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
210
211
212
213
214 multiboot_info_t *mbi;
215 mbi = (multiboot_info_t *) addr;
216
217
218 sos_bochs_setup();
219
220 sos_x86_videomem_setup();
221 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
222
223
224 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
225
226 sos_x86_videomem_printf(1, 0,
227 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
228 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
229 "SOS", ',',
230 (unsigned)(mbi->mem_upper >> 10) + 1,
231 (unsigned)mbi->mem_upper);
232 else
233
234 sos_x86_videomem_printf(1, 0,
235 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
236 "Welcome to SOS");
237
238 sos_bochs_putstring("Message in a bochs\n");
239
240
241 sos_gdt_setup();
242 sos_idt_setup();
243
244
245 sos_exceptions_setup();
246 sos_irq_setup();
247
248
249 sos_i8254_set_frequency(100);
250
251
252
253 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
254 {
255 sos_x86_videomem_putstring(20, 0,
256 SOS_X86_VIDEO_FG_LTRED
257 | SOS_X86_VIDEO_BG_BLUE
258 | SOS_X86_VIDEO_FG_BLINKING,
259 "I'm not loaded with Grub !");
260
261 for (;;)
262 continue;
263 }
264
265
266 sos_irq_set_routine(SOS_IRQ_TIMER,
267 clk_it);
268
269
270 asm volatile ("sti\n");
271
272
273
274 sos_physmem_setup((mbi->mem_upper<<10) + (1<<20),
275 & sos_kernel_core_base_paddr,
276 & sos_kernel_core_top_paddr);
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);
292
293
294 for (;;)
295 continue;
296
297 return;
298 }