From: Andrew Cooper Date: Wed, 11 Nov 2020 12:57:45 +0000 (+0000) Subject: hypercall: Refine fix for Clang code generation bug X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=8ab15139728a8efd3ebbb60beb16a958a6a93fa1;p=people%2Fandrewcoop%2Fxen-test-framework.git hypercall: Refine fix for Clang code generation bug It was incorrect to switch "=a" to "+a" and set up hcall, as the hypercall number is encoded in the offset within hypercall_page. Switch res back to just an output. Signed-off-by: Andrew Cooper --- diff --git a/arch/x86/include/arch/hypercall-x86_32.h b/arch/x86/include/arch/hypercall-x86_32.h index bf1d4f1..34a7026 100644 --- a/arch/x86/include/arch/hypercall-x86_32.h +++ b/arch/x86/include/arch/hypercall-x86_32.h @@ -9,49 +9,48 @@ #define _hypercall32_1(type, hcall, a1) \ ({ \ - long _res = (long)(hcall), _a1 = (long)(a1); \ + long res, _a1 = (long)(a1); \ asm volatile ( \ "call hypercall_page + %c[offset]" \ - : "+a" (_res), "+b" (_a1) \ + : "=a" (res), "+b" (_a1) \ : [offset] "i" (hcall * 32) \ : "memory" ); \ - (type)_res; \ + (type)res; \ }) #define _hypercall32_2(type, hcall, a1, a2) \ ({ \ - long _res = (long)(hcall), _a1 = (long)(a1), _a2 = (long)(a2); \ + long res, _a1 = (long)(a1), _a2 = (long)(a2); \ asm volatile ( \ "call hypercall_page + %c[offset]" \ - : "+a" (_res), "+b" (_a1), "+c" (_a2) \ + : "=a" (res), "+b" (_a1), "+c" (_a2) \ : [offset] "i" (hcall * 32) \ : "memory" ); \ - (type)_res; \ + (type)res; \ }) #define _hypercall32_3(type, hcall, a1, a2, a3) \ ({ \ - long _res = (long)(hcall), _a1 = (long)(a1), _a2 = (long)(a2), \ - _a3 = (long)(a3); \ + long res, _a1 = (long)(a1), _a2 = (long)(a2), _a3 = (long)(a3); \ asm volatile ( \ "call hypercall_page + %c[offset]" \ - : "+a" (_res), "+b" (_a1), "+c" (_a2), "+d" (_a3) \ + : "=a" (res), "+b" (_a1), "+c" (_a2), "+d" (_a3) \ : [offset] "i" (hcall * 32) \ : "memory" ); \ - (type)_res; \ + (type)res; \ }) #define _hypercall32_4(type, hcall, a1, a2, a3, a4) \ ({ \ - long _res = (long)(hcall), _a1 = (long)(a1), _a2 = (long)(a2), \ - _a3 = (long)(a3), _a4 = (long)(a4); \ + long res, _a1 = (long)(a1), _a2 = (long)(a2), _a3 = (long)(a3), \ + _a4 = (long)(a4); \ asm volatile ( \ "call hypercall_page + %c[offset]" \ - : "+a" (_res), "+b" (_a1), "+c" (_a2), "+d" (_a3), \ + : "=a" (res), "+b" (_a1), "+c" (_a2), "+d" (_a3), \ "+S" (_a4) \ : [offset] "i" (hcall * 32) \ : "memory" ); \ - (type)_res; \ + (type)res; \ }) #endif /* XTF_X86_32_HYPERCALL_H */ diff --git a/arch/x86/include/arch/hypercall-x86_64.h b/arch/x86/include/arch/hypercall-x86_64.h index d6db99f..d283ad3 100644 --- a/arch/x86/include/arch/hypercall-x86_64.h +++ b/arch/x86/include/arch/hypercall-x86_64.h @@ -9,50 +9,48 @@ #define _hypercall64_1(type, hcall, a1) \ ({ \ - long _res = (long)(hcall), _a1 = (long)(a1); \ + long res, _a1 = (long)(a1); \ asm volatile ( \ "call hypercall_page + %c[offset]" \ - : "+a" (_res), "+D" (_a1) \ + : "=a" (res), "+D" (_a1) \ : [offset] "i" (hcall * 32) \ : "memory" ); \ - (type)_res; \ + (type)res; \ }) #define _hypercall64_2(type, hcall, a1, a2) \ ({ \ - long _res = (long)(hcall), _a1 = (long)(a1), _a2 = (long)(a2); \ + long res, _a1 = (long)(a1), _a2 = (long)(a2); \ asm volatile ( \ "call hypercall_page + %c[offset]" \ - : "+a" (_res), "+D" (_a1), "+S" (_a2) \ + : "=a" (res), "+D" (_a1), "+S" (_a2) \ : [offset] "i" (hcall * 32) \ : "memory" ); \ - (type)_res; \ + (type)res; \ }) #define _hypercall64_3(type, hcall, a1, a2, a3) \ ({ \ - long _res = (long)(hcall), _a1 = (long)(a1), _a2 = (long)(a2), \ - _a3 = (long)(a3); \ + long res, _a1 = (long)(a1), _a2 = (long)(a2), _a3 = (long)(a3); \ asm volatile ( \ "call hypercall_page + %c[offset]" \ - : "+a" (_res), "+D" (_a1), "+S" (_a2), "+d" (_a3) \ + : "=a" (res), "+D" (_a1), "+S" (_a2), "+d" (_a3) \ : [offset] "i" (hcall * 32) \ : "memory" ); \ - (type)_res; \ + (type)res; \ }) #define _hypercall64_4(type, hcall, a1, a2, a3, a4) \ ({ \ - long _res = (long)(hcall), _a1 = (long)(a1), _a2 = (long)(a2), \ - _a3 = (long)(a3); \ + long res, _a1 = (long)(a1), _a2 = (long)(a2), _a3 = (long)(a3); \ register long _a4 asm ("r10") = (long)(a4); \ asm volatile ( \ "call hypercall_page + %c[offset]" \ - : "+a" (_res), "+D" (_a1), "+S" (_a2), "+d" (_a3), \ + : "=a" (res), "+D" (_a1), "+S" (_a2), "+d" (_a3), \ "+r" (_a4) \ : [offset] "i" (hcall * 32) \ : "memory" ); \ - (type)_res; \ + (type)res; \ }) #endif /* XTF_X86_64_HYPERCALL_H */