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>
027 #include <sos/klibc.h> 031 #include <sos/klibc.h>
028 #include <sos/assert.h> 032 #include <sos/assert.h>
029 #include <drivers/x86_videomem.h> 033 #include <drivers/x86_videomem.h>
030 #include <drivers/bochs.h> 034 #include <drivers/bochs.h>
031 035
032 036
033 037
034 038
035 static void display_bits(unsigned char row, un 039 static void display_bits(unsigned char row, unsigned char col,
036 unsigned char attribu 040 unsigned char attribute,
037 sos_ui32_t integer) 041 sos_ui32_t integer)
038 { 042 {
039 int i; 043 int i;
040 044
041 for (i = 31 ; i >= 0 ; i--) 045 for (i = 31 ; i >= 0 ; i--)
042 { 046 {
043 047
044 int bit_i = (integer & (1 << i)); 048 int bit_i = (integer & (1 << i));
045 049
046 unsigned char ascii_code = bit_i?219:177 050 unsigned char ascii_code = bit_i?219:177;
047 sos_x86_videomem_putchar(row, col++, 051 sos_x86_videomem_putchar(row, col++,
048 attribute, 052 attribute,
049 ascii_code); 053 ascii_code);
050 } 054 }
051 } 055 }
052 056
053 057
054 058
055 static void clk_it(int intid) 059 static void clk_it(int intid)
056 { 060 {
057 static sos_ui32_t clock_count = 0; 061 static sos_ui32_t clock_count = 0;
058 062
059 display_bits(0, 48, 063 display_bits(0, 48,
060 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 064 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
061 clock_count); 065 clock_count);
062 clock_count++; 066 clock_count++;
063 067
064 } 068 }
065 069
066 !! 070
067 static void divide_ex(int exid) !! 071 static void pgflt_ex(int exid)
068 { 072 {
069 static sos_ui32_t div_count = 0; !! 073 sos_bochs_printf("Got page fault\n");
070 display_bits(0, 0, !! 074 sos_x86_videomem_printf(10, 30,
071 SOS_X86_VIDEO_FG_LTRED | SOS_X8 !! 075 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
072 div_count); !! 076 "Got EXPECTED (?) Page fault ! But where ???");
073 div_count++; !! 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);
074 } 203 }
075 204
076 205
077 void sos_main(unsigned long magic, unsigned lo 206 void sos_main(unsigned long magic, unsigned long addr)
078 { 207 {
079 unsigned i; 208 unsigned i;
>> 209 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
080 210
081 211
082 212
083 213
084 multiboot_info_t *mbi; 214 multiboot_info_t *mbi;
085 mbi = (multiboot_info_t *) addr; 215 mbi = (multiboot_info_t *) addr;
086 216
087 217
088 sos_bochs_setup(); 218 sos_bochs_setup();
089 219
090 sos_x86_videomem_setup(); 220 sos_x86_videomem_setup();
091 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 221 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
092 222
093 223
094 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 224 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
095 225
096 sos_x86_videomem_printf(1, 0, 226 sos_x86_videomem_printf(1, 0,
097 SOS_X86_VIDEO_FG_Y 227 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
098 "Welcome From GRUB 228 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
099 "SOS", ',', 229 "SOS", ',',
100 (unsigned)(mbi->me 230 (unsigned)(mbi->mem_upper >> 10) + 1,
101 (unsigned)mbi->mem 231 (unsigned)mbi->mem_upper);
102 else 232 else
103 233
104 sos_x86_videomem_printf(1, 0, 234 sos_x86_videomem_printf(1, 0,
105 SOS_X86_VIDEO_FG_Y 235 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
106 "Welcome to SOS"); 236 "Welcome to SOS");
107 237
108 sos_bochs_putstring("Message in a bochs\n"); 238 sos_bochs_putstring("Message in a bochs\n");
109 239
110 240
111 sos_gdt_setup(); 241 sos_gdt_setup();
112 sos_idt_setup(); 242 sos_idt_setup();
113 243
114 244
115 sos_exceptions_setup(); 245 sos_exceptions_setup();
116 sos_irq_setup(); 246 sos_irq_setup();
117 247
118 248
119 sos_i8254_set_frequency(100); 249 sos_i8254_set_frequency(100);
120 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
121 265
122 sos_irq_set_routine(SOS_IRQ_TIMER, 266 sos_irq_set_routine(SOS_IRQ_TIMER,
123 clk_it); 267 clk_it);
124 sos_exception_set_routine(SOS_EXCEPT_DIVIDE_ <<
125 divide_ex); <<
126 268
127 269
128 asm volatile ("sti\n"); 270 asm volatile ("sti\n");
129 !! 271
130 !! 272
131 !! 273
132 !! 274 sos_physmem_setup((mbi->mem_upper<<10) + (1<<20),
133 !! 275 & sos_kernel_core_base_paddr,
134 i = 10; !! 276 & sos_kernel_core_top_paddr);
135 while (1) !! 277
136 { !! 278
137 !! 279
138 sos_bochs_printf("i = 1 / %d...\n", i); !! 280
139 i = 1 / i; !! 281
140 } !! 282
141 !! 283
142 !! 284 if (sos_paging_setup(sos_kernel_core_base_paddr,
143 !! 285 sos_kernel_core_top_paddr))
144 !! 286 sos_bochs_printf("Could not setup paged memory mode\n");
145 !! 287 sos_x86_videomem_printf(2, 0,
146 sos_x86_videomem_putstring(2, 0, !! 288 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
147 SOS_X86_VIDEO_FG_ !! 289 "Paged-memory mode is activated");
148 "Invisible"); !! 290
>> 291 test_paging(sos_kernel_core_top_paddr);
>> 292
>> 293
>> 294 for (;;)
>> 295 continue;
149 296
150 return; 297 return;
151 } 298 }