+17
-2
arch/x86/kvm/emulate.c
+17
-2
arch/x86/kvm/emulate.c
···
429
429
FOP_END
430
430
431
431
/* Special case for SETcc - 1 instruction per cc */
432
+
433
+
/*
434
+
* Depending on .config the SETcc functions look like:
435
+
*
436
+
* SETcc %al [3 bytes]
437
+
* RET [1 byte]
438
+
* INT3 [1 byte; CONFIG_SLS]
439
+
*
440
+
* Which gives possible sizes 4 or 5. When rounded up to the
441
+
* next power-of-two alignment they become 4 or 8.
442
+
*/
443
+
#define SETCC_LENGTH (4 + IS_ENABLED(CONFIG_SLS))
444
+
#define SETCC_ALIGN (4 << IS_ENABLED(CONFIG_SLS))
445
+
static_assert(SETCC_LENGTH <= SETCC_ALIGN);
446
+
432
447
#define FOP_SETCC(op) \
433
-
".align 4 \n\t" \
448
+
".align " __stringify(SETCC_ALIGN) " \n\t" \
434
449
".type " #op ", @function \n\t" \
435
450
#op ": \n\t" \
436
451
#op " %al \n\t" \
···
1062
1047
static __always_inline u8 test_cc(unsigned int condition, unsigned long flags)
1063
1048
{
1064
1049
u8 rc;
1065
-
void (*fop)(void) = (void *)em_setcc + 4 * (condition & 0xf);
1050
+
void (*fop)(void) = (void *)em_setcc + SETCC_ALIGN * (condition & 0xf);
1066
1051
1067
1052
flags = (flags & EFLAGS_MASK) | X86_EFLAGS_IF;
1068
1053
asm("push %[flags]; popf; " CALL_NOSPEC