mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge branches 'uaccess.alpha', 'uaccess.arc', 'uaccess.arm', 'uaccess.arm64', 'uaccess.avr32', 'uaccess.bfin', 'uaccess.c6x', 'uaccess.cris', 'uaccess.frv', 'uaccess.h8300', 'uaccess.hexagon', 'uaccess.ia64', 'uaccess.m32r', 'uaccess.m68k', 'uaccess.metag', 'uaccess.microblaze', 'uaccess.mips', 'uaccess.mn10300', 'uaccess.nios2', 'uaccess.openrisc', 'uaccess.parisc', 'uaccess.powerpc', 'uaccess.s390', 'uaccess.score', 'uaccess.sh', 'uaccess.sparc', 'uaccess.tile', 'uaccess.um', 'uaccess.unicore32', 'uaccess.x86' and 'uaccess.xtensa' into work.uaccess
This commit is contained in:
parent
bf7af0cea8
ec022681a4
e13909a4ac
4de5b63e76
92430dab36
e5c1540030
50e9ab915a
86944ee158
0c7e9a870e
48f666c986
33ab2da801
ac4691fac8
b3622d3217
9a677341cd
29be02eb6f
840db3f938
d491afb865
2260ea86c0
19dbf70c5a
de51d6cc2c
ab89866be3
f64fd180ec
3448890c32
37096003c8
dc14253523
f98f48ee7c
31af2f36d5
23504bae7f
a668ce3a00
2ef59f2856
beba3a20bf
7d4914db8f
commit
eea86b637a
1311 changed files with 18197 additions and 12582 deletions
|
|
@ -71,6 +71,7 @@ config CRIS
|
|||
select GENERIC_SCHED_CLOCK if ETRAX_ARCH_V32
|
||||
select HAVE_DEBUG_BUGVERBOSE if ETRAX_ARCH_V32
|
||||
select HAVE_NMI
|
||||
select ARCH_HAS_RAW_COPY_USER
|
||||
|
||||
config HZ
|
||||
int
|
||||
|
|
|
|||
|
|
@ -188,11 +188,10 @@ unsigned long __copy_user(void __user *pdst, const void *psrc, unsigned long pn)
|
|||
}
|
||||
EXPORT_SYMBOL(__copy_user);
|
||||
|
||||
/* Copy from user to kernel, zeroing the bytes that were inaccessible in
|
||||
userland. The return-value is the number of bytes that were
|
||||
/* Copy from user to kernel. The return-value is the number of bytes that were
|
||||
inaccessible. */
|
||||
|
||||
unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
||||
unsigned long __copy_user_in(void *pdst, const void __user *psrc,
|
||||
unsigned long pn)
|
||||
{
|
||||
/* We want the parameters put in special registers.
|
||||
|
|
@ -217,19 +216,17 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
|||
{
|
||||
__asm_copy_from_user_1 (dst, src, retn);
|
||||
n--;
|
||||
if (retn)
|
||||
goto exception;
|
||||
}
|
||||
|
||||
if (((unsigned long) src & 2) && n >= 2)
|
||||
{
|
||||
__asm_copy_from_user_2 (dst, src, retn);
|
||||
n -= 2;
|
||||
if (retn)
|
||||
goto exception;
|
||||
}
|
||||
|
||||
/* We only need one check after the unalignment-adjustments, because
|
||||
if both adjustments were done, either both or neither reference
|
||||
had an exception. */
|
||||
if (retn != 0)
|
||||
goto copy_exception_bytes;
|
||||
}
|
||||
|
||||
/* Decide which copying method to use. */
|
||||
|
|
@ -328,7 +325,7 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
|||
n -= 4;
|
||||
|
||||
if (retn)
|
||||
goto copy_exception_bytes;
|
||||
goto exception;
|
||||
}
|
||||
|
||||
/* If we get here, there were no memory read faults. */
|
||||
|
|
@ -356,20 +353,10 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
|||
bytes. */
|
||||
return retn;
|
||||
|
||||
copy_exception_bytes:
|
||||
/* We already have "retn" bytes cleared, and need to clear the
|
||||
remaining "n" bytes. A non-optimized simple byte-for-byte in-line
|
||||
memset is preferred here, since this isn't speed-critical code and
|
||||
we'd rather have this a leaf-function than calling memset. */
|
||||
{
|
||||
char *endp;
|
||||
for (endp = dst + n; dst < endp; dst++)
|
||||
*dst = 0;
|
||||
}
|
||||
|
||||
exception:
|
||||
return retn + n;
|
||||
}
|
||||
EXPORT_SYMBOL(__copy_user_zeroing);
|
||||
EXPORT_SYMBOL(__copy_user_in);
|
||||
|
||||
/* Zero userspace. */
|
||||
unsigned long __do_clear_user(void __user *pto, unsigned long pn)
|
||||
|
|
|
|||
|
|
@ -2086,7 +2086,7 @@ static void cryptocop_job_queue_close(void)
|
|||
dma_in_cfg.en = regk_dma_no;
|
||||
REG_WR(dma, IN_DMA_INST, rw_cfg, dma_in_cfg);
|
||||
|
||||
/* Disble the cryptocop. */
|
||||
/* Disable the cryptocop. */
|
||||
rw_cfg = REG_RD(strcop, regi_strcop, rw_cfg);
|
||||
rw_cfg.en = 0;
|
||||
REG_WR(strcop, regi_strcop, rw_cfg, rw_cfg);
|
||||
|
|
|
|||
|
|
@ -156,10 +156,9 @@ unsigned long __copy_user(void __user *pdst, const void *psrc, unsigned long pn)
|
|||
}
|
||||
EXPORT_SYMBOL(__copy_user);
|
||||
|
||||
/* Copy from user to kernel, zeroing the bytes that were inaccessible in
|
||||
userland. The return-value is the number of bytes that were
|
||||
/* Copy from user to kernel. The return-value is the number of bytes that were
|
||||
inaccessible. */
|
||||
unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
||||
unsigned long __copy_user_in(void *pdst, const void __user *psrc,
|
||||
unsigned long pn)
|
||||
{
|
||||
/* We want the parameters put in special registers.
|
||||
|
|
@ -184,19 +183,18 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
|||
{
|
||||
__asm_copy_from_user_1 (dst, src, retn);
|
||||
n--;
|
||||
if (retn != 0)
|
||||
goto exception;
|
||||
}
|
||||
|
||||
if (((unsigned long) src & 2) && n >= 2)
|
||||
{
|
||||
__asm_copy_from_user_2 (dst, src, retn);
|
||||
n -= 2;
|
||||
if (retn != 0)
|
||||
goto exception;
|
||||
}
|
||||
|
||||
/* We only need one check after the unalignment-adjustments, because
|
||||
if both adjustments were done, either both or neither reference
|
||||
had an exception. */
|
||||
if (retn != 0)
|
||||
goto copy_exception_bytes;
|
||||
}
|
||||
|
||||
/* Movem is dirt cheap. The overheap is low enough to always use the
|
||||
|
|
@ -279,7 +277,7 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
|||
n -= 4;
|
||||
|
||||
if (retn)
|
||||
goto copy_exception_bytes;
|
||||
goto exception;
|
||||
}
|
||||
|
||||
/* If we get here, there were no memory read faults. */
|
||||
|
|
@ -307,20 +305,10 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
|||
bytes. */
|
||||
return retn;
|
||||
|
||||
copy_exception_bytes:
|
||||
/* We already have "retn" bytes cleared, and need to clear the
|
||||
remaining "n" bytes. A non-optimized simple byte-for-byte in-line
|
||||
memset is preferred here, since this isn't speed-critical code and
|
||||
we'd rather have this a leaf-function than calling memset. */
|
||||
{
|
||||
char *endp;
|
||||
for (endp = dst + n; dst < endp; dst++)
|
||||
*dst = 0;
|
||||
}
|
||||
|
||||
exception:
|
||||
return retn + n;
|
||||
}
|
||||
EXPORT_SYMBOL(__copy_user_zeroing);
|
||||
EXPORT_SYMBOL(__copy_user_in);
|
||||
|
||||
/* Zero userspace. */
|
||||
unsigned long __do_clear_user(void __user *pto, unsigned long pn)
|
||||
|
|
|
|||
|
|
@ -172,16 +172,14 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_user_cont(to, from, ret, \
|
||||
" move.b [%1+],$r9\n" \
|
||||
"2: move.b $r9,[%0+]\n", \
|
||||
"3: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"3: addq 1,%2\n", \
|
||||
" .dword 2b,3b\n")
|
||||
|
||||
#define __asm_copy_from_user_2x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
__asm_copy_user_cont(to, from, ret, \
|
||||
" move.w [%1+],$r9\n" \
|
||||
"2: move.w $r9,[%0+]\n" COPY, \
|
||||
"3: addq 2,%2\n" \
|
||||
" clear.w [%0+]\n" FIXUP, \
|
||||
"3: addq 2,%2\n" FIXUP, \
|
||||
" .dword 2b,3b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_2(to, from, ret) \
|
||||
|
|
@ -191,16 +189,14 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_2x_cont(to, from, ret, \
|
||||
" move.b [%1+],$r9\n" \
|
||||
"4: move.b $r9,[%0+]\n", \
|
||||
"5: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"5: addq 1,%2\n", \
|
||||
" .dword 4b,5b\n")
|
||||
|
||||
#define __asm_copy_from_user_4x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
__asm_copy_user_cont(to, from, ret, \
|
||||
" move.d [%1+],$r9\n" \
|
||||
"2: move.d $r9,[%0+]\n" COPY, \
|
||||
"3: addq 4,%2\n" \
|
||||
" clear.d [%0+]\n" FIXUP, \
|
||||
"3: addq 4,%2\n" FIXUP, \
|
||||
" .dword 2b,3b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_4(to, from, ret) \
|
||||
|
|
@ -210,8 +206,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_4x_cont(to, from, ret, \
|
||||
" move.b [%1+],$r9\n" \
|
||||
"4: move.b $r9,[%0+]\n", \
|
||||
"5: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"5: addq 1,%2\n", \
|
||||
" .dword 4b,5b\n")
|
||||
|
||||
#define __asm_copy_from_user_6x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -219,7 +214,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
" move.w [%1+],$r9\n" \
|
||||
"4: move.w $r9,[%0+]\n" COPY, \
|
||||
"5: addq 2,%2\n" \
|
||||
" clear.w [%0+]\n" FIXUP, \
|
||||
FIXUP, \
|
||||
" .dword 4b,5b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_6(to, from, ret) \
|
||||
|
|
@ -229,8 +224,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_6x_cont(to, from, ret, \
|
||||
" move.b [%1+],$r9\n" \
|
||||
"6: move.b $r9,[%0+]\n", \
|
||||
"7: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"7: addq 1,%2\n", \
|
||||
" .dword 6b,7b\n")
|
||||
|
||||
#define __asm_copy_from_user_8x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -238,7 +232,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
" move.d [%1+],$r9\n" \
|
||||
"4: move.d $r9,[%0+]\n" COPY, \
|
||||
"5: addq 4,%2\n" \
|
||||
" clear.d [%0+]\n" FIXUP, \
|
||||
FIXUP, \
|
||||
" .dword 4b,5b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_8(to, from, ret) \
|
||||
|
|
@ -248,8 +242,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_8x_cont(to, from, ret, \
|
||||
" move.b [%1+],$r9\n" \
|
||||
"6: move.b $r9,[%0+]\n", \
|
||||
"7: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"7: addq 1,%2\n", \
|
||||
" .dword 6b,7b\n")
|
||||
|
||||
#define __asm_copy_from_user_10x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -257,7 +250,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
" move.w [%1+],$r9\n" \
|
||||
"6: move.w $r9,[%0+]\n" COPY, \
|
||||
"7: addq 2,%2\n" \
|
||||
" clear.w [%0+]\n" FIXUP, \
|
||||
FIXUP, \
|
||||
" .dword 6b,7b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_10(to, from, ret) \
|
||||
|
|
@ -267,8 +260,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_10x_cont(to, from, ret, \
|
||||
" move.b [%1+],$r9\n" \
|
||||
"8: move.b $r9,[%0+]\n", \
|
||||
"9: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"9: addq 1,%2\n", \
|
||||
" .dword 8b,9b\n")
|
||||
|
||||
#define __asm_copy_from_user_12x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -276,7 +268,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
" move.d [%1+],$r9\n" \
|
||||
"6: move.d $r9,[%0+]\n" COPY, \
|
||||
"7: addq 4,%2\n" \
|
||||
" clear.d [%0+]\n" FIXUP, \
|
||||
FIXUP, \
|
||||
" .dword 6b,7b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_12(to, from, ret) \
|
||||
|
|
@ -286,8 +278,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_12x_cont(to, from, ret, \
|
||||
" move.b [%1+],$r9\n" \
|
||||
"8: move.b $r9,[%0+]\n", \
|
||||
"9: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"9: addq 1,%2\n", \
|
||||
" .dword 8b,9b\n")
|
||||
|
||||
#define __asm_copy_from_user_14x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -295,7 +286,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
" move.w [%1+],$r9\n" \
|
||||
"8: move.w $r9,[%0+]\n" COPY, \
|
||||
"9: addq 2,%2\n" \
|
||||
" clear.w [%0+]\n" FIXUP, \
|
||||
FIXUP, \
|
||||
" .dword 8b,9b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_14(to, from, ret) \
|
||||
|
|
@ -305,8 +296,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_14x_cont(to, from, ret, \
|
||||
" move.b [%1+],$r9\n" \
|
||||
"10: move.b $r9,[%0+]\n", \
|
||||
"11: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"11: addq 1,%2\n", \
|
||||
" .dword 10b,11b\n")
|
||||
|
||||
#define __asm_copy_from_user_16x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -314,7 +304,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
" move.d [%1+],$r9\n" \
|
||||
"8: move.d $r9,[%0+]\n" COPY, \
|
||||
"9: addq 4,%2\n" \
|
||||
" clear.d [%0+]\n" FIXUP, \
|
||||
FIXUP, \
|
||||
" .dword 8b,9b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_16(to, from, ret) \
|
||||
|
|
@ -325,7 +315,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
" move.d [%1+],$r9\n" \
|
||||
"10: move.d $r9,[%0+]\n" COPY, \
|
||||
"11: addq 4,%2\n" \
|
||||
" clear.d [%0+]\n" FIXUP, \
|
||||
FIXUP, \
|
||||
" .dword 10b,11b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_20(to, from, ret) \
|
||||
|
|
@ -336,7 +326,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
" move.d [%1+],$r9\n" \
|
||||
"12: move.d $r9,[%0+]\n" COPY, \
|
||||
"13: addq 4,%2\n" \
|
||||
" clear.d [%0+]\n" FIXUP, \
|
||||
FIXUP, \
|
||||
" .dword 12b,13b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_24(to, from, ret) \
|
||||
|
|
|
|||
|
|
@ -178,8 +178,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
"2: move.b [%1+],$acr\n" \
|
||||
" move.b $acr,[%0+]\n", \
|
||||
"3: addq 1,%2\n" \
|
||||
" jump 1b\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
" jump 1b\n", \
|
||||
" .dword 2b,3b\n")
|
||||
|
||||
#define __asm_copy_from_user_2x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -189,8 +188,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
" move.w $acr,[%0+]\n", \
|
||||
FIXUP \
|
||||
"3: addq 2,%2\n" \
|
||||
" jump 1b\n" \
|
||||
" clear.w [%0+]\n", \
|
||||
" jump 1b\n", \
|
||||
TENTRY \
|
||||
" .dword 2b,3b\n")
|
||||
|
||||
|
|
@ -201,8 +199,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_2x_cont(to, from, ret, \
|
||||
"4: move.b [%1+],$acr\n" \
|
||||
" move.b $acr,[%0+]\n", \
|
||||
"5: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"5: addq 1,%2\n", \
|
||||
" .dword 4b,5b\n")
|
||||
|
||||
#define __asm_copy_from_user_4x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -212,8 +209,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
" move.d $acr,[%0+]\n", \
|
||||
FIXUP \
|
||||
"3: addq 4,%2\n" \
|
||||
" jump 1b\n" \
|
||||
" clear.d [%0+]\n", \
|
||||
" jump 1b\n", \
|
||||
TENTRY \
|
||||
" .dword 2b,3b\n")
|
||||
|
||||
|
|
@ -224,8 +220,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_4x_cont(to, from, ret, \
|
||||
"4: move.b [%1+],$acr\n" \
|
||||
" move.b $acr,[%0+]\n", \
|
||||
"5: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"5: addq 1,%2\n", \
|
||||
" .dword 4b,5b\n")
|
||||
|
||||
#define __asm_copy_from_user_6x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -234,8 +229,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
"4: move.w [%1+],$acr\n" \
|
||||
" move.w $acr,[%0+]\n", \
|
||||
FIXUP \
|
||||
"5: addq 2,%2\n" \
|
||||
" clear.w [%0+]\n", \
|
||||
"5: addq 2,%2\n", \
|
||||
TENTRY \
|
||||
" .dword 4b,5b\n")
|
||||
|
||||
|
|
@ -246,8 +240,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_6x_cont(to, from, ret, \
|
||||
"6: move.b [%1+],$acr\n" \
|
||||
" move.b $acr,[%0+]\n", \
|
||||
"7: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"7: addq 1,%2\n", \
|
||||
" .dword 6b,7b\n")
|
||||
|
||||
#define __asm_copy_from_user_8x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -256,8 +249,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
"4: move.d [%1+],$acr\n" \
|
||||
" move.d $acr,[%0+]\n", \
|
||||
FIXUP \
|
||||
"5: addq 4,%2\n" \
|
||||
" clear.d [%0+]\n", \
|
||||
"5: addq 4,%2\n", \
|
||||
TENTRY \
|
||||
" .dword 4b,5b\n")
|
||||
|
||||
|
|
@ -268,8 +260,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_8x_cont(to, from, ret, \
|
||||
"6: move.b [%1+],$acr\n" \
|
||||
" move.b $acr,[%0+]\n", \
|
||||
"7: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"7: addq 1,%2\n", \
|
||||
" .dword 6b,7b\n")
|
||||
|
||||
#define __asm_copy_from_user_10x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -278,8 +269,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
"6: move.w [%1+],$acr\n" \
|
||||
" move.w $acr,[%0+]\n", \
|
||||
FIXUP \
|
||||
"7: addq 2,%2\n" \
|
||||
" clear.w [%0+]\n", \
|
||||
"7: addq 2,%2\n", \
|
||||
TENTRY \
|
||||
" .dword 6b,7b\n")
|
||||
|
||||
|
|
@ -290,8 +280,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_10x_cont(to, from, ret, \
|
||||
"8: move.b [%1+],$acr\n" \
|
||||
" move.b $acr,[%0+]\n", \
|
||||
"9: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"9: addq 1,%2\n", \
|
||||
" .dword 8b,9b\n")
|
||||
|
||||
#define __asm_copy_from_user_12x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -300,8 +289,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
"6: move.d [%1+],$acr\n" \
|
||||
" move.d $acr,[%0+]\n", \
|
||||
FIXUP \
|
||||
"7: addq 4,%2\n" \
|
||||
" clear.d [%0+]\n", \
|
||||
"7: addq 4,%2\n", \
|
||||
TENTRY \
|
||||
" .dword 6b,7b\n")
|
||||
|
||||
|
|
@ -312,8 +300,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_12x_cont(to, from, ret, \
|
||||
"8: move.b [%1+],$acr\n" \
|
||||
" move.b $acr,[%0+]\n", \
|
||||
"9: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"9: addq 1,%2\n", \
|
||||
" .dword 8b,9b\n")
|
||||
|
||||
#define __asm_copy_from_user_14x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -322,8 +309,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
"8: move.w [%1+],$acr\n" \
|
||||
" move.w $acr,[%0+]\n", \
|
||||
FIXUP \
|
||||
"9: addq 2,%2\n" \
|
||||
" clear.w [%0+]\n", \
|
||||
"9: addq 2,%2\n", \
|
||||
TENTRY \
|
||||
" .dword 8b,9b\n")
|
||||
|
||||
|
|
@ -334,8 +320,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
__asm_copy_from_user_14x_cont(to, from, ret, \
|
||||
"10: move.b [%1+],$acr\n" \
|
||||
" move.b $acr,[%0+]\n", \
|
||||
"11: addq 1,%2\n" \
|
||||
" clear.b [%0+]\n", \
|
||||
"11: addq 1,%2\n", \
|
||||
" .dword 10b,11b\n")
|
||||
|
||||
#define __asm_copy_from_user_16x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
|
|
@ -344,8 +329,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
"8: move.d [%1+],$acr\n" \
|
||||
" move.d $acr,[%0+]\n", \
|
||||
FIXUP \
|
||||
"9: addq 4,%2\n" \
|
||||
" clear.d [%0+]\n", \
|
||||
"9: addq 4,%2\n", \
|
||||
TENTRY \
|
||||
" .dword 8b,9b\n")
|
||||
|
||||
|
|
@ -358,8 +342,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
"10: move.d [%1+],$acr\n" \
|
||||
" move.d $acr,[%0+]\n", \
|
||||
FIXUP \
|
||||
"11: addq 4,%2\n" \
|
||||
" clear.d [%0+]\n", \
|
||||
"11: addq 4,%2\n", \
|
||||
TENTRY \
|
||||
" .dword 10b,11b\n")
|
||||
|
||||
|
|
@ -372,8 +355,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count)
|
|||
"12: move.d [%1+],$acr\n" \
|
||||
" move.d $acr,[%0+]\n", \
|
||||
FIXUP \
|
||||
"13: addq 4,%2\n" \
|
||||
" clear.d [%0+]\n", \
|
||||
"13: addq 4,%2\n", \
|
||||
TENTRY \
|
||||
" .dword 12b,13b\n")
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ generic-y += device.h
|
|||
generic-y += div64.h
|
||||
generic-y += errno.h
|
||||
generic-y += exec.h
|
||||
generic-y += extable.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += fcntl.h
|
||||
generic-y += futex.h
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
#define _CRIS_PGTABLE_H
|
||||
|
||||
#include <asm/page.h>
|
||||
#define __ARCH_USE_5LEVEL_HACK
|
||||
#include <asm-generic/pgtable-nopmd.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
|
|
|||
|
|
@ -15,15 +15,9 @@
|
|||
#ifndef _CRIS_UACCESS_H
|
||||
#define _CRIS_UACCESS_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/sched.h>
|
||||
#include <linux/errno.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
#define VERIFY_READ 0
|
||||
#define VERIFY_WRITE 1
|
||||
|
||||
/*
|
||||
* The fs value determines whether argument validity checking should be
|
||||
* performed or not. If get_fs() == USER_DS, checking is performed, with
|
||||
|
|
@ -49,30 +43,14 @@
|
|||
|
||||
#define segment_eq(a, b) ((a).seg == (b).seg)
|
||||
|
||||
#define __kernel_ok (segment_eq(get_fs(), KERNEL_DS))
|
||||
#define __kernel_ok (uaccess_kernel())
|
||||
#define __user_ok(addr, size) \
|
||||
(((size) <= TASK_SIZE) && ((addr) <= TASK_SIZE-(size)))
|
||||
#define __access_ok(addr, size) (__kernel_ok || __user_ok((addr), (size)))
|
||||
#define access_ok(type, addr, size) __access_ok((unsigned long)(addr), (size))
|
||||
|
||||
#include <arch/uaccess.h>
|
||||
|
||||
/*
|
||||
* The exception table consists of pairs of addresses: the first is the
|
||||
* address of an instruction that is allowed to fault, and the second is
|
||||
* the address at which the program should continue. No registers are
|
||||
* modified, so it is entirely up to the continuation code to figure out
|
||||
* what to do.
|
||||
*
|
||||
* All the routines below use bits of fixup code that are out of line
|
||||
* with the main instruction path. This means when everything is well,
|
||||
* we don't even have to jump over them. Further, they do not intrude
|
||||
* on our cache or tlb entries.
|
||||
*/
|
||||
|
||||
struct exception_table_entry {
|
||||
unsigned long insn, fixup;
|
||||
};
|
||||
#include <asm/extable.h>
|
||||
|
||||
/*
|
||||
* These are the main single-value transfer routines. They automatically
|
||||
|
|
@ -191,7 +169,7 @@ extern long __get_user_bad(void);
|
|||
live in lib/usercopy.c */
|
||||
|
||||
extern unsigned long __copy_user(void __user *to, const void *from, unsigned long n);
|
||||
extern unsigned long __copy_user_zeroing(void *to, const void __user *from, unsigned long n);
|
||||
extern unsigned long __copy_user_in(void *to, const void __user *from, unsigned long n);
|
||||
extern unsigned long __do_clear_user(void __user *to, unsigned long n);
|
||||
|
||||
static inline long
|
||||
|
|
@ -258,7 +236,7 @@ __constant_copy_from_user(void *to, const void __user *from, unsigned long n)
|
|||
else if (n == 24)
|
||||
__asm_copy_from_user_24(to, from, ret);
|
||||
else
|
||||
ret = __copy_user_zeroing(to, from, n);
|
||||
ret = __copy_user_in(to, from, n);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -358,64 +336,33 @@ static inline size_t clear_user(void __user *to, size_t n)
|
|||
return __do_clear_user(to, n);
|
||||
}
|
||||
|
||||
static inline size_t copy_from_user(void *to, const void __user *from, size_t n)
|
||||
static inline unsigned long
|
||||
raw_copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||
{
|
||||
if (unlikely(!access_ok(VERIFY_READ, from, n))) {
|
||||
memset(to, 0, n);
|
||||
return n;
|
||||
}
|
||||
if (__builtin_constant_p(n))
|
||||
return __constant_copy_from_user(to, from, n);
|
||||
else
|
||||
return __copy_user_zeroing(to, from, n);
|
||||
return __copy_user_in(to, from, n);
|
||||
}
|
||||
|
||||
static inline size_t copy_to_user(void __user *to, const void *from, size_t n)
|
||||
static inline unsigned long
|
||||
raw_copy_to_user(void __user *to, const void *from, unsigned long n)
|
||||
{
|
||||
if (unlikely(!access_ok(VERIFY_WRITE, to, n)))
|
||||
return n;
|
||||
if (__builtin_constant_p(n))
|
||||
return __constant_copy_to_user(to, from, n);
|
||||
else
|
||||
return __copy_user(to, from, n);
|
||||
}
|
||||
|
||||
/* We let the __ versions of copy_from/to_user inline, because they're often
|
||||
* used in fast paths and have only a small space overhead.
|
||||
*/
|
||||
#define INLINE_COPY_FROM_USER
|
||||
#define INLINE_COPY_TO_USER
|
||||
|
||||
static inline unsigned long
|
||||
__generic_copy_from_user_nocheck(void *to, const void __user *from,
|
||||
unsigned long n)
|
||||
{
|
||||
return __copy_user_zeroing(to, from, n);
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
__generic_copy_to_user_nocheck(void __user *to, const void *from,
|
||||
unsigned long n)
|
||||
{
|
||||
return __copy_user(to, from, n);
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
__generic_clear_user_nocheck(void __user *to, unsigned long n)
|
||||
__clear_user(void __user *to, unsigned long n)
|
||||
{
|
||||
return __do_clear_user(to, n);
|
||||
}
|
||||
|
||||
/* without checking */
|
||||
|
||||
#define __copy_to_user(to, from, n) \
|
||||
__generic_copy_to_user_nocheck((to), (from), (n))
|
||||
#define __copy_from_user(to, from, n) \
|
||||
__generic_copy_from_user_nocheck((to), (from), (n))
|
||||
#define __copy_to_user_inatomic __copy_to_user
|
||||
#define __copy_from_user_inatomic __copy_from_user
|
||||
#define __clear_user(to, n) __generic_clear_user_nocheck((to), (n))
|
||||
|
||||
#define strlen_user(str) strnlen_user((str), 0x7ffffffe)
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* _CRIS_UACCESS_H */
|
||||
|
|
|
|||
Loading…
Reference in a new issue