_safe and _fep_safe functions will be used to validate various ways of setting the segment bases and GDT/LDT bases. Signed-off-by: Maxim Levitsky <mlevitsk@xxxxxxxxxx> --- lib/x86/desc.h | 4 ++-- lib/x86/processor.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/lib/x86/desc.h b/lib/x86/desc.h index 92c45a48f..5349ea572 100644 --- a/lib/x86/desc.h +++ b/lib/x86/desc.h @@ -286,8 +286,8 @@ extern unsigned long get_gdt_entry_limit(gdt_entry_t *entry); #define asm_safe(insn, inputs...) \ __asm_safe("", insn, inputs) -#define asm_fep_safe(insn, output, inputs...) \ - __asm_safe_out1(KVM_FEP, insn, output, inputs) +#define asm_fep_safe(insn, inputs...) \ + __asm_safe_out1(KVM_FEP, insn,, inputs) #define __asm_safe_out1(fep, insn, output, inputs...) \ ({ \ diff --git a/lib/x86/processor.h b/lib/x86/processor.h index da1ed6628..9248a06b2 100644 --- a/lib/x86/processor.h +++ b/lib/x86/processor.h @@ -468,6 +468,11 @@ static inline int rdmsr_safe(u32 index, uint64_t *val) return rdreg64_safe("rdmsr", index, val); } +static inline int rdmsr_fep_safe(u32 index, uint64_t *val) +{ + return __rdreg64_safe(KVM_FEP, "rdmsr", index, val); +} + static inline int wrmsr_safe(u32 index, u64 val) { return wrreg64_safe("wrmsr", index, val); @@ -597,6 +602,16 @@ static inline void lgdt(const struct descriptor_table_ptr *ptr) asm volatile ("lgdt %0" : : "m"(*ptr)); } +static inline int lgdt_safe(const struct descriptor_table_ptr *ptr) +{ + return asm_safe("lgdt %0", "m"(*ptr)); +} + +static inline int lgdt_fep_safe(const struct descriptor_table_ptr *ptr) +{ + return asm_fep_safe("lgdt %0", "m"(*ptr)); +} + static inline void sgdt(struct descriptor_table_ptr *ptr) { asm volatile ("sgdt %0" : "=m"(*ptr)); @@ -607,6 +622,16 @@ static inline void lidt(const struct descriptor_table_ptr *ptr) asm volatile ("lidt %0" : : "m"(*ptr)); } +static inline int lidt_safe(const struct descriptor_table_ptr *ptr) +{ + return asm_safe("lidt %0", "m"(*ptr)); +} + +static inline int lidt_fep_safe(const struct descriptor_table_ptr *ptr) +{ + return asm_fep_safe("lidt %0", "m"(*ptr)); +} + static inline void sidt(struct descriptor_table_ptr *ptr) { asm volatile ("sidt %0" : "=m"(*ptr)); @@ -617,6 +642,16 @@ static inline void lldt(u16 val) asm volatile ("lldt %0" : : "rm"(val)); } +static inline int lldt_safe(u16 val) +{ + return asm_safe("lldt %0", "rm"(val)); +} + +static inline int lldt_fep_safe(u16 val) +{ + return asm_safe("lldt %0", "rm"(val)); +} + static inline u16 sldt(void) { u16 val; @@ -629,6 +664,16 @@ static inline void ltr(u16 val) asm volatile ("ltr %0" : : "rm"(val)); } +static inline int ltr_safe(u16 val) +{ + return asm_safe("ltr %0", "rm"(val)); +} + +static inline int ltr_fep_safe(u16 val) +{ + return asm_safe("ltr %0", "rm"(val)); +} + static inline u16 str(void) { u16 val; -- 2.26.3