drivers/xen/privcmd.o: warning: objtool: privcmd_ioctl()+0x1414: call to 
hypercall_page() with UACCESS enabled

Some Xen hypercalls allow parameter buffers in user land, so they need
to set AC=1. Avoid the warning for those cases.

Cc: andrew.coop...@citrix.com
Reviewed-by: Juergen Gross <jgr...@suse.com>
Signed-off-by: Peter Zijlstra (Intel) <pet...@infradead.org>
---
 arch/x86/include/asm/xen/hypercall.h |   24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

--- a/arch/x86/include/asm/xen/hypercall.h
+++ b/arch/x86/include/asm/xen/hypercall.h
@@ -214,6 +214,22 @@ xen_single_call(unsigned int call,
        return (long)__res;
 }
 
+static __always_inline void __xen_stac(void)
+{
+       /*
+        * Suppress objtool seeing the STAC/CLAC and getting confused about it
+        * calling random code with AC=1.
+        */
+       asm volatile(ANNOTATE_IGNORE_ALTERNATIVE
+                    ASM_STAC ::: "memory", "flags");
+}
+
+static __always_inline void __xen_clac(void)
+{
+       asm volatile(ANNOTATE_IGNORE_ALTERNATIVE
+                    ASM_CLAC ::: "memory", "flags");
+}
+
 static inline long
 privcmd_call(unsigned int call,
             unsigned long a1, unsigned long a2,
@@ -222,9 +238,9 @@ privcmd_call(unsigned int call,
 {
        long res;
 
-       stac();
+       __xen_stac();
        res = xen_single_call(call, a1, a2, a3, a4, a5);
-       clac();
+       __xen_clac();
 
        return res;
 }
@@ -421,9 +437,9 @@ HYPERVISOR_dm_op(
        domid_t dom, unsigned int nr_bufs, struct xen_dm_op_buf *bufs)
 {
        int ret;
-       stac();
+       __xen_stac();
        ret = _hypercall3(int, dm_op, dom, nr_bufs, bufs);
-       clac();
+       __xen_clac();
        return ret;
 }
 


Reply via email to