[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 10/12] x86/paravirt: add new macros PVOP_ALT* supporting pvops in ALTERNATIVEs



Instead of using paravirt patching for custom code sequences add
support for using ALTERNATIVE handling combined with paravirt call
patching.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
 arch/x86/include/asm/paravirt_types.h | 62 +++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/arch/x86/include/asm/paravirt_types.h 
b/arch/x86/include/asm/paravirt_types.h
index b66650dc869e..1f8e1b76e78b 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -482,14 +482,39 @@ int paravirt_disable_iospace(void);
                (rettype)(__eax & PVOP_RETMASK(rettype));               \
        })
 
+#define ____PVOP_ALT_CALL(rettype, op, alt, cond, clbr, call_clbr,     \
+                         extra_clbr, ...)                              \
+       ({                                                              \
+               PVOP_CALL_ARGS;                                         \
+               PVOP_TEST_NULL(op);                                     \
+               BUILD_BUG_ON(sizeof(rettype) > sizeof(unsigned long));  \
+               asm volatile(ALTERNATIVE(paravirt_alt(PARAVIRT_CALL),   \
+                                        alt, cond)                     \
+                            : call_clbr, ASM_CALL_CONSTRAINT           \
+                            : paravirt_type(op),                       \
+                              paravirt_clobber(clbr),                  \
+                              ##__VA_ARGS__                            \
+                            : "memory", "cc" extra_clbr);              \
+               (rettype)(__eax & PVOP_RETMASK(rettype));               \
+       })
+
 #define __PVOP_CALL(rettype, op, ...)                                  \
        ____PVOP_CALL(rettype, op, CLBR_ANY, PVOP_CALL_CLOBBERS,        \
                      EXTRA_CLOBBERS, ##__VA_ARGS__)
 
+#define __PVOP_ALT_CALL(rettype, op, alt, cond, ...)                   \
+       ____PVOP_ALT_CALL(rettype, op, alt, cond, CLBR_ANY,             \
+                         PVOP_CALL_CLOBBERS, EXTRA_CLOBBERS,           \
+                         ##__VA_ARGS__)
+
 #define __PVOP_CALLEESAVE(rettype, op, ...)                            \
        ____PVOP_CALL(rettype, op.func, CLBR_RET_REG,                   \
                      PVOP_CALLEE_CLOBBERS, , ##__VA_ARGS__)
 
+#define __PVOP_ALT_CALLEESAVE(rettype, op, alt, cond, ...)             \
+       ____PVOP_ALT_CALL(rettype, op.func, alt, cond, CLBR_RET_REG,    \
+                         PVOP_CALLEE_CLOBBERS, , ##__VA_ARGS__)
+
 
 #define ____PVOP_VCALL(op, clbr, call_clbr, extra_clbr, ...)           \
        ({                                                              \
@@ -503,36 +528,73 @@ int paravirt_disable_iospace(void);
                             : "memory", "cc" extra_clbr);              \
        })
 
+#define ____PVOP_ALT_VCALL(op, alt, cond, clbr, call_clbr,             \
+                          extra_clbr, ...)                             \
+       ({                                                              \
+               PVOP_VCALL_ARGS;                                        \
+               PVOP_TEST_NULL(op);                                     \
+               asm volatile(ALTERNATIVE(paravirt_alt(PARAVIRT_CALL),   \
+                                        alt, cond)                     \
+                            : call_clbr, ASM_CALL_CONSTRAINT           \
+                            : paravirt_type(op),                       \
+                              paravirt_clobber(clbr),                  \
+                              ##__VA_ARGS__                            \
+                            : "memory", "cc" extra_clbr);              \
+       })
+
 #define __PVOP_VCALL(op, ...)                                          \
        ____PVOP_VCALL(op, CLBR_ANY, PVOP_VCALL_CLOBBERS,               \
                       VEXTRA_CLOBBERS, ##__VA_ARGS__)
 
+#define __PVOP_ALT_VCALL(op, alt, cond, ...)                           \
+       ____PVOP_ALT_VCALL(op, alt, cond, CLBR_ANY,                     \
+                          PVOP_VCALL_CLOBBERS, VEXTRA_CLOBBERS,        \
+                          ##__VA_ARGS__)
+
 #define __PVOP_VCALLEESAVE(op, ...)                                    \
        ____PVOP_VCALL(op.func, CLBR_RET_REG,                           \
                      PVOP_VCALLEE_CLOBBERS, , ##__VA_ARGS__)
 
+#define __PVOP_ALT_VCALLEESAVE(op, alt, cond, ...)                     \
+       ____PVOP_ALT_VCALL(op.func, alt, cond, CLBR_RET_REG,            \
+                          PVOP_VCALLEE_CLOBBERS, , ##__VA_ARGS__)
+
 
 
 #define PVOP_CALL0(rettype, op)                                                
\
        __PVOP_CALL(rettype, op)
 #define PVOP_VCALL0(op)                                                        
\
        __PVOP_VCALL(op)
+#define PVOP_ALT_CALL0(rettype, op, alt, cond)                         \
+       __PVOP_ALT_CALL(rettype, op, alt, cond)
+#define PVOP_ALT_VCALL0(op, alt, cond)                                 \
+       __PVOP_ALT_VCALL(op, alt, cond)
 
 #define PVOP_CALLEE0(rettype, op)                                      \
        __PVOP_CALLEESAVE(rettype, op)
 #define PVOP_VCALLEE0(op)                                              \
        __PVOP_VCALLEESAVE(op)
+#define PVOP_ALT_CALLEE0(rettype, op, alt, cond)                       \
+       __PVOP_ALT_CALLEESAVE(rettype, op, alt, cond)
+#define PVOP_ALT_VCALLEE0(op, alt, cond)                               \
+       __PVOP_ALT_VCALLEESAVE(op, alt, cond)
 
 
 #define PVOP_CALL1(rettype, op, arg1)                                  \
        __PVOP_CALL(rettype, op, PVOP_CALL_ARG1(arg1))
 #define PVOP_VCALL1(op, arg1)                                          \
        __PVOP_VCALL(op, PVOP_CALL_ARG1(arg1))
+#define PVOP_ALT_VCALL1(op, arg1, alt, cond)                           \
+       __PVOP_ALT_VCALL(op, alt, cond, PVOP_CALL_ARG1(arg1))
 
 #define PVOP_CALLEE1(rettype, op, arg1)                                        
\
        __PVOP_CALLEESAVE(rettype, op, PVOP_CALL_ARG1(arg1))
 #define PVOP_VCALLEE1(op, arg1)                                                
\
        __PVOP_VCALLEESAVE(op, PVOP_CALL_ARG1(arg1))
+#define PVOP_ALT_CALLEE1(rettype, op, arg1, alt, cond)                 \
+       __PVOP_ALT_CALLEESAVE(rettype, op, alt, cond, PVOP_CALL_ARG1(arg1))
+#define PVOP_ALT_VCALLEE1(op, arg1, alt, cond)                         \
+       __PVOP_ALT_VCALLEESAVE(op, alt, cond, PVOP_CALL_ARG1(arg1))
 
 
 #define PVOP_CALL2(rettype, op, arg1, arg2)                            \
-- 
2.26.2




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.