#include <linux/string.h>
 #include <linux/types.h>
 #include <linux/pgtable.h>
+#include <linux/instrumentation.h>
 
 #include <trace/events/xen.h>
 
+#include <asm/alternative.h>
 #include <asm/page.h>
 #include <asm/smap.h>
 #include <asm/nospec-branch.h>
 void xen_hypercall_func(void);
 DECLARE_STATIC_CALL(xen_hypercall, xen_hypercall_func);
 
-#define __HYPERCALL            "call hypercall_page+%c[offset]"
-#define __HYPERCALL_ENTRY(x)                                           \
-       [offset] "i" (__HYPERVISOR_##x * sizeof(hypercall_page[0]))
+#ifdef MODULE
+#define __ADDRESSABLE_xen_hypercall
+#else
+#define __ADDRESSABLE_xen_hypercall __ADDRESSABLE_ASM_STR(__SCK__xen_hypercall)
+#endif
+
+#define __HYPERCALL                                    \
+       __ADDRESSABLE_xen_hypercall                     \
+       "call __SCT__xen_hypercall"
+
+#define __HYPERCALL_ENTRY(x)   "a" (x)
 
 #ifdef CONFIG_X86_32
 #define __HYPERCALL_RETREG     "eax"
        __HYPERCALL_0ARG();                                             \
        asm volatile (__HYPERCALL                                       \
                      : __HYPERCALL_0PARAM                              \
-                     : __HYPERCALL_ENTRY(name)                         \
+                     : __HYPERCALL_ENTRY(__HYPERVISOR_ ## name)        \
                      : __HYPERCALL_CLOBBER0);                          \
        (type)__res;                                                    \
 })
        __HYPERCALL_1ARG(a1);                                           \
        asm volatile (__HYPERCALL                                       \
                      : __HYPERCALL_1PARAM                              \
-                     : __HYPERCALL_ENTRY(name)                         \
+                     : __HYPERCALL_ENTRY(__HYPERVISOR_ ## name)        \
                      : __HYPERCALL_CLOBBER1);                          \
        (type)__res;                                                    \
 })
        __HYPERCALL_2ARG(a1, a2);                                       \
        asm volatile (__HYPERCALL                                       \
                      : __HYPERCALL_2PARAM                              \
-                     : __HYPERCALL_ENTRY(name)                         \
+                     : __HYPERCALL_ENTRY(__HYPERVISOR_ ## name)        \
                      : __HYPERCALL_CLOBBER2);                          \
        (type)__res;                                                    \
 })
        __HYPERCALL_3ARG(a1, a2, a3);                                   \
        asm volatile (__HYPERCALL                                       \
                      : __HYPERCALL_3PARAM                              \
-                     : __HYPERCALL_ENTRY(name)                         \
+                     : __HYPERCALL_ENTRY(__HYPERVISOR_ ## name)        \
                      : __HYPERCALL_CLOBBER3);                          \
        (type)__res;                                                    \
 })
        __HYPERCALL_4ARG(a1, a2, a3, a4);                               \
        asm volatile (__HYPERCALL                                       \
                      : __HYPERCALL_4PARAM                              \
-                     : __HYPERCALL_ENTRY(name)                         \
+                     : __HYPERCALL_ENTRY(__HYPERVISOR_ ## name)        \
                      : __HYPERCALL_CLOBBER4);                          \
        (type)__res;                                                    \
 })
        __HYPERCALL_DECLS;
        __HYPERCALL_5ARG(a1, a2, a3, a4, a5);
 
-       if (call >= PAGE_SIZE / sizeof(hypercall_page[0]))
-               return -EINVAL;
-
-       asm volatile(CALL_NOSPEC
+       asm volatile(__HYPERCALL
                     : __HYPERCALL_5PARAM
-                    : [thunk_target] "a" (&hypercall_page[call])
+                    : __HYPERCALL_ENTRY(call)
                     : __HYPERCALL_CLOBBER5);
 
        return (long)__res;