Bloat-o-meter reports:
add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-29 (-29)
Function old new delta
_probe_mask_msr 99 94 -5
init_amd 2418 2394 -24
but this under-reports because .fixup doesn't contain sized/typed symbols.
This also drops two "mov -EFAULT, %reg; jmp ...;" sequences too, so the net
saving is -50.
wrmsr_amd_safe()'s return value is only checked against 0 (if at all), and
because of this, the compiler can now avoid manifesting the 0/-EFAULT
constants entirely, and the %[fault] label simply lands on the right basic
block.
Convert to Xen style while rewriting.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
}
static inline int wrmsr_amd_safe(unsigned int msr, unsigned int lo,
- unsigned int hi)
+ unsigned int hi)
{
- int err;
+ asm goto ( "1: wrmsr\n\t"
+ _ASM_EXTABLE(1b, %l[fault])
+ :
+ : "c" (msr), "a" (lo), "d" (hi), "D" (0x9c5a203a)
+ :
+ : fault );
- asm volatile("1: wrmsr\n2:\n"
- ".section .fixup,\"ax\"\n"
- "3: movl %6,%0\n"
- " jmp 2b\n"
- ".previous\n"
- _ASM_EXTABLE(1b, 3b)
- : "=r" (err)
- : "c" (msr), "a" (lo), "d" (hi), "D" (0x9c5a203a),
- "0" (0), "i" (-EFAULT));
+ return 0;
- return err;
+ fault:
+ return -EFAULT;
}
static void wrmsr_amd(unsigned int msr, uint64_t val)