x86/boot: Fix kexec booting failure in the SEV bit detection code

Commit

1958b5fc4010 ("x86/boot: Add early boot support when running with SEV active")

can occasionally cause system resets when kexec-ing a second kernel even
if SEV is not active.

That's because get_sev_encryption_bit() uses 32-bit rIP-relative
addressing to read the value of enc_bit - a variable which caches a
previously detected encryption bit position - but kexec may allocate
the early boot code to a higher location, beyond the 32-bit addressing
limit.

In this case, garbage will be read and get_sev_encryption_bit() will
return the wrong value, leading to accessing memory with the wrong
encryption setting.

Therefore, remove enc_bit, and thus get rid of the need to do 32-bit
rIP-relative addressing in the first place.

[ bp: massage commit message heavily. ]

Fixes: 1958b5fc4010 ("x86/boot: Add early boot support when running with SEV active")
Suggested-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Kairui Song <kasong@redhat.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Cc: linux-kernel@vger.kernel.org
Cc: tglx@linutronix.de
Cc: mingo@redhat.com
Cc: hpa@zytor.com
Cc: brijesh.singh@amd.com
Cc: kexec@lists.infradead.org
Cc: dyoung@redhat.com
Cc: bhe@redhat.com
Cc: ghook@redhat.com
Link: https://lkml.kernel.org/r/20180927123845.32052-1-kasong@redhat.com

authored by Kairui Song and committed by Borislav Petkov bdec8d7f 05ab1d8a

Changed files
-19
arch
x86
boot
compressed
-19
arch/x86/boot/compressed/mem_encrypt.S
··· 25 25 push %ebx 26 26 push %ecx 27 27 push %edx 28 - push %edi 29 - 30 - /* 31 - * RIP-relative addressing is needed to access the encryption bit 32 - * variable. Since we are running in 32-bit mode we need this call/pop 33 - * sequence to get the proper relative addressing. 34 - */ 35 - call 1f 36 - 1: popl %edi 37 - subl $1b, %edi 38 - 39 - movl enc_bit(%edi), %eax 40 - cmpl $0, %eax 41 - jge .Lsev_exit 42 28 43 29 /* Check if running under a hypervisor */ 44 30 movl $1, %eax ··· 55 69 56 70 movl %ebx, %eax 57 71 andl $0x3f, %eax /* Return the encryption bit location */ 58 - movl %eax, enc_bit(%edi) 59 72 jmp .Lsev_exit 60 73 61 74 .Lno_sev: 62 75 xor %eax, %eax 63 - movl %eax, enc_bit(%edi) 64 76 65 77 .Lsev_exit: 66 - pop %edi 67 78 pop %edx 68 79 pop %ecx 69 80 pop %ebx ··· 96 113 ENDPROC(set_sev_encryption_mask) 97 114 98 115 .data 99 - enc_bit: 100 - .int 0xffffffff 101 116 102 117 #ifdef CONFIG_AMD_MEM_ENCRYPT 103 118 .balign 8