提交 bf0e12c7 编写于 作者: M Michal Simek 提交者: Michal Simek

microblaze: uaccess.h: Fix timerfd syscall

__pu_val must be volatile to ensure that the value is not lost.

It was causing the problem with timerfd syscall
where using inline asm at the end of function call doesn't
save u64 bit value to the stack.
In comparison both cases you can find out this fragment
where you can see the first part which is saved u64
value to stack and then using it in __put_user_asm_8 macro.
Origin broken implementation misses the first two swi instructions.

	swi	r22, r1, 28 /* missing without volatile */
	swi	r23, r1, 32
...
	addik	r4, r1, 28
	lwi	r3, r4, 0
	swi	r3, r25, 0
	lwi	r3, r4, 4
	swi	r3, r25, 4
	addk	r3, r0, r0

NOTE: Moving __put_val initialization after declaration
has not impact on this bug. It is just coding style issue.
Signed-off-by: NMichal Simek <monstr@monstr.eu>
上级 4336bac5
...@@ -298,11 +298,10 @@ extern long __user_bad(void); ...@@ -298,11 +298,10 @@ extern long __user_bad(void);
#define __put_user_check(x, ptr, size) \ #define __put_user_check(x, ptr, size) \
({ \ ({ \
typeof(*(ptr)) __pu_val; \ typeof(*(ptr)) volatile __pu_val = x; \
typeof(*(ptr)) __user *__pu_addr = (ptr); \ typeof(*(ptr)) __user *__pu_addr = (ptr); \
int __pu_err = 0; \ int __pu_err = 0; \
\ \
__pu_val = (x); \
if (access_ok(VERIFY_WRITE, __pu_addr, size)) { \ if (access_ok(VERIFY_WRITE, __pu_addr, size)) { \
switch (size) { \ switch (size) { \
case 1: \ case 1: \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册