1/* 2 * 3 * Copyright (C) 1991, 1992 Linus Torvalds 4 * 5 * Enhanced CPU detection and feature setting code by Mike Jagdis 6 * and Martin Mares, November 1997. 7 */ 8 9.text 10#include <linux/threads.h> 11#include <linux/init.h> 12#include <linux/linkage.h> 13#include <asm/segment.h> 14#include <asm/page_types.h> 15#include <asm/pgtable_types.h> 16#include <asm/cache.h> 17#include <asm/thread_info.h> 18#include <asm/asm-offsets.h> 19#include <asm/setup.h> 20#include <asm/processor-flags.h> 21#include <asm/msr-index.h> 22#include <asm/cpufeatures.h> 23#include <asm/percpu.h> 24#include <asm/nops.h> 25#include <asm/bootparam.h> 26#include <asm/export.h> 27#include <asm/pgtable_32.h> 28 29/* Physical address */ 30#define pa(X) ((X) - __PAGE_OFFSET) 31 32/* 33 * References to members of the new_cpu_data structure. 34 */ 35 36#define X86 new_cpu_data+CPUINFO_x86 37#define X86_VENDOR new_cpu_data+CPUINFO_x86_vendor 38#define X86_MODEL new_cpu_data+CPUINFO_x86_model 39#define X86_MASK new_cpu_data+CPUINFO_x86_mask 40#define X86_HARD_MATH new_cpu_data+CPUINFO_hard_math 41#define X86_CPUID new_cpu_data+CPUINFO_cpuid_level 42#define X86_CAPABILITY new_cpu_data+CPUINFO_x86_capability 43#define X86_VENDOR_ID new_cpu_data+CPUINFO_x86_vendor_id 44 45 46#define SIZEOF_PTREGS 17*4 47 48/* 49 * Worst-case size of the kernel mapping we need to make: 50 * a relocatable kernel can live anywhere in lowmem, so we need to be able 51 * to map all of lowmem. 52 */ 53KERNEL_PAGES = LOWMEM_PAGES 54 55INIT_MAP_SIZE = PAGE_TABLE_SIZE(KERNEL_PAGES) * PAGE_SIZE 56RESERVE_BRK(pagetables, INIT_MAP_SIZE) 57 58/* 59 * 32-bit kernel entrypoint; only used by the boot CPU. On entry, 60 * %esi points to the real-mode code as a 32-bit pointer. 61 * CS and DS must be 4 GB flat segments, but we don't depend on 62 * any particular GDT layout, because we load our own as soon as we 63 * can. 64 */ 65__HEAD 66ENTRY(startup_32) 67 movl pa(initial_stack),%ecx 68 69 /* test KEEP_SEGMENTS flag to see if the bootloader is asking 70 us to not reload segments */ 71 testb $KEEP_SEGMENTS, BP_loadflags(%esi) 72 jnz 2f 73 74/* 75 * Set segments to known values. 76 */ 77 lgdt pa(boot_gdt_descr) 78 movl $(__BOOT_DS),%eax 79 movl %eax,%ds 80 movl %eax,%es 81 movl %eax,%fs 82 movl %eax,%gs 83 movl %eax,%ss 842: 85 leal -__PAGE_OFFSET(%ecx),%esp 86 87/* 88 * Clear BSS first so that there are no surprises... 89 */ 90 cld 91 xorl %eax,%eax 92 movl $pa(__bss_start),%edi 93 movl $pa(__bss_stop),%ecx 94 subl %edi,%ecx 95 shrl $2,%ecx 96 rep ; stosl 97/* 98 * Copy bootup parameters out of the way. 99 * Note: %esi still has the pointer to the real-mode data. 100 * With the kexec as boot loader, parameter segment might be loaded beyond 101 * kernel image and might not even be addressable by early boot page tables. 102 * (kexec on panic case). Hence copy out the parameters before initializing 103 * page tables. 104 */ 105 movl $pa(boot_params),%edi 106 movl $(PARAM_SIZE/4),%ecx 107 cld 108 rep 109 movsl 110 movl pa(boot_params) + NEW_CL_POINTER,%esi 111 andl %esi,%esi 112 jz 1f # No command line 113 movl $pa(boot_command_line),%edi 114 movl $(COMMAND_LINE_SIZE/4),%ecx 115 rep 116 movsl 1171: 118 119#ifdef CONFIG_OLPC 120 /* save OFW's pgdir table for later use when calling into OFW */ 121 movl %cr3, %eax 122 movl %eax, pa(olpc_ofw_pgd) 123#endif 124 125#ifdef CONFIG_MICROCODE 126 /* Early load ucode on BSP. */ 127 call load_ucode_bsp 128#endif 129 130 /* Create early pagetables. */ 131 call mk_early_pgtbl_32 132 133 /* Do early initialization of the fixmap area */ 134 movl $pa(initial_pg_fixmap)+PDE_IDENT_ATTR,%eax 135#ifdef CONFIG_X86_PAE 136#define KPMDS (((-__PAGE_OFFSET) >> 30) & 3) /* Number of kernel PMDs */ 137 movl %eax,pa(initial_pg_pmd+0x1000*KPMDS-8) 138#else 139 movl %eax,pa(initial_page_table+0xffc) 140#endif 141 142#ifdef CONFIG_PARAVIRT 143 /* This is can only trip for a broken bootloader... */ 144 cmpw $0x207, pa(boot_params + BP_version) 145 jb .Ldefault_entry 146 147 /* Paravirt-compatible boot parameters. Look to see what architecture 148 we're booting under. */ 149 movl pa(boot_params + BP_hardware_subarch), %eax 150 cmpl $num_subarch_entries, %eax 151 jae .Lbad_subarch 152 153 movl pa(subarch_entries)(,%eax,4), %eax 154 subl $__PAGE_OFFSET, %eax 155 jmp *%eax 156 157.Lbad_subarch: 158WEAK(xen_entry) 159 /* Unknown implementation; there's really 160 nothing we can do at this point. */ 161 ud2a 162 163 __INITDATA 164 165subarch_entries: 166 .long .Ldefault_entry /* normal x86/PC */ 167 .long xen_entry /* Xen hypervisor */ 168 .long .Ldefault_entry /* Moorestown MID */ 169num_subarch_entries = (. - subarch_entries) / 4 170.previous 171#else 172 jmp .Ldefault_entry 173#endif /* CONFIG_PARAVIRT */ 174 175#ifdef CONFIG_HOTPLUG_CPU 176/* 177 * Boot CPU0 entry point. It's called from play_dead(). Everything has been set 178 * up already except stack. We just set up stack here. Then call 179 * start_secondary(). 180 */ 181ENTRY(start_cpu0) 182 movl initial_stack, %ecx 183 movl %ecx, %esp 184 call *(initial_code) 1851: jmp 1b 186ENDPROC(start_cpu0) 187#endif 188 189/* 190 * Non-boot CPU entry point; entered from trampoline.S 191 * We can't lgdt here, because lgdt itself uses a data segment, but 192 * we know the trampoline has already loaded the boot_gdt for us. 193 * 194 * If cpu hotplug is not supported then this code can go in init section 195 * which will be freed later 196 */ 197ENTRY(startup_32_smp) 198 cld 199 movl $(__BOOT_DS),%eax 200 movl %eax,%ds 201 movl %eax,%es 202 movl %eax,%fs 203 movl %eax,%gs 204 movl pa(initial_stack),%ecx 205 movl %eax,%ss 206 leal -__PAGE_OFFSET(%ecx),%esp 207 208#ifdef CONFIG_MICROCODE 209 /* Early load ucode on AP. */ 210 call load_ucode_ap 211#endif 212 213.Ldefault_entry: 214#define CR0_STATE (X86_CR0_PE | X86_CR0_MP | X86_CR0_ET | \ 215 X86_CR0_NE | X86_CR0_WP | X86_CR0_AM | \ 216 X86_CR0_PG) 217 movl $(CR0_STATE & ~X86_CR0_PG),%eax 218 movl %eax,%cr0 219 220/* 221 * We want to start out with EFLAGS unambiguously cleared. Some BIOSes leave 222 * bits like NT set. This would confuse the debugger if this code is traced. So 223 * initialize them properly now before switching to protected mode. That means 224 * DF in particular (even though we have cleared it earlier after copying the 225 * command line) because GCC expects it. 226 */ 227 pushl $0 228 popfl 229 230/* 231 * New page tables may be in 4Mbyte page mode and may be using the global pages. 232 * 233 * NOTE! If we are on a 486 we may have no cr4 at all! Specifically, cr4 exists 234 * if and only if CPUID exists and has flags other than the FPU flag set. 235 */ 236 movl $-1,pa(X86_CPUID) # preset CPUID level 237 movl $X86_EFLAGS_ID,%ecx 238 pushl %ecx 239 popfl # set EFLAGS=ID 240 pushfl 241 popl %eax # get EFLAGS 242 testl $X86_EFLAGS_ID,%eax # did EFLAGS.ID remained set? 243 jz .Lenable_paging # hw disallowed setting of ID bit 244 # which means no CPUID and no CR4 245 246 xorl %eax,%eax 247 cpuid 248 movl %eax,pa(X86_CPUID) # save largest std CPUID function 249 250 movl $1,%eax 251 cpuid 252 andl $~1,%edx # Ignore CPUID.FPU 253 jz .Lenable_paging # No flags or only CPUID.FPU = no CR4 254 255 movl pa(mmu_cr4_features),%eax 256 movl %eax,%cr4 257 258 testb $X86_CR4_PAE, %al # check if PAE is enabled 259 jz .Lenable_paging 260 261 /* Check if extended functions are implemented */ 262 movl $0x80000000, %eax 263 cpuid 264 /* Value must be in the range 0x80000001 to 0x8000ffff */ 265 subl $0x80000001, %eax 266 cmpl $(0x8000ffff-0x80000001), %eax 267 ja .Lenable_paging 268 269 /* Clear bogus XD_DISABLE bits */ 270 call verify_cpu 271 272 mov $0x80000001, %eax 273 cpuid 274 /* Execute Disable bit supported? */ 275 btl $(X86_FEATURE_NX & 31), %edx 276 jnc .Lenable_paging 277 278 /* Setup EFER (Extended Feature Enable Register) */ 279 movl $MSR_EFER, %ecx 280 rdmsr 281 282 btsl $_EFER_NX, %eax 283 /* Make changes effective */ 284 wrmsr 285 286.Lenable_paging: 287 288/* 289 * Enable paging 290 */ 291 movl $pa(initial_page_table), %eax 292 movl %eax,%cr3 /* set the page table pointer.. */ 293 movl $CR0_STATE,%eax 294 movl %eax,%cr0 /* ..and set paging (PG) bit */ 295 ljmp $__BOOT_CS,$1f /* Clear prefetch and normalize %eip */ 2961: 297 /* Shift the stack pointer to a virtual address */ 298 addl $__PAGE_OFFSET, %esp 299 300/* 301 * start system 32-bit setup. We need to re-do some of the things done 302 * in 16-bit mode for the "real" operations. 303 */ 304 movl setup_once_ref,%eax 305 andl %eax,%eax 306 jz 1f # Did we do this already? 307 call *%eax 3081: 309 310/* 311 * Check if it is 486 312 */ 313 movb $4,X86 # at least 486 314 cmpl $-1,X86_CPUID 315 je .Lis486 316 317 /* get vendor info */ 318 xorl %eax,%eax # call CPUID with 0 -> return vendor ID 319 cpuid 320 movl %eax,X86_CPUID # save CPUID level 321 movl %ebx,X86_VENDOR_ID # lo 4 chars 322 movl %edx,X86_VENDOR_ID+4 # next 4 chars 323 movl %ecx,X86_VENDOR_ID+8 # last 4 chars 324 325 orl %eax,%eax # do we have processor info as well? 326 je .Lis486 327 328 movl $1,%eax # Use the CPUID instruction to get CPU type 329 cpuid 330 movb %al,%cl # save reg for future use 331 andb $0x0f,%ah # mask processor family 332 movb %ah,X86 333 andb $0xf0,%al # mask model 334 shrb $4,%al 335 movb %al,X86_MODEL 336 andb $0x0f,%cl # mask mask revision 337 movb %cl,X86_MASK 338 movl %edx,X86_CAPABILITY 339 340.Lis486: 341 movl $0x50022,%ecx # set AM, WP, NE and MP 342 movl %cr0,%eax 343 andl $0x80000011,%eax # Save PG,PE,ET 344 orl %ecx,%eax 345 movl %eax,%cr0 346 347 lgdt early_gdt_descr 348 ljmp $(__KERNEL_CS),$1f 3491: movl $(__KERNEL_DS),%eax # reload all the segment registers 350 movl %eax,%ss # after changing gdt. 351 352 movl $(__USER_DS),%eax # DS/ES contains default USER segment 353 movl %eax,%ds 354 movl %eax,%es 355 356 movl $(__KERNEL_PERCPU), %eax 357 movl %eax,%fs # set this cpu's percpu 358 359 movl $(__KERNEL_STACK_CANARY),%eax 360 movl %eax,%gs 361 362 xorl %eax,%eax # Clear LDT 363 lldt %ax 364 365 call *(initial_code) 3661: jmp 1b 367ENDPROC(startup_32_smp) 368 369#include "verify_cpu.S" 370 371/* 372 * setup_once 373 * 374 * The setup work we only want to run on the BSP. 375 * 376 * Warning: %esi is live across this function. 377 */ 378__INIT 379setup_once: 380#ifdef CONFIG_CC_STACKPROTECTOR 381 /* 382 * Configure the stack canary. The linker can't handle this by 383 * relocation. Manually set base address in stack canary 384 * segment descriptor. 385 */ 386 movl $gdt_page,%eax 387 movl $stack_canary,%ecx 388 movw %cx, 8 * GDT_ENTRY_STACK_CANARY + 2(%eax) 389 shrl $16, %ecx 390 movb %cl, 8 * GDT_ENTRY_STACK_CANARY + 4(%eax) 391 movb %ch, 8 * GDT_ENTRY_STACK_CANARY + 7(%eax) 392#endif 393 394 andl $0,setup_once_ref /* Once is enough, thanks */ 395 ret 396 397ENTRY(early_idt_handler_array) 398 # 36(%esp) %eflags 399 # 32(%esp) %cs 400 # 28(%esp) %eip 401 # 24(%rsp) error code 402 i = 0 403 .rept NUM_EXCEPTION_VECTORS 404 .ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1 405 pushl $0 # Dummy error code, to make stack frame uniform 406 .endif 407 pushl $i # 20(%esp) Vector number 408 jmp early_idt_handler_common 409 i = i + 1 410 .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc 411 .endr 412ENDPROC(early_idt_handler_array) 413 414early_idt_handler_common: 415 /* 416 * The stack is the hardware frame, an error code or zero, and the 417 * vector number. 418 */ 419 cld 420 421 incl %ss:early_recursion_flag 422 423 /* The vector number is in pt_regs->gs */ 424 425 cld 426 pushl %fs /* pt_regs->fs (__fsh varies by model) */ 427 pushl %es /* pt_regs->es (__esh varies by model) */ 428 pushl %ds /* pt_regs->ds (__dsh varies by model) */ 429 pushl %eax /* pt_regs->ax */ 430 pushl %ebp /* pt_regs->bp */ 431 pushl %edi /* pt_regs->di */ 432 pushl %esi /* pt_regs->si */ 433 pushl %edx /* pt_regs->dx */ 434 pushl %ecx /* pt_regs->cx */ 435 pushl %ebx /* pt_regs->bx */ 436 437 /* Fix up DS and ES */ 438 movl $(__KERNEL_DS), %ecx 439 movl %ecx, %ds 440 movl %ecx, %es 441 442 /* Load the vector number into EDX */ 443 movl PT_GS(%esp), %edx 444 445 /* Load GS into pt_regs->gs (and maybe clobber __gsh) */ 446 movw %gs, PT_GS(%esp) 447 448 movl %esp, %eax /* args are pt_regs (EAX), trapnr (EDX) */ 449 call early_fixup_exception 450 451 popl %ebx /* pt_regs->bx */ 452 popl %ecx /* pt_regs->cx */ 453 popl %edx /* pt_regs->dx */ 454 popl %esi /* pt_regs->si */ 455 popl %edi /* pt_regs->di */ 456 popl %ebp /* pt_regs->bp */ 457 popl %eax /* pt_regs->ax */ 458 popl %ds /* pt_regs->ds (always ignores __dsh) */ 459 popl %es /* pt_regs->es (always ignores __esh) */ 460 popl %fs /* pt_regs->fs (always ignores __fsh) */ 461 popl %gs /* pt_regs->gs (always ignores __gsh) */ 462 decl %ss:early_recursion_flag 463 addl $4, %esp /* pop pt_regs->orig_ax */ 464 iret 465ENDPROC(early_idt_handler_common) 466 467/* This is the default interrupt "handler" :-) */ 468ENTRY(early_ignore_irq) 469 cld 470#ifdef CONFIG_PRINTK 471 pushl %eax 472 pushl %ecx 473 pushl %edx 474 pushl %es 475 pushl %ds 476 movl $(__KERNEL_DS),%eax 477 movl %eax,%ds 478 movl %eax,%es 479 cmpl $2,early_recursion_flag 480 je hlt_loop 481 incl early_recursion_flag 482 pushl 16(%esp) 483 pushl 24(%esp) 484 pushl 32(%esp) 485 pushl 40(%esp) 486 pushl $int_msg 487 call printk 488 489 call dump_stack 490 491 addl $(5*4),%esp 492 popl %ds 493 popl %es 494 popl %edx 495 popl %ecx 496 popl %eax 497#endif 498 iret 499 500hlt_loop: 501 hlt 502 jmp hlt_loop 503ENDPROC(early_ignore_irq) 504 505__INITDATA 506 .align 4 507GLOBAL(early_recursion_flag) 508 .long 0 509 510__REFDATA 511 .align 4 512ENTRY(initial_code) 513 .long i386_start_kernel 514ENTRY(setup_once_ref) 515 .long setup_once 516 517/* 518 * BSS section 519 */ 520__PAGE_ALIGNED_BSS 521 .align PAGE_SIZE 522#ifdef CONFIG_X86_PAE 523.globl initial_pg_pmd 524initial_pg_pmd: 525 .fill 1024*KPMDS,4,0 526#else 527.globl initial_page_table 528initial_page_table: 529 .fill 1024,4,0 530#endif 531initial_pg_fixmap: 532 .fill 1024,4,0 533.globl empty_zero_page 534empty_zero_page: 535 .fill 4096,1,0 536.globl swapper_pg_dir 537swapper_pg_dir: 538 .fill 1024,4,0 539EXPORT_SYMBOL(empty_zero_page) 540 541/* 542 * This starts the data section. 543 */ 544#ifdef CONFIG_X86_PAE 545__PAGE_ALIGNED_DATA 546 /* Page-aligned for the benefit of paravirt? */ 547 .align PAGE_SIZE 548ENTRY(initial_page_table) 549 .long pa(initial_pg_pmd+PGD_IDENT_ATTR),0 /* low identity map */ 550# if KPMDS == 3 551 .long pa(initial_pg_pmd+PGD_IDENT_ATTR),0 552 .long pa(initial_pg_pmd+PGD_IDENT_ATTR+0x1000),0 553 .long pa(initial_pg_pmd+PGD_IDENT_ATTR+0x2000),0 554# elif KPMDS == 2 555 .long 0,0 556 .long pa(initial_pg_pmd+PGD_IDENT_ATTR),0 557 .long pa(initial_pg_pmd+PGD_IDENT_ATTR+0x1000),0 558# elif KPMDS == 1 559 .long 0,0 560 .long 0,0 561 .long pa(initial_pg_pmd+PGD_IDENT_ATTR),0 562# else 563# error "Kernel PMDs should be 1, 2 or 3" 564# endif 565 .align PAGE_SIZE /* needs to be page-sized too */ 566#endif 567 568.data 569.balign 4 570ENTRY(initial_stack) 571 /* 572 * The SIZEOF_PTREGS gap is a convention which helps the in-kernel 573 * unwinder reliably detect the end of the stack. 574 */ 575 .long init_thread_union + THREAD_SIZE - SIZEOF_PTREGS - \ 576 TOP_OF_KERNEL_STACK_PADDING; 577 578__INITRODATA 579int_msg: 580 .asciz "Unknown interrupt or fault at: %p %p %p\n" 581 582#include "../../x86/xen/xen-head.S" 583 584/* 585 * The IDT and GDT 'descriptors' are a strange 48-bit object 586 * only used by the lidt and lgdt instructions. They are not 587 * like usual segment descriptors - they consist of a 16-bit 588 * segment size, and 32-bit linear address value: 589 */ 590 591 .data 592.globl boot_gdt_descr 593 594 ALIGN 595# early boot GDT descriptor (must use 1:1 address mapping) 596 .word 0 # 32 bit align gdt_desc.address 597boot_gdt_descr: 598 .word __BOOT_DS+7 599 .long boot_gdt - __PAGE_OFFSET 600 601# boot GDT descriptor (later on used by CPU#0): 602 .word 0 # 32 bit align gdt_desc.address 603ENTRY(early_gdt_descr) 604 .word GDT_ENTRIES*8-1 605 .long gdt_page /* Overwritten for secondary CPUs */ 606 607/* 608 * The boot_gdt must mirror the equivalent in setup.S and is 609 * used only for booting. 610 */ 611 .align L1_CACHE_BYTES 612ENTRY(boot_gdt) 613 .fill GDT_ENTRY_BOOT_CS,8,0 614 .quad 0x00cf9a000000ffff /* kernel 4GB code at 0x00000000 */ 615 .quad 0x00cf92000000ffff /* kernel 4GB data at 0x00000000 */ 616