KVM: selftests: Fix Clang build issues in KVM_ASM_SAFE()
cover KVM: selftests: Fix Clang build issues in KVM_ASM_SAFE()
The LLVM integrated assembler has some differences from the GNU assembler, and recent commit 3b23054cd3f5 ("KVM: selftests: Add x86-64 support for exception fixup") seems to be tripping over a few of those differences.
David Matlack (2):
KVM: selftests: Fix KVM_EXCEPTION_MAGIC build with Clang
KVM: selftests: Fix ambiguous mov in KVM_ASM_SAFE()
tools/testing/selftests/kvm/include/x86_64/processor.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
base-commit: 1a4d88a361af4f2e91861d632c6a1fe87a9665c2
Signature · 1 line
2.37.1.359.gd136c6c3e2-goog
PATCH 1/2 KVM: selftests: Fix KVM_EXCEPTION_MAGIC build with Clang
Change KVM_EXCEPTION_MAGIC to use the all-caps "ULL", rather than lower case. This fixes a build failure with Clang:
In file included from x86_64/hyperv_features.c:13:
include/x86_64/processor.h:825:9: error: unexpected token in argument list
return kvm_asm_safe("wrmsr", "a"(val & -1u), "d"(val >> 32), "c"(msr));
^
include/x86_64/processor.h:802:15: note: expanded from macro 'kvm_asm_safe'
asm volatile(KVM_ASM_SAFE(insn) \
^
include/x86_64/processor.h:785:2: note: expanded from macro 'KVM_ASM_SAFE'
"mov $" __stringify(KVM_EXCEPTION_MAGIC) ", %%r9\n\t" \
^
<inline asm>:1:18: note: instantiated into assembly here
mov $0xabacadabaull, %r9
^--- tools/testing/selftests/kvm/include/x86_64/processor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/kvm/include/x86_64/processor.h +1 -1
@@ -754,7 +754,7 @@ void vm_install_exception_handler(struct kvm_vm *vm, int vector, void (*handler)(struct ex_regs *));/* If a toddler were to say "abracadabra". */ -#define KVM_EXCEPTION_MAGIC 0xabacadabaull +#define KVM_EXCEPTION_MAGIC 0xabacadabaULL/* * KVM selftest exception fixup uses registers to coordinate with the exception
Signature · 1 line
2.37.1.359.gd136c6c3e2-goog
Re: [PATCH 1/2] KVM: selftests: Fix KVM_EXCEPTION_MAGIC build with Clang
Quoted 17 lines · David Matlack
Change
KVM_EXCEPTION_MAGICto use the all-caps "ULL", rather than lower case. This fixes a build failure with Clang:In file included from
x86_64/hyperv_features.c:13:
include/x86_64/processor.h:825:9: error: unexpected token in argument listreturn kvm_asm_safe("wrmsr", "a"(val & -1u), "d"(val >> 32), "c"(msr)); ^ include/x86_64/processor.h:802:15: note: expanded from macro 'kvm_asm_safe' asm volatile(KVM_ASM_SAFE(insn) \ ^ include/x86_64/processor.h:785:2: note: expanded from macro 'KVM_ASM_SAFE' "mov $" __stringify(KVM_EXCEPTION_MAGIC) ", %%r9\n\t" \ ^ <inline asm>:1:18: note: instantiated into assembly here mov $0xabacadabaull, %r9 ^
Quoted 3 lines
Fixes 3b23054cd3f5 ("KVM: selftests: Add x86-64 support for exception fixup")Signed-off-by David Matlack <[email protected]>---
tools/testing/selftests/kvm/include/x86_64/processor.h void vm_install_exception_handler(struct kvm_vm *vm, int vector, · line 757
Quoted 13 lines
tools/testing/selftests/kvm/include/x86_64/processor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)tools/testing/selftests/kvm/include/x86_64/processor.h +1
-1@@ -754,7 +754,7 @@ void vm_install_exception_handler(struct kvm_vm *vm, int vector, void (*handler)(struct ex_regs *));/* If a toddler were to say "abracadabra". */ -#define KVM_EXCEPTION_MAGIC 0xabacadabaull +#define KVM_EXCEPTION_MAGIC 0xabacadabaULL
Really?!?!?! That's what makes clang happy?!?!?
Re: [PATCH 1/2] KVM: selftests: Fix KVM_EXCEPTION_MAGIC build with Clang
Quoted 35 lines · Sean Christopherson
Quoted 17 lines · David Matlack
Change
KVM_EXCEPTION_MAGICto use the all-caps "ULL", rather than lower case. This fixes a build failure with Clang:In file included from
x86_64/hyperv_features.c:13:
include/x86_64/processor.h:825:9: error: unexpected token in argument listreturn kvm_asm_safe("wrmsr", "a"(val & -1u), "d"(val >> 32), "c"(msr)); ^ include/x86_64/processor.h:802:15: note: expanded from macro 'kvm_asm_safe' asm volatile(KVM_ASM_SAFE(insn) \ ^ include/x86_64/processor.h:785:2: note: expanded from macro 'KVM_ASM_SAFE' "mov $" __stringify(KVM_EXCEPTION_MAGIC) ", %%r9\n\t" \ ^ <inline asm>:1:18: note: instantiated into assembly here mov $0xabacadabaull, %r9 ^Quoted 3 lines
Fixes 3b23054cd3f5 ("KVM: selftests: Add x86-64 support for exception fixup")Signed-off-by David Matlack <[email protected]>---
Reviewed-by Sean Christopherson <[email protected]>Quoted 10 lines
tools/testing/selftests/kvm/include/x86_64/processor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)tools/testing/selftests/kvm/include/x86_64/processor.h +0
-0@@ -754,7 +754,7 @@ void vm_install_exception_handler(struct kvm_vm *vm, int vector, void (*handler)(struct ex_regs *));
Quoted 5 lines
tools/testing/selftests/kvm/include/x86_64/processor.h void vm_install_exception_handler(struct kvm_vm *vm, int vector, · line 757
Quoted 3 lines
tools/testing/selftests/kvm/include/x86_64/processor.h +1
-1/* If a toddler were to say "abracadabra". */ -#define KVM_EXCEPTION_MAGIC 0xabacadabaull +#define KVM_EXCEPTION_MAGIC 0xabacadabaULLReally?!?!?! That's what makes clang happy?!?!?
Heh, yup. I was surprised when it worked.
Hopefully some of the Clang folks CC'd can shed some light on why.
PATCH 2/2 KVM: selftests: Fix ambiguous mov in KVM_ASM_SAFE()
In reply to David MatlackChange the mov in KVM_ASM_SAFE() that zeroes @vector to a movb to make it unambiguous.
This fixes a build failure with Clang since, unlike the GNU assembler, the LLVM integrated assembler rejects ambiguous X86 instructions that don't have suffixes:
In file included from x86_64/hyperv_features.c:13:
include/x86_64/processor.h:825:9: error: ambiguous instructions require an explicit suffix (could be 'movb', 'movw', 'movl', or 'movq')
return kvm_asm_safe("wrmsr", "a"(val & -1u), "d"(val >> 32), "c"(msr));
^
include/x86_64/processor.h:802:15: note: expanded from macro 'kvm_asm_safe'
asm volatile(KVM_ASM_SAFE(insn) \
^
include/x86_64/processor.h:788:16: note: expanded from macro 'KVM_ASM_SAFE'
"1: " insn "\n\t" \
^
<inline asm>:5:2: note: instantiated into assembly here
mov $0, 15(%rsp)
^It seems like this change could introduce undesirable behavior in the future, e.g. if someone used a type larger than a u8 for @vector, since KVM_ASM_SAFE() will only zero the bottom byte. I tried changing the type of @vector to an int to see what would happen. GCC failed to compile due to a size mismatch between movb and %eax. Clang succeeded in compiling, but the generated code looked correct, so perhaps it will not be an issue. That being said it seems like there could be a better solution to this issue that does not assume @vector is a u8.
--- tools/testing/selftests/kvm/include/x86_64/processor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/kvm/include/x86_64/processor.h +1 -1
@@ -786,7 +786,7 @@ void vm_install_exception_handler(struct kvm_vm *vm, int vector,"lea 1f(%%rip), %%r10\n\t" \"lea 2f(%%rip), %%r11\n\t" \"1: " insn"\n\t" \ -"mov $0, %[vector]\n\t" \ +"movb $0, %[vector]\n\t" \"jmp 3f\n\t" \"2:\n\t" \"mov %%r9b, %[vector]\n\t" \
Signature · 1 line
2.37.1.359.gd136c6c3e2-goog
Re: [PATCH 2/2] KVM: selftests: Fix ambiguous mov in KVM_ASM_SAFE()
Quoted 21 lines · David Matlack
Change the mov in
KVM_ASM_SAFE()that zeroes @vector to a movb to make it unambiguous.This fixes a build failure with Clang since, unlike the GNU assembler, the LLVM integrated assembler rejects ambiguous X86 instructions that don't have suffixes:
In file included from
x86_64/hyperv_features.c:13:
include/x86_64/processor.h:825:9: error: ambiguous instructions require an explicit suffix (could be 'movb', 'movw', 'movl', or 'movq')return kvm_asm_safe("wrmsr", "a"(val & -1u), "d"(val >> 32), "c"(msr)); ^ include/x86_64/processor.h:802:15: note: expanded from macro 'kvm_asm_safe' asm volatile(KVM_ASM_SAFE(insn) \ ^ include/x86_64/processor.h:788:16: note: expanded from macro 'KVM_ASM_SAFE' "1: " insn "\n\t" \ ^ <inline asm>:5:2: note: instantiated into assembly here mov $0, 15(%rsp) ^
Quoted 8 lines
It seems like this change could introduce undesirable behavior in the future, e.g. if someone used a type larger than a u8 for @vector, since
KVM_ASM_SAFE()will only zero the bottom byte. I tried changing the type of @vector to an int to see what would happen. GCC failed to compile due to a size mismatch betweenmovband%eax. Clang succeeded in compiling, but the generated code looked correct, so perhaps it will not be an issue. That being said it seems like there could be a better solution to this issue that does not assume @vector is a u8.
Hrm, IIRC my intent was to not care about the size of "vector", but that may just be revisionist thinking because the:
"mov %%r9b, %[vector]\n\t" \
suggests it's nothing more than a screwed up. A static assert on the size would be nice, but I don't know how to make that work since the macros dump directly into the asm.
Quoted 2 lines
Fixes 3b23054cd3f5 ("KVM: selftests: Add x86-64 support for exception fixup")Signed-off-by David Matlack <[email protected]>
Quoted 5 lines · David Matlack
The LLVM integrated assembler has some differences from the GNU assembler, and recent commit
3b23054cd3f5("KVM: selftests: Add x86-64 support for exception fixup") seems to be tripping over a few of those differences.
Paolo, what do you think about these changes? I'm still hitting the mentioned Clang build issues on kvm/master, commit 93472b797153 ("Merge tag 'kvmarm-5.20' ofgit://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into HEAD").
Quoted 13 lines
David Matlack (2):
KVM: selftests: FixKVM_EXCEPTION_MAGICbuild with Clang
KVM: selftests: Fix ambiguous mov inKVM_ASM_SAFE()tools/testing/selftests/kvm/include/x86_64/processor.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)base-commit:
1a4d88a361af4f2e91861d632c6a1fe87a9665c2--
2.37.1.359.gd136c6c3e2-goog
Paolo Bonzini
maintainerQuoted 7 lines · David Matlack
Quoted 5 lines · David Matlack
The LLVM integrated assembler has some differences from the GNU assembler, and recent commit
3b23054cd3f5("KVM: selftests: Add x86-64 support for exception fixup") seems to be tripping over a few of those differences.
Quoted 5 lines
Paolo, what do you think about these changes? I'm still hitting the mentioned Clang build issues on kvm/master, commit
93472b797153("Merge tag 'kvmarm-5.20' ofgit://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarminto HEAD").
I had missed them, so thanks for pinging.
Paolo
Queued, thanks.
Paolo