microblaze: uaccess: fix put_user and get_user macros
Use FIXUP macros and resort them. Signed-off-by: Michal Simek <monstr@monstr.eu>
This commit is contained in:
parent
c77a9c4bb7
commit
8b651aa4a7
@ -197,16 +197,22 @@ extern long strnlen_user(const char *src, long count);
|
||||
* already performed before the finction (macro) is called.
|
||||
*/
|
||||
|
||||
#define get_user(x, ptr) \
|
||||
({ \
|
||||
access_ok(VERIFY_READ, (ptr), sizeof(*(ptr))) \
|
||||
? __get_user((x), (ptr)) : -EFAULT; \
|
||||
})
|
||||
|
||||
#define put_user(x, ptr) \
|
||||
({ \
|
||||
access_ok(VERIFY_WRITE, (ptr), sizeof(*(ptr))) \
|
||||
? __put_user((x), (ptr)) : -EFAULT; \
|
||||
#define __get_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \
|
||||
({ \
|
||||
__asm__ __volatile__ ( \
|
||||
"1:" insn " %1, %2, r0;" \
|
||||
" addk %0, r0, r0;" \
|
||||
"2: " \
|
||||
__FIXUP_SECTION \
|
||||
"3: brid 2b; " \
|
||||
" addik %0, r0, %3;" \
|
||||
".previous;" \
|
||||
__EX_TABLE_SECTION \
|
||||
".word 1b,3b;" \
|
||||
".previous;" \
|
||||
: "=&r"(__gu_err), "=r"(__gu_val) \
|
||||
: "r"(__gu_ptr), "i"(-EFAULT) \
|
||||
); \
|
||||
})
|
||||
|
||||
#define __get_user(x, ptr) \
|
||||
@ -231,24 +237,49 @@ extern long strnlen_user(const char *src, long count);
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
#define __get_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \
|
||||
#define get_user(x, ptr) \
|
||||
({ \
|
||||
access_ok(VERIFY_READ, (ptr), sizeof(*(ptr))) \
|
||||
? __get_user((x), (ptr)) : -EFAULT; \
|
||||
})
|
||||
|
||||
#define __put_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \
|
||||
({ \
|
||||
__asm__ __volatile__ ( \
|
||||
"1:" insn " %1, %2, r0;" \
|
||||
" addk %0, r0, r0;" \
|
||||
"2: " \
|
||||
__FIXUP_SECTION \
|
||||
"3: brid 2b; " \
|
||||
"3: brid 2b;" \
|
||||
" addik %0, r0, %3;" \
|
||||
".previous;" \
|
||||
__EX_TABLE_SECTION \
|
||||
".word 1b,3b;" \
|
||||
".previous;" \
|
||||
: "=&r"(__gu_err), "=r"(__gu_val) \
|
||||
: "r"(__gu_ptr), "i"(-EFAULT) \
|
||||
: "=&r"(__gu_err) \
|
||||
: "r"(__gu_val), "r"(__gu_ptr), "i"(-EFAULT) \
|
||||
); \
|
||||
})
|
||||
|
||||
#define __put_user_asm_8(__gu_ptr, __gu_val, __gu_err) \
|
||||
({ \
|
||||
__asm__ __volatile__ (" lwi %0, %1, 0;" \
|
||||
"1: swi %0, %2, 0;" \
|
||||
" lwi %0, %1, 4;" \
|
||||
"2: swi %0, %2, 4;" \
|
||||
" addk %0, r0, r0;" \
|
||||
"3: " \
|
||||
__FIXUP_SECTION \
|
||||
"4: brid 3b;" \
|
||||
" addik %0, r0, %3;" \
|
||||
".previous;" \
|
||||
__EX_TABLE_SECTION \
|
||||
".word 1b,4b,2b,4b;" \
|
||||
".previous;" \
|
||||
: "=&r"(__gu_err) \
|
||||
: "r"(&__gu_val), "r"(__gu_ptr), "i"(-EFAULT) \
|
||||
); \
|
||||
})
|
||||
|
||||
#define __put_user(x, ptr) \
|
||||
({ \
|
||||
@ -273,43 +304,10 @@ extern long strnlen_user(const char *src, long count);
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
#define __put_user_asm_8(__gu_ptr, __gu_val, __gu_err) \
|
||||
({ \
|
||||
__asm__ __volatile__ (" lwi %0, %1, 0; \
|
||||
1: swi %0, %2, 0; \
|
||||
lwi %0, %1, 4; \
|
||||
2: swi %0, %2, 4; \
|
||||
addk %0,r0,r0; \
|
||||
3: \
|
||||
.section .fixup,\"ax\"; \
|
||||
4: brid 3b; \
|
||||
addik %0, r0, %3; \
|
||||
.previous; \
|
||||
.section __ex_table,\"a\"; \
|
||||
.word 1b,4b,2b,4b; \
|
||||
.previous;" \
|
||||
: "=&r"(__gu_err) \
|
||||
: "r"(&__gu_val), \
|
||||
"r"(__gu_ptr), "i"(-EFAULT) \
|
||||
); \
|
||||
})
|
||||
|
||||
#define __put_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \
|
||||
({ \
|
||||
__asm__ __volatile__ ( \
|
||||
"1:" insn " %1, %2, r0; \
|
||||
addk %0, r0, r0; \
|
||||
2: \
|
||||
.section .fixup,\"ax\"; \
|
||||
3: brid 2b; \
|
||||
addik %0, r0, %3; \
|
||||
.previous; \
|
||||
.section __ex_table,\"a\"; \
|
||||
.word 1b,3b; \
|
||||
.previous;" \
|
||||
: "=r"(__gu_err) \
|
||||
: "r"(__gu_val), "r"(__gu_ptr), "i"(-EFAULT) \
|
||||
); \
|
||||
#define put_user(x, ptr) \
|
||||
({ \
|
||||
access_ok(VERIFY_WRITE, (ptr), sizeof(*(ptr))) \
|
||||
? __put_user((x), (ptr)) : -EFAULT; \
|
||||
})
|
||||
|
||||
/* Return: number of not copied bytes, i.e. 0 if OK or non-zero if fail. */
|
||||
|
Loading…
Reference in New Issue
Block a user