powerpc: get rid of zeroing, switch to RAW_COPY_USER
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
f2ed8bebee
commit
3448890c32
@ -87,6 +87,7 @@ config PPC
|
|||||||
select ARCH_HAS_DMA_SET_COHERENT_MASK
|
select ARCH_HAS_DMA_SET_COHERENT_MASK
|
||||||
select ARCH_HAS_ELF_RANDOMIZE
|
select ARCH_HAS_ELF_RANDOMIZE
|
||||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
select ARCH_HAS_GCOV_PROFILE_ALL
|
||||||
|
select ARCH_HAS_RAW_COPY_USER
|
||||||
select ARCH_HAS_SCALED_CPUTIME if VIRT_CPU_ACCOUNTING_NATIVE
|
select ARCH_HAS_SCALED_CPUTIME if VIRT_CPU_ACCOUNTING_NATIVE
|
||||||
select ARCH_HAS_SG_CHAIN
|
select ARCH_HAS_SG_CHAIN
|
||||||
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
|
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
|
||||||
|
@ -269,42 +269,19 @@ extern unsigned long __copy_tofrom_user(void __user *to,
|
|||||||
|
|
||||||
#ifndef __powerpc64__
|
#ifndef __powerpc64__
|
||||||
|
|
||||||
static inline unsigned long copy_from_user(void *to,
|
#define INLINE_COPY_FROM_USER
|
||||||
const void __user *from, unsigned long n)
|
#define INLINE_COPY_TO_USER
|
||||||
{
|
|
||||||
if (likely(access_ok(VERIFY_READ, from, n))) {
|
|
||||||
check_object_size(to, n, false);
|
|
||||||
return __copy_tofrom_user((__force void __user *)to, from, n);
|
|
||||||
}
|
|
||||||
memset(to, 0, n);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned long copy_to_user(void __user *to,
|
|
||||||
const void *from, unsigned long n)
|
|
||||||
{
|
|
||||||
if (access_ok(VERIFY_WRITE, to, n)) {
|
|
||||||
check_object_size(from, n, true);
|
|
||||||
return __copy_tofrom_user(to, (__force void __user *)from, n);
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* __powerpc64__ */
|
#else /* __powerpc64__ */
|
||||||
|
|
||||||
#define __copy_in_user(to, from, size) \
|
static inline unsigned long
|
||||||
__copy_tofrom_user((to), (from), (size))
|
raw_copy_in_user(void __user *to, const void __user *from, unsigned long n)
|
||||||
|
{
|
||||||
extern unsigned long copy_from_user(void *to, const void __user *from,
|
return __copy_tofrom_user(to, from, n);
|
||||||
unsigned long n);
|
}
|
||||||
extern unsigned long copy_to_user(void __user *to, const void *from,
|
|
||||||
unsigned long n);
|
|
||||||
extern unsigned long copy_in_user(void __user *to, const void __user *from,
|
|
||||||
unsigned long n);
|
|
||||||
|
|
||||||
#endif /* __powerpc64__ */
|
#endif /* __powerpc64__ */
|
||||||
|
|
||||||
static inline unsigned long __copy_from_user_inatomic(void *to,
|
static inline unsigned long raw_copy_from_user(void *to,
|
||||||
const void __user *from, unsigned long n)
|
const void __user *from, unsigned long n)
|
||||||
{
|
{
|
||||||
if (__builtin_constant_p(n) && (n <= 8)) {
|
if (__builtin_constant_p(n) && (n <= 8)) {
|
||||||
@ -328,12 +305,10 @@ static inline unsigned long __copy_from_user_inatomic(void *to,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
check_object_size(to, n, false);
|
|
||||||
|
|
||||||
return __copy_tofrom_user((__force void __user *)to, from, n);
|
return __copy_tofrom_user((__force void __user *)to, from, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long __copy_to_user_inatomic(void __user *to,
|
static inline unsigned long raw_copy_to_user(void __user *to,
|
||||||
const void *from, unsigned long n)
|
const void *from, unsigned long n)
|
||||||
{
|
{
|
||||||
if (__builtin_constant_p(n) && (n <= 8)) {
|
if (__builtin_constant_p(n) && (n <= 8)) {
|
||||||
@ -357,25 +332,9 @@ static inline unsigned long __copy_to_user_inatomic(void __user *to,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
check_object_size(from, n, true);
|
|
||||||
|
|
||||||
return __copy_tofrom_user(to, (__force const void __user *)from, n);
|
return __copy_tofrom_user(to, (__force const void __user *)from, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long __copy_from_user(void *to,
|
|
||||||
const void __user *from, unsigned long size)
|
|
||||||
{
|
|
||||||
might_fault();
|
|
||||||
return __copy_from_user_inatomic(to, from, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned long __copy_to_user(void __user *to,
|
|
||||||
const void *from, unsigned long size)
|
|
||||||
{
|
|
||||||
might_fault();
|
|
||||||
return __copy_to_user_inatomic(to, from, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern unsigned long __clear_user(void __user *addr, unsigned long size);
|
extern unsigned long __clear_user(void __user *addr, unsigned long size);
|
||||||
|
|
||||||
static inline unsigned long clear_user(void __user *addr, unsigned long size)
|
static inline unsigned long clear_user(void __user *addr, unsigned long size)
|
||||||
|
@ -14,7 +14,7 @@ obj-y += string.o alloc.o crtsavres.o code-patching.o \
|
|||||||
|
|
||||||
obj-$(CONFIG_PPC32) += div64.o copy_32.o
|
obj-$(CONFIG_PPC32) += div64.o copy_32.o
|
||||||
|
|
||||||
obj64-y += copypage_64.o copyuser_64.o usercopy_64.o mem_64.o hweight_64.o \
|
obj64-y += copypage_64.o copyuser_64.o mem_64.o hweight_64.o \
|
||||||
copyuser_power7.o string_64.o copypage_power7.o memcpy_power7.o \
|
copyuser_power7.o string_64.o copypage_power7.o memcpy_power7.o \
|
||||||
memcpy_64.o memcmp_64.o
|
memcpy_64.o memcmp_64.o
|
||||||
|
|
||||||
|
@ -477,18 +477,6 @@ _GLOBAL(__copy_tofrom_user)
|
|||||||
bdnz 130b
|
bdnz 130b
|
||||||
/* then clear out the destination: r3 bytes starting at 4(r6) */
|
/* then clear out the destination: r3 bytes starting at 4(r6) */
|
||||||
132: mfctr r3
|
132: mfctr r3
|
||||||
srwi. r0,r3,2
|
|
||||||
li r9,0
|
|
||||||
mtctr r0
|
|
||||||
beq 113f
|
|
||||||
112: stwu r9,4(r6)
|
|
||||||
bdnz 112b
|
|
||||||
113: andi. r0,r3,3
|
|
||||||
mtctr r0
|
|
||||||
beq 120f
|
|
||||||
114: stb r9,4(r6)
|
|
||||||
addi r6,r6,1
|
|
||||||
bdnz 114b
|
|
||||||
120: blr
|
120: blr
|
||||||
|
|
||||||
EX_TABLE(30b,108b)
|
EX_TABLE(30b,108b)
|
||||||
@ -497,7 +485,5 @@ _GLOBAL(__copy_tofrom_user)
|
|||||||
EX_TABLE(41b,111b)
|
EX_TABLE(41b,111b)
|
||||||
EX_TABLE(130b,132b)
|
EX_TABLE(130b,132b)
|
||||||
EX_TABLE(131b,120b)
|
EX_TABLE(131b,120b)
|
||||||
EX_TABLE(112b,120b)
|
|
||||||
EX_TABLE(114b,120b)
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(__copy_tofrom_user)
|
EXPORT_SYMBOL(__copy_tofrom_user)
|
||||||
|
@ -319,32 +319,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD)
|
|||||||
blr
|
blr
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* here we have trapped again, need to clear ctr bytes starting at r3
|
* here we have trapped again, amount remaining is in ctr.
|
||||||
*/
|
*/
|
||||||
143: mfctr r5
|
143: mfctr r3
|
||||||
li r0,0
|
|
||||||
mr r4,r3
|
|
||||||
mr r3,r5 /* return the number of bytes not copied */
|
|
||||||
1: andi. r9,r4,7
|
|
||||||
beq 3f
|
|
||||||
90: stb r0,0(r4)
|
|
||||||
addic. r5,r5,-1
|
|
||||||
addi r4,r4,1
|
|
||||||
bne 1b
|
|
||||||
blr
|
|
||||||
3: cmpldi cr1,r5,8
|
|
||||||
srdi r9,r5,3
|
|
||||||
andi. r5,r5,7
|
|
||||||
blt cr1,93f
|
|
||||||
mtctr r9
|
|
||||||
91: std r0,0(r4)
|
|
||||||
addi r4,r4,8
|
|
||||||
bdnz 91b
|
|
||||||
93: beqlr
|
|
||||||
mtctr r5
|
|
||||||
92: stb r0,0(r4)
|
|
||||||
addi r4,r4,1
|
|
||||||
bdnz 92b
|
|
||||||
blr
|
blr
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -389,10 +366,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD)
|
|||||||
ld r5,-8(r1)
|
ld r5,-8(r1)
|
||||||
add r6,r6,r5
|
add r6,r6,r5
|
||||||
subf r3,r3,r6 /* #bytes not copied */
|
subf r3,r3,r6 /* #bytes not copied */
|
||||||
190:
|
blr
|
||||||
191:
|
|
||||||
192:
|
|
||||||
blr /* #bytes not copied in r3 */
|
|
||||||
|
|
||||||
EX_TABLE(20b,120b)
|
EX_TABLE(20b,120b)
|
||||||
EX_TABLE(220b,320b)
|
EX_TABLE(220b,320b)
|
||||||
@ -451,9 +425,6 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD)
|
|||||||
EX_TABLE(88b,188b)
|
EX_TABLE(88b,188b)
|
||||||
EX_TABLE(43b,143b)
|
EX_TABLE(43b,143b)
|
||||||
EX_TABLE(89b,189b)
|
EX_TABLE(89b,189b)
|
||||||
EX_TABLE(90b,190b)
|
|
||||||
EX_TABLE(91b,191b)
|
|
||||||
EX_TABLE(92b,192b)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Routine to copy a whole page of data, optimized for POWER4.
|
* Routine to copy a whole page of data, optimized for POWER4.
|
||||||
|
@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Functions which are too large to be inlined.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version
|
|
||||||
* 2 of the License, or (at your option) any later version.
|
|
||||||
*/
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/uaccess.h>
|
|
||||||
|
|
||||||
unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)
|
|
||||||
{
|
|
||||||
if (likely(access_ok(VERIFY_READ, from, n)))
|
|
||||||
n = __copy_from_user(to, from, n);
|
|
||||||
else
|
|
||||||
memset(to, 0, n);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
|
|
||||||
{
|
|
||||||
if (likely(access_ok(VERIFY_WRITE, to, n)))
|
|
||||||
n = __copy_to_user(to, from, n);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long copy_in_user(void __user *to, const void __user *from,
|
|
||||||
unsigned long n)
|
|
||||||
{
|
|
||||||
might_sleep();
|
|
||||||
if (likely(access_ok(VERIFY_READ, from, n) &&
|
|
||||||
access_ok(VERIFY_WRITE, to, n)))
|
|
||||||
n =__copy_tofrom_user(to, from, n);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(copy_from_user);
|
|
||||||
EXPORT_SYMBOL(copy_to_user);
|
|
||||||
EXPORT_SYMBOL(copy_in_user);
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user