lkml.org 
[lkml]   [2020]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 10/15] x86/paravirt: simplify paravirt macros
    Date
    The central pvops call macros ____PVOP_CALL() and ____PVOP_VCALL() are
    looking very similar now.

    The main differences are using PVOP_VCALL_ARGS or PVOP_CALL_ARGS, which
    are identical, and the return value handling.

    So drop PVOP_VCALL_ARGS and instead of ____PVOP_VCALL() just use
    (void)____PVOP_CALL(long, ...).

    Note that it isn't easily possible to just redefine ____PVOP_VCALL()
    to use ____PVOP_CALL() instead, as this would require further hiding of
    commas in macro parameters.

    Signed-off-by: Juergen Gross <jgross@suse.com>
    ---
    V3:
    - new patch
    ---
    arch/x86/include/asm/paravirt_types.h | 25 ++++---------------------
    1 file changed, 4 insertions(+), 21 deletions(-)

    diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
    index 42f9eef84131..a9efd4dad820 100644
    --- a/arch/x86/include/asm/paravirt_types.h
    +++ b/arch/x86/include/asm/paravirt_types.h
    @@ -408,11 +408,9 @@ int paravirt_disable_iospace(void);
    * makes sure the incoming and outgoing types are always correct.
    */
    #ifdef CONFIG_X86_32
    -#define PVOP_VCALL_ARGS \
    +#define PVOP_CALL_ARGS \
    unsigned long __eax = __eax, __edx = __edx, __ecx = __ecx;

    -#define PVOP_CALL_ARGS PVOP_VCALL_ARGS
    -
    #define PVOP_CALL_ARG1(x) "a" ((unsigned long)(x))
    #define PVOP_CALL_ARG2(x) "d" ((unsigned long)(x))
    #define PVOP_CALL_ARG3(x) "c" ((unsigned long)(x))
    @@ -428,12 +426,10 @@ int paravirt_disable_iospace(void);
    #define VEXTRA_CLOBBERS
    #else /* CONFIG_X86_64 */
    /* [re]ax isn't an arg, but the return val */
    -#define PVOP_VCALL_ARGS \
    +#define PVOP_CALL_ARGS \
    unsigned long __edi = __edi, __esi = __esi, \
    __edx = __edx, __ecx = __ecx, __eax = __eax;

    -#define PVOP_CALL_ARGS PVOP_VCALL_ARGS
    -
    #define PVOP_CALL_ARG1(x) "D" ((unsigned long)(x))
    #define PVOP_CALL_ARG2(x) "S" ((unsigned long)(x))
    #define PVOP_CALL_ARG3(x) "d" ((unsigned long)(x))
    @@ -492,25 +488,12 @@ int paravirt_disable_iospace(void);
    ____PVOP_CALL(rettype, op.func, CLBR_RET_REG, \
    PVOP_CALLEE_CLOBBERS, , ##__VA_ARGS__)

    -
    -#define ____PVOP_VCALL(op, clbr, call_clbr, extra_clbr, ...) \
    - ({ \
    - PVOP_VCALL_ARGS; \
    - PVOP_TEST_NULL(op); \
    - asm volatile(paravirt_alt(PARAVIRT_CALL) \
    - : 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, \
    + (void)____PVOP_CALL(long, op, CLBR_ANY, PVOP_VCALL_CLOBBERS, \
    VEXTRA_CLOBBERS, ##__VA_ARGS__)

    #define __PVOP_VCALLEESAVE(op, ...) \
    - ____PVOP_VCALL(op.func, CLBR_RET_REG, \
    + (void)____PVOP_CALL(long, op.func, CLBR_RET_REG, \
    PVOP_VCALLEE_CLOBBERS, , ##__VA_ARGS__)


    --
    2.26.2
    \
     
     \ /
      Last update: 2020-12-17 10:36    [W:5.134 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site