mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 09:04:39 +02:00
x86/sev: Move instruction decoder into separate source file
As a first step towards disentangling the SEV #VC handling code -which is shared between the decompressor and the core kernel- from the SEV startup code, move the decompressor's copy of the instruction decoder into a separate source file. Code movement only - no functional change intended. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: David Woodhouse <dwmw@amazon.co.uk> Cc: Dionna Amalie Glaze <dionnaglaze@google.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Kees Cook <keescook@chromium.org> Cc: Kevin Loughlin <kevinloughlin@google.com> Cc: Len Brown <len.brown@intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: linux-efi@vger.kernel.org Link: https://lore.kernel.org/r/20250504095230.2932860-30-ardb+git@google.com
This commit is contained in:
parent
fae89bbfdd
commit
ae862964cb
|
|
@ -44,10 +44,10 @@ KBUILD_CFLAGS += -D__DISABLE_EXPORTS
|
|||
KBUILD_CFLAGS += $(call cc-option,-Wa$(comma)-mrelax-relocations=no)
|
||||
KBUILD_CFLAGS += -include $(srctree)/include/linux/hidden.h
|
||||
|
||||
# sev.c indirectly includes inat-table.h which is generated during
|
||||
# sev-decode-insn.c indirectly includes inat-table.c which is generated during
|
||||
# compilation and stored in $(objtree). Add the directory to the includes so
|
||||
# that the compiler finds it even with out-of-tree builds (make O=/some/path).
|
||||
CFLAGS_sev.o += -I$(objtree)/arch/x86/lib/
|
||||
CFLAGS_sev-handle-vc.o += -I$(objtree)/arch/x86/lib/
|
||||
|
||||
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
|
||||
|
||||
|
|
@ -96,7 +96,7 @@ ifdef CONFIG_X86_64
|
|||
vmlinux-objs-y += $(obj)/idt_64.o $(obj)/idt_handlers_64.o
|
||||
vmlinux-objs-$(CONFIG_AMD_MEM_ENCRYPT) += $(obj)/mem_encrypt.o
|
||||
vmlinux-objs-y += $(obj)/pgtable_64.o
|
||||
vmlinux-objs-$(CONFIG_AMD_MEM_ENCRYPT) += $(obj)/sev.o
|
||||
vmlinux-objs-$(CONFIG_AMD_MEM_ENCRYPT) += $(obj)/sev.o $(obj)/sev-handle-vc.o
|
||||
endif
|
||||
|
||||
vmlinux-objs-$(CONFIG_ACPI) += $(obj)/acpi.o
|
||||
|
|
|
|||
|
|
@ -136,6 +136,9 @@ static inline void console_init(void)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_AMD_MEM_ENCRYPT
|
||||
struct es_em_ctxt;
|
||||
struct insn;
|
||||
|
||||
void sev_enable(struct boot_params *bp);
|
||||
void snp_check_features(void);
|
||||
void sev_es_shutdown_ghcb(void);
|
||||
|
|
@ -143,6 +146,10 @@ extern bool sev_es_check_ghcb_fault(unsigned long address);
|
|||
void snp_set_page_private(unsigned long paddr);
|
||||
void snp_set_page_shared(unsigned long paddr);
|
||||
void sev_prep_identity_maps(unsigned long top_level_pgt);
|
||||
|
||||
enum es_result vc_decode_insn(struct es_em_ctxt *ctxt);
|
||||
bool insn_has_rep_prefix(struct insn *insn);
|
||||
void sev_insn_decode_init(void);
|
||||
#else
|
||||
static inline void sev_enable(struct boot_params *bp)
|
||||
{
|
||||
|
|
|
|||
51
arch/x86/boot/compressed/sev-handle-vc.c
Normal file
51
arch/x86/boot/compressed/sev-handle-vc.c
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include "misc.h"
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <asm/insn.h>
|
||||
#include <asm/pgtable_types.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/sev.h>
|
||||
|
||||
#define __BOOT_COMPRESSED
|
||||
|
||||
/* Basic instruction decoding support needed */
|
||||
#include "../../lib/inat.c"
|
||||
#include "../../lib/insn.c"
|
||||
|
||||
/*
|
||||
* Copy a version of this function here - insn-eval.c can't be used in
|
||||
* pre-decompression code.
|
||||
*/
|
||||
bool insn_has_rep_prefix(struct insn *insn)
|
||||
{
|
||||
insn_byte_t p;
|
||||
int i;
|
||||
|
||||
insn_get_prefixes(insn);
|
||||
|
||||
for_each_insn_prefix(insn, i, p) {
|
||||
if (p == 0xf2 || p == 0xf3)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
enum es_result vc_decode_insn(struct es_em_ctxt *ctxt)
|
||||
{
|
||||
char buffer[MAX_INSN_SIZE];
|
||||
int ret;
|
||||
|
||||
memcpy(buffer, (unsigned char *)ctxt->regs->ip, MAX_INSN_SIZE);
|
||||
|
||||
ret = insn_decode(&ctxt->insn, buffer, MAX_INSN_SIZE, INSN_MODE_64);
|
||||
if (ret < 0)
|
||||
return ES_DECODE_FAILED;
|
||||
|
||||
return ES_OK;
|
||||
}
|
||||
|
||||
extern void sev_insn_decode_init(void) __alias(inat_init_tables);
|
||||
|
|
@ -29,25 +29,6 @@
|
|||
static struct ghcb boot_ghcb_page __aligned(PAGE_SIZE);
|
||||
struct ghcb *boot_ghcb;
|
||||
|
||||
/*
|
||||
* Copy a version of this function here - insn-eval.c can't be used in
|
||||
* pre-decompression code.
|
||||
*/
|
||||
static bool insn_has_rep_prefix(struct insn *insn)
|
||||
{
|
||||
insn_byte_t p;
|
||||
int i;
|
||||
|
||||
insn_get_prefixes(insn);
|
||||
|
||||
for_each_insn_prefix(insn, i, p) {
|
||||
if (p == 0xf2 || p == 0xf3)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Only a dummy for insn_get_seg_base() - Early boot-code is 64bit only and
|
||||
* doesn't use segments.
|
||||
|
|
@ -74,20 +55,6 @@ static inline void sev_es_wr_ghcb_msr(u64 val)
|
|||
boot_wrmsr(MSR_AMD64_SEV_ES_GHCB, &m);
|
||||
}
|
||||
|
||||
static enum es_result vc_decode_insn(struct es_em_ctxt *ctxt)
|
||||
{
|
||||
char buffer[MAX_INSN_SIZE];
|
||||
int ret;
|
||||
|
||||
memcpy(buffer, (unsigned char *)ctxt->regs->ip, MAX_INSN_SIZE);
|
||||
|
||||
ret = insn_decode(&ctxt->insn, buffer, MAX_INSN_SIZE, INSN_MODE_64);
|
||||
if (ret < 0)
|
||||
return ES_DECODE_FAILED;
|
||||
|
||||
return ES_OK;
|
||||
}
|
||||
|
||||
static enum es_result vc_write_mem(struct es_em_ctxt *ctxt,
|
||||
void *dst, char *buf, size_t size)
|
||||
{
|
||||
|
|
@ -122,10 +89,6 @@ static bool fault_in_kernel_space(unsigned long address)
|
|||
|
||||
#define __BOOT_COMPRESSED
|
||||
|
||||
/* Basic instruction decoding support needed */
|
||||
#include "../../lib/inat.c"
|
||||
#include "../../lib/insn.c"
|
||||
|
||||
extern struct svsm_ca *boot_svsm_caa;
|
||||
extern u64 boot_svsm_caa_pa;
|
||||
|
||||
|
|
@ -230,7 +193,7 @@ static bool early_setup_ghcb(void)
|
|||
boot_ghcb = &boot_ghcb_page;
|
||||
|
||||
/* Initialize lookup tables for the instruction decoder */
|
||||
inat_init_tables();
|
||||
sev_insn_decode_init();
|
||||
|
||||
/* SNP guest requires the GHCB GPA must be registered */
|
||||
if (sev_snp_enabled())
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user