Changes in kernel/arch/ia32/src/boot/boot.S [1d3d2cf:e3e4a2c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/boot/boot.S
r1d3d2cf re3e4a2c 97 97 pm_status $status_prot 98 98 99 #include "vesa_prot.inc" 100 101 #ifndef PROCESSOR_i486 102 103 pm_status $status_prot2 104 99 105 movl $(INTEL_CPUID_LEVEL), %eax 100 106 cpuid … … 105 111 cpuid 106 112 bt $(INTEL_PSE), %edx 107 jc pse_supported 113 jnc pse_unsupported 114 115 /* Map kernel and turn paging on */ 116 pm_status $status_pse 117 call map_kernel_pse 118 jmp stack_init 119 120 #endif /* PROCESSOR_i486 */ 108 121 109 122 pse_unsupported: 110 123 111 pm_error $err_pse 112 113 pse_supported: 114 115 #include "vesa_prot.inc" 116 117 /* Map kernel and turn paging on */ 118 call map_kernel 124 /* Map kernel and turn paging on */ 125 pm_status $status_non_pse 126 call map_kernel 127 128 stack_init: 119 129 120 130 /* Create the first stack frame */ … … 122 132 movl %esp, %ebp 123 133 124 pm2_status $status_prot 2134 pm2_status $status_prot3 125 135 126 136 /* Call arch_pre_main(grub_eax, grub_ebx) */ … … 140 150 jmp hlt0 141 151 142 /** Setup mapping for the kernel .152 /** Setup mapping for the kernel (PSE variant) 143 153 * 144 154 * Setup mapping for both the unmapped and mapped sections … … 146 156 * 147 157 */ 148 .global map_kernel 149 map_kernel: 158 .global map_kernel_pse 159 map_kernel_pse: 160 /* Paging features */ 150 161 movl %cr4, %ecx 151 162 orl $(1 << 4), %ecx /* PSE on */ … … 158 169 xorl %ebx, %ebx 159 170 160 floop :171 floop_pse: 161 172 movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax 162 173 orl %ebx, %eax … … 169 180 incl %ecx 170 181 cmpl $512, %ecx 171 jl floop 182 jl floop_pse 172 183 173 184 movl %esi, %cr3 … … 177 188 movl %ebx, %cr0 178 189 ret 190 191 /** Setup mapping for the kernel (non-PSE variant). 192 * 193 * Setup mapping for both the unmapped and mapped sections 194 * of the kernel. For simplicity, we map the entire 4G space. 195 * 196 */ 197 .global map_kernel 198 map_kernel: 199 /* Paging features */ 200 movl %cr4, %ecx 201 andl $(~(1 << 5)), %ecx /* PAE off */ 202 movl %ecx, %cr4 203 204 call calc_kernel_end 205 call find_mem_for_pt 206 207 mov kernel_end, %esi 208 mov free_area, %ecx 209 210 cmpl %esi, %ecx 211 jbe use_kernel_end 212 213 mov %ecx, %esi 214 215 /* Align address down to 4k */ 216 andl $(~4095), %esi 217 218 use_kernel_end: 219 220 /* Align address to 4k */ 221 addl $4095, %esi 222 andl $(~4095), %esi 223 224 /* Allocate space for page tables */ 225 movl %esi, pt_loc 226 movl $ballocs, %edi 227 andl $0x7fffffff, %edi 228 229 movl %esi, (%edi) 230 addl $4, %edi 231 movl $(2 * 1024 * 1024), (%edi) 232 233 /* Fill page tables */ 234 xorl %ecx, %ecx 235 xorl %ebx, %ebx 236 237 floop_pt: 238 movl $((1 << 1) | (1 << 0)), %eax 239 orl %ebx, %eax 240 movl %eax, (%esi, %ecx, 4) 241 addl $(4 * 1024), %ebx 242 243 incl %ecx 244 cmpl $(512 * 1024), %ecx 245 246 jl floop_pt 247 248 /* Fill page directory */ 249 movl $(page_directory + 0), %esi 250 movl $(page_directory + 2048), %edi 251 xorl %ecx, %ecx 252 movl pt_loc, %ebx 253 254 floop: 255 movl $((1 << 1) | (1 << 0)), %eax 256 orl %ebx, %eax 257 258 /* Mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */ 259 movl %eax, (%esi, %ecx, 4) 260 261 /* Mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */ 262 movl %eax, (%edi, %ecx, 4) 263 addl $(4 * 1024), %ebx 264 265 incl %ecx 266 cmpl $512, %ecx 267 268 jl floop 269 270 movl %esi, %cr3 271 272 movl %cr0, %ebx 273 orl $(1 << 31), %ebx /* paging on */ 274 movl %ebx, %cr0 275 276 ret 277 278 /** Calculate unmapped address of the end of the kernel. */ 279 calc_kernel_end: 280 movl $hardcoded_load_address, %edi 281 andl $0x7fffffff, %edi 282 movl (%edi), %esi 283 andl $0x7fffffff, %esi 284 285 movl $hardcoded_ktext_size, %edi 286 andl $0x7fffffff, %edi 287 addl (%edi), %esi 288 andl $0x7fffffff, %esi 289 290 movl $hardcoded_kdata_size, %edi 291 andl $0x7fffffff, %edi 292 addl (%edi), %esi 293 andl $0x7fffffff, %esi 294 movl %esi, kernel_end 295 296 ret 297 298 /** Find free 2M (+4k for alignment) region where to store page tables */ 299 find_mem_for_pt: 300 /* Check if multiboot info is present */ 301 cmpl $MULTIBOOT_LOADER_MAGIC, grub_eax 302 je check_multiboot_map 303 304 ret 305 306 check_multiboot_map: 307 308 /* Copy address of the multiboot info to ebx */ 309 movl grub_ebx, %ebx 310 311 /* Check if memory map flag is present */ 312 movl (%ebx), %edx 313 andl $(1 << 6), %edx 314 jnz use_multiboot_map 315 316 ret 317 318 use_multiboot_map: 319 320 /* Copy address of the memory map to edx */ 321 movl 48(%ebx), %edx 322 movl %edx, %ecx 323 324 addl 44(%ebx), %ecx 325 326 /* Find a free region at least 2M in size */ 327 check_memmap_loop: 328 329 /* Is this a free region? */ 330 cmp $1, 20(%edx) 331 jnz next_region 332 333 /* Check size */ 334 cmp $0, 16(%edx) 335 jnz next_region 336 337 cmpl $(2 * 1024 * 1024 + 4 * 1024), 12(%edx) 338 jbe next_region 339 340 cmp $0, 8(%edx) 341 jz found_region 342 343 next_region: 344 345 cmp %ecx, %edx 346 jbe next_region_do 347 348 ret 349 350 next_region_do: 351 352 addl (%edx), %edx 353 addl $4, %edx 354 jmp check_memmap_loop 355 356 found_region: 357 358 /* Use end of the found region */ 359 mov 4(%edx), %ecx 360 add 12(%edx), %ecx 361 sub $(2 * 1024 * 1024), %ecx 362 mov %ecx, free_area 363 364 ret 179 365 180 366 /** Print string to EGA display (in light red) and halt. … … 521 707 grub_eax: 522 708 .long 0 523 524 709 grub_ebx: 525 710 .long 0 526 711 527 err_pse: 528 .asciz "Page Size Extension not supported. System halted." 712 pt_loc: 713 .long 0 714 kernel_end: 715 .long 0 716 free_area: 717 .long 0 529 718 530 719 status_prot: 531 720 .asciz "[prot] " 721 status_pse: 722 .asciz "[pse] " 723 status_non_pse: 724 .asciz "[non_pse] " 532 725 status_vesa_copy: 533 726 .asciz "[vesa_copy] " … … 538 731 status_prot2: 539 732 .asciz "[prot2] " 733 status_prot3: 734 .asciz "[prot3] " 540 735 status_main: 541 736 .asciz "[main] "
Note:
See TracChangeset
for help on using the changeset viewer.