Skip to content

Commit 704f430

Browse files
chleroymaddy-kerneldev
authored andcommitted
powerpc/uaccess: Refactor user_{read/write/}_access_begin()
user_read_access_begin() and user_write_access_begin() and user_access_begin() are now very similar. Create a common __user_access_begin() that takes direction as parameter. In order to avoid a warning with the conditional call of barrier_nospec() which is sometimes an empty macro, change it to a do {} while (0). Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com> Link: https://patch.msgid.link/2b4f9d4e521e0b56bf5cb239916b4a178c4d2007.1766574657.git.chleroy@kernel.org
1 parent 5458989 commit 704f430

2 files changed

Lines changed: 14 additions & 34 deletions

File tree

arch/powerpc/include/asm/barrier.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ do { \
102102

103103
#else /* !CONFIG_PPC_BARRIER_NOSPEC */
104104
#define barrier_nospec_asm
105-
#define barrier_nospec()
105+
#define barrier_nospec() do {} while (0)
106106
#endif /* CONFIG_PPC_BARRIER_NOSPEC */
107107

108108
/*

arch/powerpc/include/asm/uaccess.h

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -410,50 +410,30 @@ copy_mc_to_user(void __user *to, const void *from, unsigned long n)
410410
extern long __copy_from_user_flushcache(void *dst, const void __user *src,
411411
unsigned size);
412412

413-
static __must_check __always_inline bool user_access_begin(const void __user *ptr, size_t len)
413+
static __must_check __always_inline bool __user_access_begin(const void __user *ptr, size_t len,
414+
unsigned long dir)
414415
{
415416
if (unlikely(!access_ok(ptr, len)))
416417
return false;
417418

418419
might_fault();
419420

420-
barrier_nospec();
421-
allow_read_write_user((void __user *)ptr, ptr, len);
421+
if (dir & KUAP_READ)
422+
barrier_nospec();
423+
allow_user_access((void __user *)ptr, dir);
422424
return true;
423425
}
424-
#define user_access_begin user_access_begin
425-
#define user_access_end prevent_current_access_user
426-
#define user_access_save prevent_user_access_return
427-
#define user_access_restore restore_user_access
428426

429-
static __must_check __always_inline bool
430-
user_read_access_begin(const void __user *ptr, size_t len)
431-
{
432-
if (unlikely(!access_ok(ptr, len)))
433-
return false;
427+
#define user_access_begin(p, l) __user_access_begin(p, l, KUAP_READ_WRITE)
428+
#define user_read_access_begin(p, l) __user_access_begin(p, l, KUAP_READ)
429+
#define user_write_access_begin(p, l) __user_access_begin(p, l, KUAP_WRITE)
434430

435-
might_fault();
436-
437-
barrier_nospec();
438-
allow_read_from_user(ptr, len);
439-
return true;
440-
}
441-
#define user_read_access_begin user_read_access_begin
442-
#define user_read_access_end prevent_current_read_from_user
431+
#define user_access_end() prevent_user_access(KUAP_READ_WRITE)
432+
#define user_read_access_end() prevent_user_access(KUAP_READ)
433+
#define user_write_access_end() prevent_user_access(KUAP_WRITE)
443434

444-
static __must_check __always_inline bool
445-
user_write_access_begin(const void __user *ptr, size_t len)
446-
{
447-
if (unlikely(!access_ok(ptr, len)))
448-
return false;
449-
450-
might_fault();
451-
452-
allow_write_to_user((void __user *)ptr, len);
453-
return true;
454-
}
455-
#define user_write_access_begin user_write_access_begin
456-
#define user_write_access_end prevent_current_write_to_user
435+
#define user_access_save prevent_user_access_return
436+
#define user_access_restore restore_user_access
457437

458438
#define arch_unsafe_get_user(x, p, e) do { \
459439
__long_type(*(p)) __gu_val; \

0 commit comments

Comments
 (0)