• Paul Burton's avatar
    MIPS: Use read-write output operand in __write_64bit_c0_split() · 08eeb44b
    Paul Burton authored
    Commit c22c8043 ("MIPS: Fix input modify in
    __write_64bit_c0_split()") modified __write_64bit_c0_split() constraints
    such that we have both an input & an output which we hope to assign to
    the same registers, and modify the output rather than incorrectly
    clobbering an input.
    
    The way in which we use both an output & an input parameter with the
    input constrained to share the output registers is a little convoluted &
    also problematic for clang, which complains if the input & output values
    have different widths. For example:
    
      In file included from kernel/fork.c:98:
      ./arch/mips/include/asm/mmu_context.h:149:19: error: unsupported
        inline asm: input with type 'unsigned long' matching output with
        type 'unsigned long long'
              write_c0_entryhi(cpu_asid(cpu, next));
              ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
      ./arch/mips/include/asm/mmu_context.h:93:2: note: expanded from macro
        'cpu_asid'
              (cpu_context((cpu), (mm)) & cpu_asid_mask(&cpu_data[cpu]))
              ^
      ./arch/mips/include/asm/mipsregs.h:1617:65: note: expanded from macro
        'write_c0_entryhi'
      #define write_c0_entryhi(val)   __write_ulong_c0_register($10, 0, val)
                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
      ./arch/mips/include/asm/mipsregs.h:1430:39: note: expanded from macro
        '__write_ulong_c0_register'
                      __write_64bit_c0_register(reg, sel, val);               \
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
      ./arch/mips/include/asm/mipsregs.h:1400:41: note: expanded from macro
        '__write_64bit_c0_register'
                      __write_64bit_c0_split(register, sel, value);           \
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
      ./arch/mips/include/asm/mipsregs.h:1498:13: note: expanded from macro
        '__write_64bit_c0_split'
                              : "r,0" (val));                                 \
                                       ^~~
    
    We can both fix this build failure & simplify the code somewhat by
    assigning the __tmp variable with the input value in C prior to our
    inline assembly, and then using a single read-write output operand (ie.
    a constraint beginning with +) to provide this value to our assembly.
    Signed-off-by: default avatarPaul Burton <paul.burton@mips.com>
    08eeb44b
mipsregs.h 90.6 KB