151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/*
251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Authors:    Hans-Peter Nilsson (hp@axis.com)
351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */
551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#ifndef _CRIS_ARCH_UACCESS_H
651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define _CRIS_ARCH_UACCESS_H
751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/*
951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * We don't tell gcc that we are accessing memory, but this is OK
1051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * because we do not write to any memory gcc knows about, so there
1151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * are no aliasing issues.
1251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
1351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Note that PC at a fault is the address *at* the faulting
1451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * instruction for CRISv32.
1551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */
1651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __put_user_asm(x, addr, err, op)			\
1751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm__ __volatile__(					\
1851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	"op" %1,[%2]\n"				\
1951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:\n"						\
2051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section .fixup,\"ax\"\n"		\
2151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	move.d %3,%0\n"				\
2251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	jump 4b\n"				\
2351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	nop\n"					\
2451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"				\
2551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section __ex_table,\"a\"\n"		\
2651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n"				\
2751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"				\
2851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "=r" (err)					\
2951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "r" (x), "r" (addr), "g" (-EFAULT), "0" (err))
3051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
3151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __put_user_asm_64(x, addr, err) do {			\
3251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int dummy_for_put_user_asm_64_;				\
3351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm__ __volatile__(					\
3451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	move.d %M2,[%1+]\n"			\
3551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	move.d %H2,[%1]\n"			\
3651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:\n"						\
3751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section .fixup,\"ax\"\n"		\
3851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	move.d %4,%0\n"				\
3951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	jump 5b\n"				\
4051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"				\
4151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section __ex_table,\"a\"\n"		\
4251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n"				\
4351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,3b\n"				\
4451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"				\
4551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "=r" (err), "=b" (dummy_for_put_user_asm_64_)	\
4651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "r" (x), "1" (addr), "g" (-EFAULT),		\
4751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		  "0" (err));					\
4851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} while (0)
4951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
5051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* See comment before __put_user_asm.  */
5151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
5251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __get_user_asm(x, addr, err, op)		\
5351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm__ __volatile__(				\
5451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	"op" [%2],%1\n"			\
5551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:\n"					\
5651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section .fixup,\"ax\"\n"	\
5751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	move.d %3,%0\n"			\
5851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	jump 4b\n"			\
5951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	moveq 0,%1\n"			\
6051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"			\
6151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section __ex_table,\"a\"\n"	\
6251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n"			\
6351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"			\
6451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "=r" (err), "=r" (x)			\
6551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "r" (addr), "g" (-EFAULT), "0" (err))
6651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
6751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __get_user_asm_64(x, addr, err) do {		\
6851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int dummy_for_get_user_asm_64_;			\
6951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm__ __volatile__(				\
7051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	move.d [%2+],%M1\n"		\
7151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	move.d [%2],%H1\n"		\
7251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:\n"					\
7351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section .fixup,\"ax\"\n"	\
7451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	move.d %4,%0\n"			\
7551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	jump 5b\n"			\
7651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	moveq 0,%1\n"			\
7751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"			\
7851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section __ex_table,\"a\"\n"	\
7951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n"			\
8051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,3b\n"			\
8151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"			\
8251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "=r" (err), "=r" (x),			\
8351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		  "=b" (dummy_for_get_user_asm_64_)	\
8451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "2" (addr), "g" (-EFAULT), "0" (err));\
8551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} while (0)
8651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
8751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/*
8851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Copy a null terminated string from userspace.
8951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
9051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Must return:
9151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * -EFAULT		for an exception
9251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * count		if we hit the buffer limit
9351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * bytes copied		if we hit a null byte
9451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * (without the null byte)
9551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */
96d9b5444eeb3a663ca4a625878b1421c9e9b18e8bAdrian Bunkstatic inline long
9751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik__do_strncpy_from_user(char *dst, const char *src, long count)
9851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
9951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	long res;
10051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
10151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (count == 0)
10251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		return 0;
10351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
10451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/*
10551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 * Currently, in 2.4.0-test9, most ports use a simple byte-copy loop.
10651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *  So do we.
10751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *
10851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *  This code is deduced from:
10951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *
11051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *	char tmp2;
11151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *	long tmp1, tmp3;
11251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *	tmp1 = count;
11351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *	while ((*dst++ = (tmp2 = *src++)) != 0
11451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *	       && --tmp1)
11551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *	  ;
11651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *
11751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *	res = count - tmp1;
11851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *
11951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *  with tweaks.
12051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 */
12151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
12251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm__ __volatile__ (
12351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d %3,%0\n"
12451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:	move.b [%2+],$acr\n"
125da2af0a771caa8f8cff9c7bfc979f0510eb0faeaJesper Nilsson		"1:	beq 6f\n"
12651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b $acr,[%1+]\n"
12751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
12851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	subq 1,%0\n"
12951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	bne 1b\n"
13051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b [%2+],$acr\n"
13151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
132da2af0a771caa8f8cff9c7bfc979f0510eb0faeaJesper Nilsson		"6:	sub.d %3,%0\n"
13351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	neg.d %0,%0\n"
13451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:\n"
13551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section .fixup,\"ax\"\n"
13651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	move.d %7,%0\n"
13751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	jump 3b\n"
13851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	nop\n"
13951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
14051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* The address for a fault at the first move is trivial.
14151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   The address for a fault at the second move is that of
14251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   the preceding branch insn, since the move insn is in
143da2af0a771caa8f8cff9c7bfc979f0510eb0faeaJesper Nilsson		   its delay-slot.  Just so you don't get confused...  */
14451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"
14551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section __ex_table,\"a\"\n"
14651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 5b,4b\n"
14751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,4b\n"
14851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous"
14951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "=r" (res), "=b" (dst), "=b" (src), "=r" (count)
15051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "3" (count), "1" (dst), "2" (src), "g" (-EFAULT)
15151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "acr");
15251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
15351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return res;
15451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
15551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
15651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* A few copy asms to build up the more complex ones from.
15751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
15851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   Note again, a post-increment is performed regardless of whether a bus
15951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   fault occurred in that instruction, and PC for a faulted insn is the
16051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   address for the insn, or for the preceding branch when in a delay-slot.  */
16151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
16251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_user_cont(to, from, ret, COPY, FIXUP, TENTRY) \
16351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm__ __volatile__ (				\
16451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
16551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"1:\n"					\
16651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section .fixup,\"ax\"\n"	\
16751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
16851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"			\
16951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section __ex_table,\"a\"\n"	\
17051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
17151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"			\
17251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "=b" (to), "=b" (from), "=r" (ret)	\
17351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "0" (to), "1" (from), "2" (ret)	\
17451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "acr", "memory")
17551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
17651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_1(to, from, ret) \
17751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_user_cont(to, from, ret,	\
17851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	move.b [%1+],$acr\n"	\
17951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b $acr,[%0+]\n",	\
18051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	addq 1,%2\n"		\
18151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	jump 1b\n"		\
18251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.b [%0+]\n",	\
18351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n")
18451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
18551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_2x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
18651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_user_cont(to, from, ret,		\
18751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
18851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	move.w [%1+],$acr\n"		\
18951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.w $acr,[%0+]\n",		\
19051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
19151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	addq 2,%2\n"			\
19251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	jump 1b\n"			\
19351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.w [%0+]\n",		\
19451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
19551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n")
19651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
19751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_2(to, from, ret) \
19851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_2x_cont(to, from, ret, "", "", "")
19951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
20051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_3(to, from, ret)		\
20151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_2x_cont(to, from, ret,	\
20251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	move.b [%1+],$acr\n"		\
20351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b $acr,[%0+]\n",		\
20451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:	addq 1,%2\n"			\
20551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.b [%0+]\n",		\
20651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,5b\n")
20751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
20851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_4x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
20951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_user_cont(to, from, ret,		\
21051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
21151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	move.d [%1+],$acr\n"		\
21251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d $acr,[%0+]\n",		\
21351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
21451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	addq 4,%2\n"			\
21551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	jump 1b\n"			\
21651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.d [%0+]\n",		\
21751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
21851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n")
21951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
22051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_4(to, from, ret) \
22151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_4x_cont(to, from, ret, "", "", "")
22251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
22351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_5(to, from, ret) \
22451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_4x_cont(to, from, ret,	\
22551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	move.b [%1+],$acr\n"		\
22651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b $acr,[%0+]\n",		\
22751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:	addq 1,%2\n"			\
22851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.b [%0+]\n",		\
22951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,5b\n")
23051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
23151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_6x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
23251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_4x_cont(to, from, ret,	\
23351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
23451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	move.w [%1+],$acr\n"		\
23551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.w $acr,[%0+]\n",		\
23651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
23751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:	addq 2,%2\n"			\
23851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.w [%0+]\n",		\
23951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
24051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,5b\n")
24151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
24251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_6(to, from, ret) \
24351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_6x_cont(to, from, ret, "", "", "")
24451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
24551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_7(to, from, ret) \
24651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_6x_cont(to, from, ret,	\
24751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"6:	move.b [%1+],$acr\n"		\
24851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b $acr,[%0+]\n",		\
24951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"7:	addq 1,%2\n"			\
25051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.b [%0+]\n",		\
25151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 6b,7b\n")
25251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
25351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_8x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
25451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_4x_cont(to, from, ret,	\
25551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
25651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	move.d [%1+],$acr\n"		\
25751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d $acr,[%0+]\n",		\
25851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
25951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:	addq 4,%2\n"			\
26051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.d [%0+]\n",		\
26151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
26251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,5b\n")
26351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
26451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_8(to, from, ret) \
26551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_8x_cont(to, from, ret, "", "", "")
26651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
26751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_9(to, from, ret) \
26851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_8x_cont(to, from, ret,	\
26951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"6:	move.b [%1+],$acr\n"		\
27051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b $acr,[%0+]\n",		\
27151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"7:	addq 1,%2\n"			\
27251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.b [%0+]\n",		\
27351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 6b,7b\n")
27451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
27551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_10x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
27651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_8x_cont(to, from, ret,	\
27751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
27851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"6:	move.w [%1+],$acr\n"		\
27951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.w $acr,[%0+]\n",		\
28051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
28151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"7:	addq 2,%2\n"			\
28251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.w [%0+]\n",		\
28351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
28451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 6b,7b\n")
28551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
28651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_10(to, from, ret) \
28751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_10x_cont(to, from, ret, "", "", "")
28851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
28951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_11(to, from, ret)		\
29051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_10x_cont(to, from, ret,	\
29151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"8:	move.b [%1+],$acr\n"		\
29251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b $acr,[%0+]\n",		\
29351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"9:	addq 1,%2\n"			\
29451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.b [%0+]\n",		\
29551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 8b,9b\n")
29651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
29751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_12x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
29851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_8x_cont(to, from, ret,	\
29951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
30051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"6:	move.d [%1+],$acr\n"		\
30151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d $acr,[%0+]\n",		\
30251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
30351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"7:	addq 4,%2\n"			\
30451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.d [%0+]\n",		\
30551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
30651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 6b,7b\n")
30751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
30851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_12(to, from, ret) \
30951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_12x_cont(to, from, ret, "", "", "")
31051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
31151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_13(to, from, ret) \
31251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_12x_cont(to, from, ret,	\
31351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"8:	move.b [%1+],$acr\n"		\
31451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b $acr,[%0+]\n",		\
31551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"9:	addq 1,%2\n"			\
31651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.b [%0+]\n",		\
31751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 8b,9b\n")
31851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
31951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_14x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
32051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_12x_cont(to, from, ret,	\
32151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
32251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"8:	move.w [%1+],$acr\n"		\
32351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.w $acr,[%0+]\n",		\
32451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
32551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"9:	addq 2,%2\n"			\
32651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.w [%0+]\n",		\
32751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
32851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 8b,9b\n")
32951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
33051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_14(to, from, ret) \
33151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_14x_cont(to, from, ret, "", "", "")
33251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
33351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_15(to, from, ret) \
33451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_14x_cont(to, from, ret,	\
33551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"10:	move.b [%1+],$acr\n"		\
33651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b $acr,[%0+]\n",		\
33751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"11:	addq 1,%2\n"			\
33851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.b [%0+]\n",		\
33951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 10b,11b\n")
34051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
34151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_16x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
34251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_12x_cont(to, from, ret,	\
34351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
34451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"8:	move.d [%1+],$acr\n"		\
34551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d $acr,[%0+]\n",		\
34651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
34751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"9:	addq 4,%2\n"			\
34851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.d [%0+]\n",		\
34951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
35051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 8b,9b\n")
35151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
35251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_16(to, from, ret) \
35351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_16x_cont(to, from, ret, "", "", "")
35451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
35551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_20x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
35651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_16x_cont(to, from, ret,	\
35751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
35851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"10:	move.d [%1+],$acr\n"		\
35951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d $acr,[%0+]\n",		\
36051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
36151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"11:	addq 4,%2\n"			\
36251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.d [%0+]\n",		\
36351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
36451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 10b,11b\n")
36551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
36651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_20(to, from, ret) \
36751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_20x_cont(to, from, ret, "", "", "")
36851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
36951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_24x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
37051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_20x_cont(to, from, ret,	\
37151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
37251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"12:	move.d [%1+],$acr\n"		\
37351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d $acr,[%0+]\n",		\
37451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
37551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"13:	addq 4,%2\n"			\
37651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.d [%0+]\n",		\
37751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
37851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 12b,13b\n")
37951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
38051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_24(to, from, ret) \
38151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_from_user_24x_cont(to, from, ret, "", "", "")
38251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
38351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* And now, the to-user ones.  */
38451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
38551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_1(to, from, ret)	\
38651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_user_cont(to, from, ret,	\
38751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b [%1+],$acr\n"	\
38851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	move.b $acr,[%0+]\n",	\
38951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	jump 1b\n"		\
39051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	addq 1,%2\n",		\
39151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n")
39251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
39351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_2x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
39451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_user_cont(to, from, ret,		\
39551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
39651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.w [%1+],$acr\n"		\
39751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	move.w $acr,[%0+]\n",		\
39851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
39951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	jump 1b\n"			\
40051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	addq 2,%2\n",			\
40151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
40251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n")
40351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
40451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_2(to, from, ret) \
40551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_2x_cont(to, from, ret, "", "", "")
40651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
40751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_3(to, from, ret) \
40851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_2x_cont(to, from, ret,	\
40951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b [%1+],$acr\n"		\
41051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	move.b $acr,[%0+]\n",		\
41151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:	addq 1,%2\n",			\
41251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,5b\n")
41351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
41451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_4x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
41551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_user_cont(to, from, ret,		\
41651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
41751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d [%1+],$acr\n"		\
41851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	move.d $acr,[%0+]\n",		\
41951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
42051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	jump 1b\n"			\
42151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	addq 4,%2\n",			\
42251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
42351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n")
42451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
42551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_4(to, from, ret) \
42651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_4x_cont(to, from, ret, "", "", "")
42751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
42851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_5(to, from, ret) \
42951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_4x_cont(to, from, ret,	\
43051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b [%1+],$acr\n"		\
43151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	move.b $acr,[%0+]\n",		\
43251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:	addq 1,%2\n",			\
43351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,5b\n")
43451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
43551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_6x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
43651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_4x_cont(to, from, ret,	\
43751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
43851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.w [%1+],$acr\n"		\
43951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	move.w $acr,[%0+]\n",		\
44051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
44151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:	addq 2,%2\n",			\
44251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
44351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,5b\n")
44451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
44551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_6(to, from, ret) \
44651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_6x_cont(to, from, ret, "", "", "")
44751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
44851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_7(to, from, ret) \
44951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_6x_cont(to, from, ret,	\
45051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b [%1+],$acr\n"		\
45151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"6:	move.b $acr,[%0+]\n",		\
45251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"7:	addq 1,%2\n",			\
45351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 6b,7b\n")
45451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
45551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_8x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
45651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_4x_cont(to, from, ret,	\
45751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
45851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d [%1+],$acr\n"		\
45951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	move.d $acr,[%0+]\n",		\
46051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
46151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:	addq 4,%2\n",			\
46251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
46351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,5b\n")
46451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
46551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_8(to, from, ret) \
46651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_8x_cont(to, from, ret, "", "", "")
46751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
46851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_9(to, from, ret) \
46951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_8x_cont(to, from, ret,	\
47051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b [%1+],$acr\n"		\
47151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"6:	move.b $acr,[%0+]\n",		\
47251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"7:	addq 1,%2\n",			\
47351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 6b,7b\n")
47451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
47551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_10x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
47651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_8x_cont(to, from, ret,	\
47751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
47851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.w [%1+],$acr\n"		\
47951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"6:	move.w $acr,[%0+]\n",		\
48051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
48151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"7:	addq 2,%2\n",			\
48251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
48351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 6b,7b\n")
48451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
48551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_10(to, from, ret) \
48651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_10x_cont(to, from, ret, "", "", "")
48751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
48851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_11(to, from, ret) \
48951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_10x_cont(to, from, ret,	\
49051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b [%1+],$acr\n"		\
49151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"8:	move.b $acr,[%0+]\n",		\
49251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"9:	addq 1,%2\n",			\
49351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 8b,9b\n")
49451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
49551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_12x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
49651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_8x_cont(to, from, ret,	\
49751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
49851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d [%1+],$acr\n"		\
49951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"6:	move.d $acr,[%0+]\n",		\
50051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
50151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"7:	addq 4,%2\n",			\
50251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
50351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 6b,7b\n")
50451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
50551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_12(to, from, ret) \
50651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_12x_cont(to, from, ret, "", "", "")
50751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
50851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_13(to, from, ret) \
50951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_12x_cont(to, from, ret,	\
51051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b [%1+],$acr\n"		\
51151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"8:	move.b $acr,[%0+]\n",		\
51251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"9:	addq 1,%2\n",			\
51351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 8b,9b\n")
51451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
51551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_14x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
51651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_12x_cont(to, from, ret,	\
51751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
51851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.w [%1+],$acr\n"		\
51951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"8:	move.w $acr,[%0+]\n",		\
52051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
52151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"9:	addq 2,%2\n",			\
52251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
52351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 8b,9b\n")
52451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
52551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_14(to, from, ret)	\
52651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_14x_cont(to, from, ret, "", "", "")
52751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
52851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_15(to, from, ret) \
52951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_14x_cont(to, from, ret,	\
53051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.b [%1+],$acr\n"		\
53151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"10:	move.b $acr,[%0+]\n",		\
53251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"11:	addq 1,%2\n",			\
53351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 10b,11b\n")
53451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
53551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_16x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
53651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_12x_cont(to, from, ret,	\
53751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
53851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d [%1+],$acr\n"		\
53951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"8:	move.d $acr,[%0+]\n",		\
54051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
54151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"9:	addq 4,%2\n",			\
54251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
54351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 8b,9b\n")
54451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
54551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_16(to, from, ret) \
54651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_16x_cont(to, from, ret, "", "", "")
54751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
54851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_20x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
54951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_16x_cont(to, from, ret,	\
55051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
55151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d [%1+],$acr\n"		\
55251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"10:	move.d $acr,[%0+]\n",		\
55351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
55451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"11:	addq 4,%2\n",			\
55551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
55651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 10b,11b\n")
55751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
55851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_20(to, from, ret) \
55951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_20x_cont(to, from, ret, "", "", "")
56051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
56151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_24x_cont(to, from, ret, COPY, FIXUP, TENTRY)	\
56251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_20x_cont(to, from, ret,	\
56351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			COPY				\
56451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d [%1+],$acr\n"		\
56551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"12:	move.d $acr,[%0+]\n",		\
56651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
56751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"13:	addq 4,%2\n",			\
56851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
56951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 12b,13b\n")
57051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
57151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_24(to, from, ret)	\
57251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_copy_to_user_24x_cont(to, from, ret, "", "", "")
57351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
57451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Define a few clearing asms with exception handlers.  */
57551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
57651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* This frame-asm is like the __asm_copy_user_cont one, but has one less
57751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   input.  */
57851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
57951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear(to, ret, CLEAR, FIXUP, TENTRY) \
58051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm__ __volatile__ (				\
58151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			CLEAR				\
58251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"1:\n"					\
58351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section .fixup,\"ax\"\n"	\
58451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
58551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"			\
58651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section __ex_table,\"a\"\n"	\
58751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
58851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous"			\
58951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "=b" (to), "=r" (ret)			\
59051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "0" (to), "1" (ret)			\
59151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "memory")
59251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
59351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_1(to, ret) \
59451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear(to, ret,			\
59551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	clear.b [%0+]\n",	\
59651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	jump 1b\n"		\
59751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	addq 1,%1\n",		\
59851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n")
59951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
60051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_2(to, ret) \
60151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear(to, ret,			\
60251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	clear.w [%0+]\n",	\
60351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	jump 1b\n"		\
60451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	addq 2,%1\n",		\
60551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n")
60651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
60751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_3(to, ret) \
60851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik     __asm_clear(to, ret,			\
60951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		 "2:	clear.w [%0+]\n"	\
61051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		 "3:	clear.b [%0+]\n",	\
61151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		 "4:	addq 2,%1\n"		\
61251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		 "5:	jump 1b\n"		\
61351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		 "	addq 1,%1\n",		\
61451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		 "	.dword 2b,4b\n"		\
61551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		 "	.dword 3b,5b\n")
61651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
61751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_4x_cont(to, ret, CLEAR, FIXUP, TENTRY) \
61851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear(to, ret,				\
61951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			CLEAR				\
62051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:	clear.d [%0+]\n",		\
62151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
62251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	jump 1b\n"			\
62351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	addq 4,%1\n",			\
62451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
62551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 2b,3b\n")
62651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
62751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_4(to, ret) \
62851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear_4x_cont(to, ret, "", "", "")
62951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
63051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_8x_cont(to, ret, CLEAR, FIXUP, TENTRY) \
63151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear_4x_cont(to, ret,			\
63251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			CLEAR				\
63351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	clear.d [%0+]\n",		\
63451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
63551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"5:	addq 4,%1\n",			\
63651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
63751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,5b\n")
63851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
63951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_8(to, ret) \
64051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear_8x_cont(to, ret, "", "", "")
64151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
64251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_12x_cont(to, ret, CLEAR, FIXUP, TENTRY) \
64351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear_8x_cont(to, ret,			\
64451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			CLEAR				\
64551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"6:	clear.d [%0+]\n",		\
64651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
64751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"7:	addq 4,%1\n",			\
64851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
64951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 6b,7b\n")
65051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
65151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_12(to, ret) \
65251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear_12x_cont(to, ret, "", "", "")
65351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
65451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_16x_cont(to, ret, CLEAR, FIXUP, TENTRY) \
65551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear_12x_cont(to, ret,			\
65651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			CLEAR				\
65751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"8:	clear.d [%0+]\n",		\
65851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
65951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"9:	addq 4,%1\n",			\
66051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
66151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 8b,9b\n")
66251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
66351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_16(to, ret) \
66451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear_16x_cont(to, ret, "", "", "")
66551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
66651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_20x_cont(to, ret, CLEAR, FIXUP, TENTRY) \
66751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear_16x_cont(to, ret,			\
66851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			CLEAR				\
66951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"10:	clear.d [%0+]\n",		\
67051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
67151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"11:	addq 4,%1\n",			\
67251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
67351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 10b,11b\n")
67451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
67551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_20(to, ret) \
67651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear_20x_cont(to, ret, "", "", "")
67751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
67851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_24x_cont(to, ret, CLEAR, FIXUP, TENTRY) \
67951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear_20x_cont(to, ret,			\
68051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			CLEAR				\
68151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"12:	clear.d [%0+]\n",		\
68251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			FIXUP				\
68351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"13:	addq 4,%1\n",			\
68451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			TENTRY				\
68551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 12b,13b\n")
68651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
68751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_24(to, ret) \
68851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm_clear_24x_cont(to, ret, "", "", "")
68951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
69051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/*
69151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Return the size of a string (including the ending 0)
69251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
69351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Return length of string in userspace including terminating 0
69451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * or 0 for error.  Return a value greater than N if too long.
69551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */
69651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
697d9b5444eeb3a663ca4a625878b1421c9e9b18e8bAdrian Bunkstatic inline long
69851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstrnlen_user(const char *s, long n)
69951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
70051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	long res, tmp1;
70151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
70251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (!access_ok(VERIFY_READ, s, 0))
70351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		return 0;
70451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
70551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/*
70651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 * This code is deduced from:
70751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *
70851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *	tmp1 = n;
70951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *	while (tmp1-- > 0 && *s++)
71051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *	  ;
71151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *
71251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *	res = n - tmp1;
71351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *
71451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 *  (with tweaks).
71551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	 */
71651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
71751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm__ __volatile__ (
71851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d %1,$acr\n"
71951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	cmpq 0,$acr\n"
72051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"0:\n"
72151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	ble 1f\n"
72251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	subq 1,$acr\n"
72351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
72451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"4:	test.b [%0+]\n"
72551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	bne 0b\n"
72651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	cmpq 0,$acr\n"
72751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"1:\n"
72851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	move.d %1,%0\n"
72951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	sub.d $acr,%0\n"
73051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"2:\n"
73151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section .fixup,\"ax\"\n"
73251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
73351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"3:	jump 2b\n"
73451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	clear.d %0\n"
73551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
73651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"
73751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.section __ex_table,\"a\"\n"
73851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.dword 4b,3b\n"
73951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		"	.previous\n"
74051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "=r" (res), "=r" (tmp1)
74151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "0" (s), "1" (n)
74251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		: "acr");
74351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
74451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return res;
74551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
74651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
74751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#endif
748