On Fri, Sep 20, 2019 at 12:36 PM Krish Sadhukhan <krish.sadhukhan@xxxxxxxxxx> wrote: > > > On 9/19/19 4:02 PM, Jim Mattson wrote: > > Ensure that support for RDPRU is not enumerated in the guest's CPUID > > and that the RDPRU instruction raises #UD. > > > The AMD spec says, > > "When the CPL>0 with CR4.TSD=1, the RDPRUinstruction will > generate a #UD fault." > > So we don't need to check the CR4.TSD value here ? KVM should set CPUID Fn8000_0008_EBX[RDPRU] to 0. However, I should modify the test so it passes (or skips) on hardware. :-) > > > > > Signed-off-by: Jim Mattson <jmattson@xxxxxxxxxx> > > Reviewed-by: Peter Shier <pshier@xxxxxxxxxx> > > --- > > lib/x86/processor.h | 1 + > > x86/Makefile.x86_64 | 1 + > > x86/rdpru.c | 23 +++++++++++++++++++++++ > > x86/unittests.cfg | 5 +++++ > > 4 files changed, 30 insertions(+) > > create mode 100644 x86/rdpru.c > > > > diff --git a/lib/x86/processor.h b/lib/x86/processor.h > > index b1c579b..121f19c 100644 > > --- a/lib/x86/processor.h > > +++ b/lib/x86/processor.h > > @@ -150,6 +150,7 @@ static inline u8 cpuid_maxphyaddr(void) > > #define X86_FEATURE_RDPID (CPUID(0x7, 0, ECX, 22)) > > #define X86_FEATURE_SPEC_CTRL (CPUID(0x7, 0, EDX, 26)) > > #define X86_FEATURE_NX (CPUID(0x80000001, 0, EDX, 20)) > > +#define X86_FEATURE_RDPRU (CPUID(0x80000008, 0, EBX, 4)) > > > > /* > > * AMD CPUID features > > diff --git a/x86/Makefile.x86_64 b/x86/Makefile.x86_64 > > index 51f9b80..010102b 100644 > > --- a/x86/Makefile.x86_64 > > +++ b/x86/Makefile.x86_64 > > @@ -19,6 +19,7 @@ tests += $(TEST_DIR)/vmx.flat > > tests += $(TEST_DIR)/tscdeadline_latency.flat > > tests += $(TEST_DIR)/intel-iommu.flat > > tests += $(TEST_DIR)/vmware_backdoors.flat > > +tests += $(TEST_DIR)/rdpru.flat > > > > include $(SRCDIR)/$(TEST_DIR)/Makefile.common > > > > diff --git a/x86/rdpru.c b/x86/rdpru.c > > new file mode 100644 > > index 0000000..a298960 > > --- /dev/null > > +++ b/x86/rdpru.c > > @@ -0,0 +1,23 @@ > > +/* RDPRU test */ > > + > > +#include "libcflat.h" > > +#include "processor.h" > > +#include "desc.h" > > + > > +static int rdpru_checking(void) > > +{ > > + asm volatile (ASM_TRY("1f") > > + ".byte 0x0f,0x01,0xfd \n\t" /* rdpru */ > > + "1:" : : "c" (0) : "eax", "edx"); > > + return exception_vector(); > > +} > > + > > +int main(int ac, char **av) > > +{ > > + setup_idt(); > > + > > + report("RDPRU not supported", !this_cpu_has(X86_FEATURE_RDPRU)); > > + report("RDPRU raises #UD", rdpru_checking() == UD_VECTOR); > > + > > + return report_summary(); > > +} > > diff --git a/x86/unittests.cfg b/x86/unittests.cfg > > index 694ee3d..9764e18 100644 > > --- a/x86/unittests.cfg > > +++ b/x86/unittests.cfg > > @@ -221,6 +221,11 @@ file = pcid.flat > > extra_params = -cpu qemu64,+pcid > > arch = x86_64 > > > > +[rdpru] > > +file = rdpru.flat > > +extra_params = -cpu host > > +arch = x86_64 > > + > > [umip] > > file = umip.flat > > extra_params = -cpu qemu64,+umip