Ignore:
Timestamp:
Apr 21, 2017, 4:28:29 AM (5 weeks ago)
Author:
brainslayer
Message:

update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.9/arch/parisc/include/asm/uaccess.h

    r31826 r31885  
    4343
    4444#if !defined(CONFIG_64BIT)
    45 #define LDD_USER(ptr)           __get_user_asm64(ptr)
     45#define LDD_USER(val, ptr)      __get_user_asm64(val, ptr)
    4646#define STD_USER(x, ptr)        __put_user_asm64(x, ptr)
    4747#else
    48 #define LDD_USER(ptr)           __get_user_asm("ldd", ptr)
     48#define LDD_USER(val, ptr)      __get_user_asm(val, "ldd", ptr)
    4949#define STD_USER(x, ptr)        __put_user_asm("std", x, ptr)
    5050#endif
     
    101101                : : "r"(get_fs()) : )
    102102
    103 #define __get_user(x, ptr)                               \
    104 ({                                                       \
    105         register long __gu_err __asm__ ("r8") = 0;       \
    106         register long __gu_val;                          \
    107                                                          \
    108         load_sr2();                                      \
    109         switch (sizeof(*(ptr))) {                        \
    110             case 1: __get_user_asm("ldb", ptr); break;   \
    111             case 2: __get_user_asm("ldh", ptr); break;   \
    112             case 4: __get_user_asm("ldw", ptr); break;   \
    113             case 8: LDD_USER(ptr);  break;               \
    114             default: BUILD_BUG(); break;                 \
    115         }                                                \
    116                                                          \
    117         (x) = (__force __typeof__(*(ptr))) __gu_val;     \
    118         __gu_err;                                        \
    119 })
    120 
    121 #define __get_user_asm(ldx, ptr)                        \
     103#define __get_user_internal(val, ptr)                   \
     104({                                                      \
     105        register long __gu_err __asm__ ("r8") = 0;      \
     106                                                        \
     107        switch (sizeof(*(ptr))) {                       \
     108        case 1: __get_user_asm(val, "ldb", ptr); break; \
     109        case 2: __get_user_asm(val, "ldh", ptr); break; \
     110        case 4: __get_user_asm(val, "ldw", ptr); break; \
     111        case 8: LDD_USER(val, ptr); break;              \
     112        default: BUILD_BUG();                           \
     113        }                                               \
     114                                                        \
     115        __gu_err;                                       \
     116})
     117
     118#define __get_user(val, ptr)                            \
     119({                                                      \
     120        load_sr2();                                     \
     121        __get_user_internal(val, ptr);                  \
     122})
     123
     124#define __get_user_asm(val, ldx, ptr)                   \
     125{                                                       \
     126        register long __gu_val;                         \
     127                                                        \
    122128        __asm__("1: " ldx " 0(%%sr2,%2),%0\n"           \
    123129                "9:\n"                                  \
    124130                ASM_EXCEPTIONTABLE_ENTRY_EFAULT(1b, 9b) \
    125131                : "=r"(__gu_val), "=r"(__gu_err)        \
    126                 : "r"(ptr), "1"(__gu_err));
     132                : "r"(ptr), "1"(__gu_err));             \
     133                                                        \
     134        (val) = (__force __typeof__(*(ptr))) __gu_val;  \
     135}
    127136
    128137#if !defined(CONFIG_64BIT)
    129138
    130 #define __get_user_asm64(ptr)                           \
     139#define __get_user_asm64(val, ptr)                      \
     140{                                                       \
     141        union {                                         \
     142                unsigned long long      l;              \
     143                __typeof__(*(ptr))      t;              \
     144        } __gu_tmp;                                     \
     145                                                        \
    131146        __asm__("   copy %%r0,%R0\n"                    \
    132147                "1: ldw 0(%%sr2,%2),%0\n"               \
     
    135150                ASM_EXCEPTIONTABLE_ENTRY_EFAULT(1b, 9b) \
    136151                ASM_EXCEPTIONTABLE_ENTRY_EFAULT(2b, 9b) \
    137                 : "=r"(__gu_val), "=r"(__gu_err)        \
    138                 : "r"(ptr), "1"(__gu_err));
     152                : "=&r"(__gu_tmp.l), "=r"(__gu_err)     \
     153                : "r"(ptr), "1"(__gu_err));             \
     154                                                        \
     155        (val) = __gu_tmp.t;                             \
     156}
    139157
    140158#endif /* !defined(CONFIG_64BIT) */
    141159
    142160
    143 #define __put_user(x, ptr)                                      \
     161#define __put_user_internal(x, ptr)                             \
    144162({                                                              \
    145163        register long __pu_err __asm__ ("r8") = 0;              \
    146164        __typeof__(*(ptr)) __x = (__typeof__(*(ptr)))(x);       \
    147165                                                                \
    148         load_sr2();                                             \
    149166        switch (sizeof(*(ptr))) {                               \
    150             case 1: __put_user_asm("stb", __x, ptr); break;     \
    151             case 2: __put_user_asm("sth", __x, ptr); break;     \
    152             case 4: __put_user_asm("stw", __x, ptr); break;     \
    153             case 8: STD_USER(__x, ptr); break;                  \
    154             default: BUILD_BUG(); break;                        \
    155         }                                                       \
     167        case 1: __put_user_asm("stb", __x, ptr); break;         \
     168        case 2: __put_user_asm("sth", __x, ptr); break;         \
     169        case 4: __put_user_asm("stw", __x, ptr); break;         \
     170        case 8: STD_USER(__x, ptr); break;                      \
     171        default: BUILD_BUG();                                   \
     172        }                                                       \
    156173                                                                \
    157174        __pu_err;                                               \
    158175})
     176
     177#define __put_user(x, ptr)                                      \
     178({                                                              \
     179        load_sr2();                                             \
     180        __put_user_internal(x, ptr);                            \
     181})
     182
    159183
    160184/*
Note: See TracChangeset for help on using the changeset viewer.