* Sample usage:
* <pre>
* asm volatile ("1: $INSN; 2:"
- * _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
- * : "=a" (fault) : "0" (0), "X" (ex_record_fault_eax));
+ * _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
+ * : "=a" (fault) : "0" (0), [rec] "p" (ex_record_fault_eax));
* </pre>
*/
bool ex_record_fault_eax(struct cpu_regs *regs, const struct extable_entry *ex);
* Sample usage:
* <pre>
* asm volatile ("1: $INSN; 2:"
- * _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
- * : "=D" (fault) : "0" (0), "X" (ex_record_fault_edi));
+ * _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
+ * : "=D" (fault) : "0" (0), [rec] "p" (ex_record_fault_edi));
* </pre>
*/
bool ex_record_fault_edi(struct cpu_regs *regs, const struct extable_entry *ex);
exinfo_t fault = 0;
asm volatile ("1: mov %[cr4], %%cr4; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (fault)
: [cr4] "r" (cr4),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return fault;
}
uint32_t lo, hi, new_idx;
asm volatile ("1: rdmsr; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_rdmsr_safe)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[hnd])
: "=a" (lo), "=d" (hi), "=c" (new_idx)
- : "c" (idx), "X" (ex_rdmsr_safe));
+ : "c" (idx), [hnd] "p" (ex_rdmsr_safe));
bool fault = idx != new_idx;
uint32_t new_idx;
asm volatile ("1: wrmsr; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_wrmsr_safe)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[hnd])
: "=c" (new_idx)
: "c" (idx), "a" ((uint32_t)val),
"d" ((uint32_t)(val >> 32)),
- "X" (ex_wrmsr_safe));
+ [hnd] "p" (ex_wrmsr_safe));
return idx != new_idx;
}
"jmp 3f;"
"2: ret;"
"3:"
- _ASM_EXTABLE_HANDLER(1b, 3b, ex_pf_user)
- _ASM_EXTABLE_HANDLER(0xfff, 2b, ex_pf_user)
+ _ASM_EXTABLE_HANDLER(1b, 3b, %P[rec])
+ _ASM_EXTABLE_HANDLER(0xfff, 2b, %P[rec])
: "+a" (leaked)
: [ptr] "r" (0xfff),
- "X" (ex_pf_user));
+ [rec] "p" (ex_pf_user));
if ( leaked )
panic("Xen's SMEP/SMAP settings leaked into guest context.\n"
unsigned int fault = 0, tmp;
asm volatile("1: cpuid; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "=a" (tmp), "+D" (fault)
- : "a" (0), "X" (ex_record_fault_edi)
+ : "a" (0), [rec] "p" (ex_record_fault_edi)
: "ebx", "ecx", "edx");
return fault;
asm volatile(_ASM_XEN_FEP
"1: cpuid; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "=a" (tmp), "+D" (fault)
- : "a" (0), "X" (ex_record_fault_edi)
+ : "a" (0), [rec] "p" (ex_record_fault_edi)
: "ebx", "ecx", "edx");
return fault;
asm volatile ("mov %[dr7], %%dr7;"
"movl $0, %[ptr]; 1:"
- _ASM_EXTABLE_HANDLER(1b, 1b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 1b, %P[rec])
: "+a" (fault),
[ptr] "=m" (dummy)
- : [dr7] "r" (dr7), "X" (ex_record_fault_eax));
+ : [dr7] "r" (dr7), [rec] "p" (ex_record_fault_eax));
/* Reset any latched %dr7 content. */
write_dr7(0);
/* Attempt to reload an IO breakpoint in %dr0, which should fail ... */
exinfo_t fault = 0;
asm volatile ("1: mov %[val], %%dr7; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault)
: [val] "r" (io0),
- "X" (ex_record_fault_eax));
+ [rec] "p" (ex_record_fault_eax));
if ( fault != EXINFO_SYM(GP, 0) )
xtf_error("Error: Unexpected fault %pe\n", _p(fault));
"jz 1f;"
_ASM_XEN_FEP
"1: fnop; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault)
: [fep] "q" (force),
- "X" (ex_record_fault_eax));
+ [rec] "p" (ex_record_fault_eax));
return fault;
}
"jz 1f;"
_ASM_XEN_FEP
"1: wait; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault)
: [fep] "q" (force),
- "X" (ex_record_fault_eax));
+ [rec] "p" (ex_record_fault_eax));
return fault;
}
"jz 1f;"
_ASM_XEN_FEP
"1: movq %%mm0, %%mm0; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault)
: [fep] "q" (force),
- "X" (ex_record_fault_eax));
+ [rec] "p" (ex_record_fault_eax));
return fault;
}
"jz 1f;"
_ASM_XEN_FEP
"1: movups %%xmm0, %%xmm0; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault)
: [fep] "q" (force),
- "X" (ex_record_fault_eax));
+ [rec] "p" (ex_record_fault_eax));
return fault;
}
"jz 1f;"
_ASM_XEN_FEP
"1: vmovups %%xmm0, %%xmm0; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault)
: [fep] "q" (force),
- "X" (ex_record_fault_eax));
+ [rec] "p" (ex_record_fault_eax));
return fault;
}
"andb $~%c[ad], %[pte2];\n\t"
_ASM_MAYBE_XEN_FEP
"1: invlpg 0x1000; 2:\n\t" /* Invalidate one page only. */
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_fail)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[hnd])
"mov %[zero], 0x1000;\n\t" /* Expect refill. */
"mov %[zero], 0x2000;\n\t" /* Expect no refill. */
:
[ad] "i" (_PAGE_AD),
[pte1] "m" (pae_l1_identmap[1]),
[pte2] "m" (pae_l1_identmap[2]),
- "X" (ex_fail)
+ [hnd] "p" (ex_fail)
: "memory");
return ((test_ad(pae_l1_identmap[1]) << 0) |
"andb $~%c[ad], %[pte2];\n\t"
_ASM_MAYBE_XEN_FEP
"1: invlpg %%fs:0x1000; 2:\n\t" /* Invalidate one page only. */
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_fail)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[hnd])
"mov %[zero], 0x1000;\n\t" /* Expect one TLB entry to refil, */
"mov %[zero], 0x2000;\n\t" /* depending on %fs base.*/
:
[ad] "i" (_PAGE_AD),
[pte1] "m" (pae_l1_identmap[1]),
[pte2] "m" (pae_l1_identmap[2]),
- "X" (ex_fail)
+ [hnd] "p" (ex_fail)
: "memory");
return ((test_ad(pae_l1_identmap[1]) << 0) |
{
asm volatile (_ASM_MAYBE_XEN_FEP
"1: invlpg (%0); 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_fail)
- :: "r" (linear));
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[hnd])
+ :: "r" (linear), [hnd] "p" (ex_fail));
}
static void invlpg_fs_checked(unsigned long linear)
{
asm volatile (_ASM_MAYBE_XEN_FEP
"1: invlpg %%fs:(%0); 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_fail)
- :: "r" (linear), "X" (ex_fail));
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[hnd])
+ :: "r" (linear), [hnd] "p" (ex_fail));
}
static void test_no_fault(void)
ASM_FLAG_OUT(, "setc %[fail_invalid];")
ASM_FLAG_OUT(, "setz %[fail_valid];")
"2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex),
ASM_FLAG_OUT("=@ccc", [fail_invalid] "+rm") (fail_invalid),
ASM_FLAG_OUT("=@ccz", [fail_valid] "+rm") (fail_valid)
: [paddr] "m" (paddr),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
if ( ex )
return ex;
ASM_FLAG_OUT(, "setc %[fail_invalid];")
ASM_FLAG_OUT(, "setz %[fail_valid];")
"2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex),
ASM_FLAG_OUT("=@ccc", [fail_invalid] "+rm") (fail_invalid),
ASM_FLAG_OUT("=@ccz", [fail_valid] "+rm") (fail_valid)
: [paddr] "m" (paddr),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
if ( ex )
return ex;
ASM_FLAG_OUT(, "setc %[fail_invalid];")
ASM_FLAG_OUT(, "setz %[fail_valid];")
"2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex),
ASM_FLAG_OUT("=@ccc", [fail_invalid] "+rm") (fail_invalid),
ASM_FLAG_OUT("=@ccz", [fail_valid] "+rm") (fail_valid)
: [paddr] "m" (paddr),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
if ( ex )
return ex;
exinfo_t fault = 0;
asm volatile ("1: rdfsbase %[val]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault), [val] "=r" (tmp)
- : "X" (ex_record_fault_eax));
+ : [rec] "p" (ex_record_fault_eax));
return fault;
}
exinfo_t fault = 0;
asm volatile ("1: rdgsbase %[val]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault), [val] "=r" (tmp)
- : "X" (ex_record_fault_eax));
+ : [rec] "p" (ex_record_fault_eax));
return fault;
}
exinfo_t fault = 0;
asm volatile ("1: wrfsbase %[val]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault)
- : [val] "r" (val), "X" (ex_record_fault_eax));
+ : [val] "r" (val), [rec] "p" (ex_record_fault_eax));
return fault;
}
exinfo_t fault = 0;
asm volatile ("1: wrgsbase %[val]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault)
- : [val] "r" (val), "X" (ex_record_fault_eax));
+ : [val] "r" (val), [rec] "p" (ex_record_fault_eax));
return fault;
}
printk("Test: Exception Table Handler\n");
asm volatile ("1: ud2a; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b,
- test_extable_handler_handler)
- :: "X" (test_extable_handler_handler));
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[hnd])
+ :: [hnd] "p" (test_extable_handler_handler));
if ( !test_extable_handler_handler_run )
xtf_failure("Fail: Custom handler didn't run\n");
"jz 1f;"
_ASM_XEN_FEP
"1: sgdt %[tmp]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (fault), [tmp] "=m" (tmp)
: [fep] "q" (force),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return fault;
}
"jz 1f;"
_ASM_XEN_FEP
"1: sidt %[tmp]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (fault), [tmp] "=m" (tmp)
: [fep] "q" (force),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return fault;
}
"jz 1f;"
_ASM_XEN_FEP
"1: sldt %[tmp]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (fault), [tmp] "=r" (tmp)
: [fep] "q" (force),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return fault;
}
"jz 1f;"
_ASM_XEN_FEP
"1: str %[tmp]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (fault), [tmp] "=r" (tmp)
: [fep] "q" (force),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return fault;
}
"jz 1f;"
_ASM_XEN_FEP
"1: smsw %[tmp]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (fault), [tmp] "=r" (tmp)
: [fep] "q" (force),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return fault;
}
* instructions don't get lost.
*/
asm volatile ("call *%[ptr];"
- _ASM_EXTABLE_HANDLER(-1, 0, ex_fault)
+ _ASM_EXTABLE_HANDLER(-1, 0, %P[hnd])
: "=a" (res)
: "0" (0),
[ptr] "r" (stub),
- "X" (ex_fault)
+ [hnd] "p" (ex_fault)
: "memory");
if ( res != 0xc0de )
write_fs(0);
asm volatile (_ASM_XEN_FEP
"1: mov %%fs:0, %[dst]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "=D" (fault),
[dst] "=r" (tmp)
: "D" (0),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
switch ( fault )
{
asm volatile (_ASM_XEN_FEP
"1: mov %[sel], %%fs; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "=a" (fault)
: "a" (0),
[sel] "r" (4),
- "X" (ex_record_fault_eax));
+ [rec] "p" (ex_record_fault_eax));
switch ( fault )
{
/* Attempt to load %fs from the LDT. */
asm volatile ("1: mov %[sel], %%fs; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault)
: [sel] "r" (LDT_SEL),
- "X" (ex_record_fault_eax));
+ [rec] "p" (ex_record_fault_eax));
return fault;
}
"start_32bit:;"
_ASM_XEN_FEP
"1: int $%c[df]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
/* Return to 64bit. */
"ljmpl $%c[cs], $1f;"
: [df] "i" (X86_EXC_DF),
[cs32] "i" (__USER_CS32),
[cs] "i" (__USER_CS),
- "X" (ex_record_fault_eax));
+ [rec] "p" (ex_record_fault_eax));
return fault;
}
{
/* Poke the emulator. */
asm volatile (_ASM_XEN_FEP "1: .byte 0x66; cmpxchg8b %[ptr]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "=A" (prev), [ptr] "+m" (mem), "+D" (fault)
: "c" ((uint32_t)(new >> 32)), "b" ((uint32_t)new),
- "0" (old), "X" (ex_record_fault_edi));
+ "0" (old), [rec] "p" (ex_record_fault_edi));
if ( fault == EXINFO_SYM(UD, 0) )
return xtf_success("Success: Not vulnerable to XSA-200\n");
printk("Attempting to confirm...\n");
asm volatile ("1: div %%ecx; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+&a" (low), "+&d" (hi), "+D" (fault)
- : "c" (0), "X" (ex_record_fault_edi));
+ : "c" (0), [rec] "p" (ex_record_fault_edi));
if ( fault == EXINFO_SYM(DE, 0) )
{
* Try to use the linear address which was clobbered by the map call.
*/
asm volatile ("1: mov %[ptr], %[res]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault),
[res] "=q" (discard)
: [ptr] "m" (*(char *)KB(4)),
- "X" (ex_record_fault_eax));
+ [rec] "p" (ex_record_fault_eax));
switch ( fault )
{
exinfo_t fault = 0;
asm volatile ("1: int $0x80; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+a" (fault)
- : "X" (ex_record_fault_eax));
+ : [rec] "p" (ex_record_fault_eax));
/*
* If Xen is vulnerable, it should have crashed. If Xen is not
"btc $%c[bit], %%" _ASM_SP ";"
"mov %[ss], %%ss;"
"1: syscall; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_check_UD)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[hnd])
:
: [bit] "i" (BITS_PER_LONG - 1),
[ss] "m" (user_ss),
- "X" (ex_check_UD)
+ [hnd] "p" (ex_check_UD)
#ifdef __x86_64__
: "rbx", "rcx", "r11"
#else
*/
"mov (%k[ss_ptr]), %%ss;"
"1: syscall; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_check_UD)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[hnd])
/* Return to 64bit mode. */
"ljmpl $%c[cs64], $1f; 1:"
: [cs32] "i" (__USER_CS32),
[ss_ptr] "R" (&user_ss),
[cs64] "i" (__USER_CS),
- "X" (ex_check_UD)
+ [hnd] "p" (ex_check_UD)
#ifdef __x86_64__
: "rbx", "rcx", "r11"
#else
/* Sanity check that breakpoints are working. */
asm volatile ("mov %[ss], %%ss; nop; 1:"
- _ASM_EXTABLE_HANDLER(1b, 1b, ex_record_fault_eax)
+ _ASM_EXTABLE_HANDLER(1b, 1b, %P[rec])
: "+a" (fault)
- : [ss] "m" (ss), "X" (ex_record_fault_eax));
+ : [ss] "m" (ss), [rec] "p" (ex_record_fault_eax));
if ( fault != exp )
return xtf_error("Error checking breakpoint\n"
uint64_t addr = 0;
asm volatile ("1: vmclear %[ptr]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex)
: [ptr] "m" (addr),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return ex;
}
uint64_t addr = 0;
asm volatile ("1: vmptrld %[ptr]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex)
: [ptr] "m" (addr),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return ex;
}
uint64_t addr;
asm volatile ("1: vmptrst %[ptr]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex), [ptr] "=m" (addr)
- : "X" (ex_record_fault_edi));
+ : [rec] "p" (ex_record_fault_edi));
return ex;
}
unsigned long tmp;
asm volatile ("1: vmread %[field], %[value]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex), [value] "=rm" (tmp)
: [field] "r" (0l),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return ex;
}
exinfo_t ex = 0;
asm volatile ("1: vmwrite %[value], %[field]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex)
: [field] "r" (0l), [value] "rm" (0l),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return ex;
}
exinfo_t ex = 0;
asm volatile ("1: vmlaunch; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex)
- : "X" (ex_record_fault_edi));
+ : [rec] "p" (ex_record_fault_edi));
return ex;
}
exinfo_t ex = 0;
asm volatile ("1: vmresume; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex)
- : "X" (ex_record_fault_edi));
+ : [rec] "p" (ex_record_fault_edi));
return ex;
}
exinfo_t ex = 0;
asm volatile ("1: vmxoff; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex)
- : "X" (ex_record_fault_edi));
+ : [rec] "p" (ex_record_fault_edi));
return ex;
}
uint64_t addr = ~0ull;
asm volatile ("1: vmxon %[ptr]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex)
: [ptr] "m" (addr),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return ex;
}
struct { uint64_t eptp, rsvd; } desc;
asm volatile ("1: invept %[desc], %[type]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex)
: [type] "r" (0l), [desc] "m" (desc),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return ex;
}
struct { uint64_t vpid, linear; } desc;
asm volatile ("1: invvpid %[desc], %[type]; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+ _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
: "+D" (ex)
: [type] "r" (0l), [desc] "m" (desc),
- "X" (ex_record_fault_edi));
+ [rec] "p" (ex_record_fault_edi));
return ex;
}