1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * 4 * verify_cpu.S - Code for cpu long mode 5 * code has been borrowed from boot/setup 6 * Andi Kleen. 7 * 8 * Copyright (c) 2007 Andi Kleen (ak@sus 9 * Copyright (c) 2007 Eric Biederman (eb 10 * Copyright (c) 2007 Vivek Goyal (vgoya 11 * Copyright (c) 2010 Kees Cook (kees.co 12 * 13 * This is a common code for verification 14 * long mode and SSE or not. It is not ca 15 * file is included at various places and 16 * This file is expected to run in 32bit 17 * 18 * arch/x86/boot/compressed/head_64.S: Bo 19 * arch/x86/kernel/trampoline_64.S: secon 20 * arch/x86/kernel/head_32.S: processor s 21 * 22 * verify_cpu, returns the status of long 23 * 0: Success 1: Failure 24 * 25 * On Intel, the XD_DISABLE flag will be 26 * 27 * The caller needs to check for the erro 28 * appropriately. Either display a messag 29 */ 30 31 #include <asm/cpufeatures.h> 32 #include <asm/msr-index.h> 33 34 SYM_FUNC_START_LOCAL(verify_cpu) 35 pushf # Save 36 push $0 # Kill 37 popf 38 39 #ifndef __x86_64__ 40 pushfl # stan 41 popl %eax 42 movl %eax,%ebx 43 xorl $0x200000,%eax 44 pushl %eax 45 popfl 46 pushfl 47 popl %eax 48 cmpl %eax,%ebx 49 jz .Lverify_cpu_no_longmode 50 #endif 51 52 movl $0x0,%eax # See 53 cpuid 54 cmpl $0x1,%eax 55 jb .Lverify_cpu_no_longmode 56 57 xor %di,%di 58 cmpl $0x68747541,%ebx # Auth 59 jnz .Lverify_cpu_noamd 60 cmpl $0x69746e65,%edx 61 jnz .Lverify_cpu_noamd 62 cmpl $0x444d4163,%ecx 63 jnz .Lverify_cpu_noamd 64 mov $1,%di # cpu 65 jmp .Lverify_cpu_check 66 67 .Lverify_cpu_noamd: 68 cmpl $0x756e6547,%ebx # Genu 69 jnz .Lverify_cpu_check 70 cmpl $0x49656e69,%edx 71 jnz .Lverify_cpu_check 72 cmpl $0x6c65746e,%ecx 73 jnz .Lverify_cpu_check 74 75 # only call IA32_MISC_ENABLE when: 76 # family > 6 || (family == 6 && model 77 movl $0x1, %eax # chec 78 cpuid 79 movl %eax, %ecx 80 81 andl $0x0ff00f00, %eax # mask 82 shrl $8, %eax 83 cmpl $6, %eax 84 ja .Lverify_cpu_clear_xd # fami 85 jb .Lverify_cpu_check # fami 86 87 andl $0x000f00f0, %ecx # mask 88 shrl $4, %ecx 89 cmpl $0xd, %ecx 90 jb .Lverify_cpu_check # fami 91 92 .Lverify_cpu_clear_xd: 93 movl $MSR_IA32_MISC_ENABLE, %ecx 94 rdmsr 95 btrl $2, %edx # clea 96 jnc .Lverify_cpu_check # only 97 wrmsr 98 99 .Lverify_cpu_check: 100 movl $0x1,%eax # Does 101 cpuid 102 andl $REQUIRED_MASK0,%edx 103 xorl $REQUIRED_MASK0,%edx 104 jnz .Lverify_cpu_no_longmode 105 106 movl $0x80000000,%eax # See 107 cpuid 108 cmpl $0x80000001,%eax 109 jb .Lverify_cpu_no_longmode 110 111 movl $0x80000001,%eax # Does 112 cpuid 113 andl $REQUIRED_MASK1,%edx 114 xorl $REQUIRED_MASK1,%edx 115 jnz .Lverify_cpu_no_longmode 116 117 .Lverify_cpu_sse_test: 118 movl $1,%eax 119 cpuid 120 andl $SSE_MASK,%edx 121 cmpl $SSE_MASK,%edx 122 je .Lverify_cpu_sse_ok 123 test %di,%di 124 jz .Lverify_cpu_no_longmode 125 movl $MSR_K7_HWCR,%ecx 126 rdmsr 127 btr $15,%eax # enab 128 wrmsr 129 xor %di,%di # don' 130 jmp .Lverify_cpu_sse_test # try 131 132 .Lverify_cpu_no_longmode: 133 popf # Rest 134 movl $1,%eax 135 RET 136 .Lverify_cpu_sse_ok: 137 popf # Rest 138 xorl %eax, %eax 139 RET 140 SYM_FUNC_END(verify_cpu)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.