Ping, any chance of a review? I'm happy to rework this or merge it with existing tests if required. On Wednesday, 2020-11-18 at 12:11:29 GMT, David Edmondson wrote: > Verify that the clflushopt instruction succeeds when applied to an > MMIO address at both cpl0 and cpl3. > > Suggested-by: Joao Martins <joao.m.martins@xxxxxxxxxx> > Signed-off-by: David Edmondson <david.edmondson@xxxxxxxxxx> > --- > x86/Makefile.common | 3 ++- > x86/clflushopt_mmio.c | 45 +++++++++++++++++++++++++++++++++++++++++++ > x86/unittests.cfg | 5 +++++ > 3 files changed, 52 insertions(+), 1 deletion(-) > create mode 100644 x86/clflushopt_mmio.c > > diff --git a/x86/Makefile.common b/x86/Makefile.common > index b942086..e11666a 100644 > --- a/x86/Makefile.common > +++ b/x86/Makefile.common > @@ -62,7 +62,8 @@ tests-common = $(TEST_DIR)/vmexit.flat $(TEST_DIR)/tsc.flat \ > $(TEST_DIR)/init.flat $(TEST_DIR)/smap.flat \ > $(TEST_DIR)/hyperv_synic.flat $(TEST_DIR)/hyperv_stimer.flat \ > $(TEST_DIR)/hyperv_connections.flat \ > - $(TEST_DIR)/umip.flat $(TEST_DIR)/tsx-ctrl.flat > + $(TEST_DIR)/umip.flat $(TEST_DIR)/tsx-ctrl.flat \ > + $(TEST_DIR)/clflushopt_mmio.flat > > test_cases: $(tests-common) $(tests) > > diff --git a/x86/clflushopt_mmio.c b/x86/clflushopt_mmio.c > new file mode 100644 > index 0000000..f048f58 > --- /dev/null > +++ b/x86/clflushopt_mmio.c > @@ -0,0 +1,45 @@ > +#include "libcflat.h" > +#include "usermode.h" > +#include "pci.h" > +#include "x86/asm/pci.h" > + > +static volatile int ud; > +static void *memaddr = (void *)0xfed00000; /* HPET */ > + > +static void handle_ud(struct ex_regs *regs) > +{ > + ud = 1; > + regs->rip += 4; > +} > + > +static void try_clflushopt(const char *comment) > +{ > + int expected = !this_cpu_has(X86_FEATURE_CLFLUSHOPT); > + > + ud = 0; > + /* clflushopt (%rbx): */ > + asm volatile(".byte 0x66, 0x0f, 0xae, 0x3b" : : "b" (memaddr)); > + > + report(ud == expected, comment, expected ? "ABSENT" : "present"); > +} > + > +static uint64_t user_clflushopt(void) > +{ > + try_clflushopt("clflushopt-mmio@cpl3 (%s)"); > + > + return 0; > +} > + > +int main(int ac, char **av) > +{ > + bool raised; > + > + setup_vm(); > + > + handle_exception(UD_VECTOR, handle_ud); > + > + (void) run_in_user(user_clflushopt, false, 0, 0, 0, 0, &raised); > + try_clflushopt("clflushopt-mmio@cpl0 (%s)"); > + > + return report_summary(); > +} > diff --git a/x86/unittests.cfg b/x86/unittests.cfg > index 872d679..35bedf8 100644 > --- a/x86/unittests.cfg > +++ b/x86/unittests.cfg > @@ -359,3 +359,8 @@ extra_params = -M q35,kernel-irqchip=split -device intel-iommu,intremap=on,eim=o > file = tsx-ctrl.flat > extra_params = -cpu host > groups = tsx-ctrl > + > +[clflushopt_mmio] > +file = clflushopt_mmio.flat > +extra_params = -cpu host > +arch = x86_64 > -- > 2.29.2 dme. -- It's alright, we told you what to dream.