Am Fri, 27 Apr 2018 19:28:21 +0200 schrieb Jan Kiszka <jan.kis...@siemens.com>:
> On 2018-04-27 13:01, Henning Schild wrote: > > The prefix does appear in guests compiled with "-mx32". In the > > instruction parser we just have to skip over it. > > The patch also adds a few of these instructions to the mmio > > testcase. > > > > Reported-by: Rene Graf <rene.g...@siemens.com> > > Signed-off-by: Henning Schild <henning.sch...@siemens.com> > > --- > > hypervisor/arch/x86/include/asm/processor.h | 2 ++ > > hypervisor/arch/x86/mmio.c | 4 ++++ > > inmates/tests/x86/mmio-access.c | 35 > > +++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) > > > > diff --git a/hypervisor/arch/x86/include/asm/processor.h > > b/hypervisor/arch/x86/include/asm/processor.h index > > df94fc77..eb65c307 100644 --- > > a/hypervisor/arch/x86/include/asm/processor.h +++ > > b/hypervisor/arch/x86/include/asm/processor.h @@ -143,6 +143,8 @@ > > > > #define X86_REX_CODE 4 > > > > +#define X86_PREFIX_ADDR_SZ 0x67 > > + > > #define X86_OP_MOVZX_OPC1 0x0f > > #define X86_OP_MOVZX_OPC2_B 0xb6 > > #define X86_OP_MOVZX_OPC2_W 0xb7 > > diff --git a/hypervisor/arch/x86/mmio.c b/hypervisor/arch/x86/mmio.c > > index 775ec4b7..e336951a 100644 > > --- a/hypervisor/arch/x86/mmio.c > > +++ b/hypervisor/arch/x86/mmio.c > > @@ -103,6 +103,10 @@ restart: > > goto restart; > > } > > switch (op[0].raw) { > > + case X86_PREFIX_ADDR_SZ: > > + if (!ctx_update(&ctx, &pc, 1, pg_structs)) > > + goto error_noinst; > > + goto restart; > > case X86_OP_MOVZX_OPC1: > > if (!ctx_update(&ctx, &pc, 1, pg_structs)) > > goto error_noinst; > > diff --git a/inmates/tests/x86/mmio-access.c > > b/inmates/tests/x86/mmio-access.c index 243e975b..2c543ee7 100644 > > --- a/inmates/tests/x86/mmio-access.c > > +++ b/inmates/tests/x86/mmio-access.c > > @@ -53,11 +53,21 @@ void inmate_main(void) > > : "=a" (reg64) : "a" (0), "b" (mmio_reg)); > > EXPECT_EQUAL(reg64, (u32)pattern); > > > > + /* MOV_FROM_MEM (8b), 32-bit data, 32-bit address */ > > + asm volatile("movl (%%ebx), %%eax" > > + : "=a" (reg64) : "a" (0), "b" (mmio_reg)); > > + EXPECT_EQUAL((u32)reg64, (u32)pattern); > > + > > /* MOVZXB (0f b6), to 64-bit, mod=0, reg=0, rm=3 */ > > asm volatile("movzxb (%%rbx), %%rax" > > : "=a" (reg64) : "a" (0), "b" (mmio_reg)); > > EXPECT_EQUAL(reg64, (u8)pattern); > > > > + /* MOVZXB (0f b6), 32-bit data, 32-bit address */ > > + asm volatile("movzxb (%%ebx), %%eax" > > + : "=a" (reg64) : "a" (0), "b" (mmio_reg)); > > + EXPECT_EQUAL(reg64, (u8)pattern); > > + > > /* MOVZXW (0f b7) */ > > asm volatile("movzxw (%%rbx), %%rax" > > : "=a" (reg64) : "a" (0), "b" (mmio_reg)); > > @@ -109,17 +119,36 @@ void inmate_main(void) > > : : "i" (0xccddeeff), "b" (mmio_reg)); > > EXPECT_EQUAL(*comm_page_reg, 0x11223344ccddeeff); > > > > + mmio_write64(mmio_reg, 0x1122334455667788); > > + /* IMMEDIATE_TO_MEM (c7), 32-bit data, 32-bit address */ > > + asm volatile("movl %0, (%%ebx)" > > + : : "i" (0xccddeeff), "b" (mmio_reg)); > > + EXPECT_EQUAL(*comm_page_reg, 0x11223344ccddeeff); > > + > > mmio_write64(mmio_reg, 0x1122334455667788); > > /* IMMEDIATE_TO_MEM (c7), 32-bit data, mod=1 (disp8), > > reg=0, rm=3 */ asm volatile("movl %0, 0x10(%%rbx)" > > : : "i" (0xccddeeff), "b" (mmio_reg - 0x10)); > > EXPECT_EQUAL(*comm_page_reg, 0x11223344ccddeeff); > > > > + mmio_write64(mmio_reg, 0x1122334455667788); > > + /* IMMEDIATE_TO_MEM (c7), 32-bit data, 32-bit address */ > > + asm volatile("movl %0, 0x10(%%ebx)" > > + : : "i" (0xccddeeff), "b" (mmio_reg - 0x10)); > > + EXPECT_EQUAL(*comm_page_reg, 0x11223344ccddeeff); > > + > > + mmio_write64(mmio_reg, 0x1122334455667788); > > /* IMMEDIATE_TO_MEM (c7), 32-bit data, mod=2 (disp32), > > reg=0, rm=3 */ asm volatile("movl %0, 0x10000000(%%rbx)" > > : : "i" (0xccddeeff), "b" (mmio_reg - 0x10000000)); > > EXPECT_EQUAL(*comm_page_reg, 0x11223344ccddeeff); > > > > + mmio_write64(mmio_reg, 0x1122334455667788); > > + /* IMMEDIATE_TO_MEM (c7), 32-bit data, 32-bit address */ > > + asm volatile("movl %0, 0x10000000(%%ebx)" > > + : : "i" (0xccddeeff), "b" (mmio_reg - 0x10000000)); > > + EXPECT_EQUAL(*comm_page_reg, 0x11223344ccddeeff); > > + > > /* MOVB_TO_MEM (88), mod=0, reg=0, rm=3 */ > > asm volatile("mov %%al, (%%rbx)" > > : : "a" (0x99), "b" (mmio_reg)); > > @@ -135,6 +164,12 @@ void inmate_main(void) > > : : "a" (0x12345678), "b" (mmio_reg - 0x10000000)); > > EXPECT_EQUAL(*comm_page_reg, 0x12345678); > > > > + mmio_write64(mmio_reg, 0x1122334455667788); > > + /* MOV_TO_MEM (89), 64-bit data, 32-bit address */ > > + asm volatile("movq %%rax, 0x10000000(%%ebx)" > > + : : "a" (0x8765432112345678), "b" (mmio_reg - > > 0x10000000)); > > + EXPECT_EQUAL(*comm_page_reg, 0x8765432112345678); > > + > > /* MOV_TO_MEM (89), 64-bit data, mod=0, reg=0, rm=4 (SIB) > > */ asm volatile("movq %%rax, (%%rbx,%%rcx)" > > : : "a" (0x12345678), "b" (mmio_reg), "c" (0)); > > > > Please also add a test for MOV_MEM_TO_AX/AX_TO_MEM with that prefix. I > expect your modification will not pass it... Indeed, fixed in v2. Henning > Jan > -- You received this message because you are subscribed to the Google Groups "Jailhouse" group. To unsubscribe from this group and stop receiving emails from it, send an email to jailhouse-dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.