On Thu, Feb 10, 2022, Hou Wenlong wrote: > @@ -76,6 +96,17 @@ static struct far_xfer_test far_ret_test = { > : "eax", "memory"); \ > }) > > +#define TEST_FAR_JMP_ASM(seg, prefix) \ > +({ \ > + *(uint16_t *)(&fep_jmp_buf[1]) = seg; \ > + asm volatile("lea 1f(%%rip), %%rax\n\t" \ > + "movq $1f, (%[mem])\n\t" \ > + prefix "rex64 ljmp *(%[mem])\n\t"\ > + "1:" \ > + : : [mem]"r"(fep_jmp_buf_ptr)\ > + : "eax", "memory"); \ Align the backslashes for a given macro, even though it means the two TEST_FAR_*_ASM macros won't share alignment. This needs an -fPIC tweak for the movq too, but this one is easy since RAX already holds what we want. With the below fixup... Reviewed-and-tested-by: Sean Christopherson <seanjc@xxxxxxxxxx> --- x86/emulator.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/x86/emulator.c b/x86/emulator.c index 22a5c9d..56a263e 100644 --- a/x86/emulator.c +++ b/x86/emulator.c @@ -97,15 +97,15 @@ static unsigned long *fep_jmp_buf_ptr = &fep_jmp_buf[0]; : "eax", "memory"); \ }) -#define TEST_FAR_JMP_ASM(seg, prefix) \ -({ \ - *(uint16_t *)(&fep_jmp_buf[1]) = seg; \ - asm volatile("lea 1f(%%rip), %%rax\n\t" \ - "movq $1f, (%[mem])\n\t" \ - prefix "rex64 ljmp *(%[mem])\n\t"\ - "1:" \ - : : [mem]"r"(fep_jmp_buf_ptr)\ - : "eax", "memory"); \ +#define TEST_FAR_JMP_ASM(seg, prefix) \ +({ \ + *(uint16_t *)(&fep_jmp_buf[1]) = seg; \ + asm volatile("lea 1f(%%rip), %%rax\n\t" \ + "movq %%rax, (%[mem])\n\t" \ + prefix "rex64 ljmp *(%[mem])\n\t" \ + "1:" \ + : : [mem]"r"(fep_jmp_buf_ptr) \ + : "eax", "memory"); \ }) struct regs { base-commit: 6bd9c4b6a79ed51c0e3e6a997654f4a9feb9c377 --