⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uaccess.h

📁 《嵌入式系统设计与实例开发实验教材二源码》Linux内核移植与编译实验
💻 H
📖 第 1 页 / 共 2 页
字号:
    default:	switch (n & 3) {	case 0:	    __copy_from_user_big(to, from, n, "", "");	    break;	case 1:	    __copy_from_user_big(to, from, n,				 /* fixup */				 "1: addql #1,%2\n"				 "   clrb (%0)+",				 /* copy */				 "2: movesb (%1)+,%%d0\n"				 "   moveb %%d0,(%0)+\n"				 ".section __ex_table,\"a\"\n"				 "   .long 2b,1b\n"				 ".previous");	    break;	case 2:	    __copy_from_user_big(to, from, n,				 /* fixup */				 "1: addql #2,%2\n"				 "   clrw (%0)+",				 /* copy */				 "2: movesw (%1)+,%%d0\n"				 "   movew %%d0,(%0)+\n"				 ".section __ex_table,\"a\"\n"				 "   .long 2b,1b\n"				 ".previous");	    break;	case 3:	    __copy_from_user_big(to, from, n,				 /* fixup */				 "1: addql #2,%2\n"				 "   clrw (%0)+\n"				 "2: addql #1,%2\n"				 "   clrb (%0)+",				 /* copy */				 "3: movesw (%1)+,%%d0\n"				 "   movew %%d0,(%0)+\n"				 "4: movesb (%1)+,%%d0\n"				 "   moveb %%d0,(%0)+\n"				 ".section __ex_table,\"a\"\n"				 "   .long 3b,1b\n"				 "   .long 4b,2b\n"				 ".previous");	    break;	}	break;    }    return n;}#define __copy_to_user_big(to, from, n, fixup, copy)	\    __asm__ __volatile__				\	("10: movel (%1)+,%%d0\n"			\	 "31: movesl %%d0,(%0)+\n"			\	 "11: subql #1,%2\n"				\	 "    jne 10b\n"				\	 "41:\n"					\	 ".section .fixup,\"ax\"\n"			\	 "   .even\n"					\	 "22: addql #1,%2\n"				\	 "12: lsll #2,%2\n"				\	 fixup "\n"					\	 "    jra 13f\n"				\	 ".previous\n"					\	 ".section __ex_table,\"a\"\n"			\	 "    .align 4\n"				\	 "    .long 10b,22b\n"				\	 "    .long 31b,12b\n"				\	 "    .long 11b,12b\n"				\	 "    .long 41b,22b\n"				\	 ".previous\n"					\	 copy "\n"					\	 "13:"						\	 : "=a"(to), "=a"(from), "=d"(n)		\	 : "0"(to), "1"(from), "2"(n/4)			\	 : "d0", "memory")static inline unsigned long__constant_copy_to_user(void *to, const void *from, unsigned long n){    switch (n) {    case 0:	break;    case 1:	__asm__ __volatile__	    ("   moveb (%1)+,%%d0\n"	     "21:movesb %%d0,(%0)+\n"	     "1:\n"	     ".section .fixup,\"ax\"\n"	     "   .even\n"	     "2: addql #1,%2\n"	     "   jra 1b\n"	     ".previous\n"	     ".section __ex_table,\"a\"\n"	     "   .align 4\n  "	     "   .long 21b,2b\n"	     "   .long 1b,2b\n"	     ".previous"	     : "=a"(to), "=a"(from), "=d"(n)	     : "0"(to), "1"(from), "2"(0)	     : "d0", "memory");	break;    case 2:	__asm__ __volatile__	    ("   movew (%1)+,%%d0\n"	     "21:movesw %%d0,(%0)+\n"	     "1:\n"	     ".section .fixup,\"ax\"\n"	     "   .even\n"	     "2: addql #2,%2\n"	     "   jra 1b\n"	     ".previous\n"	     ".section __ex_table,\"a\"\n"	     "   .align 4\n"	     "   .long 21b,2b\n"	     "   .long 1b,2b\n"	     ".previous"	     : "=a"(to), "=a"(from), "=d"(n)	     : "0"(to), "1"(from), "2"(0)	     : "d0", "memory");	break;    case 3:	__asm__ __volatile__	    ("   movew (%1)+,%%d0\n"	     "21:movesw %%d0,(%0)+\n"	     "1: moveb (%1)+,%%d0\n"	     "22:movesb %%d0,(%0)+\n"	     "2:\n"	     ".section .fixup,\"ax\"\n"	     "   .even\n"	     "3: addql #2,%2\n"	     "4: addql #1,%2\n"	     "   jra 2b\n"	     ".previous\n"	     ".section __ex_table,\"a\"\n"	     "   .align 4\n"	     "   .long 21b,3b\n"	     "   .long 1b,3b\n"	     "   .long 22b,4b\n"	     "   .long 2b,4b\n"	     ".previous"	     : "=a"(to), "=a"(from), "=d"(n)	     : "0"(to), "1"(from), "2"(0)	     : "d0", "memory");	break;    case 4:	__asm__ __volatile__	    ("   movel (%1)+,%%d0\n"	     "21:movesl %%d0,(%0)+\n"	     "1:\n"	     ".section .fixup,\"ax\"\n"	     "   .even\n"	     "2: addql #4,%2\n"	     "   jra 1b\n"	     ".previous\n"	     ".section __ex_table,\"a\"\n"	     "   .align 4\n"	     "   .long 21b,2b\n"	     "   .long 1b,2b\n"	     ".previous"	     : "=a"(to), "=a"(from), "=d"(n)	     : "0"(to), "1"(from), "2"(0)	     : "d0", "memory");	break;    case 8:	__asm__ __volatile__	    ("   movel (%1)+,%%d0\n"	     "21:movesl %%d0,(%0)+\n"	     "1: movel (%1)+,%%d0\n"	     "22:movesl %%d0,(%0)+\n"	     "2:\n"	     ".section .fixup,\"ax\"\n"	     "   .even\n"	     "3: addql #4,%2\n"	     "4: addql #4,%2\n"	     "   jra 2b\n"	     ".previous\n"	     ".section __ex_table,\"a\"\n"	     "   .align 4\n"	     "   .long 21b,3b\n"	     "   .long 1b,3b\n"	     "   .long 22b,4b\n"	     "   .long 2b,4b\n"	     ".previous"	     : "=a"(to), "=a"(from), "=d"(n)	     : "0"(to), "1"(from), "2"(0)	     : "d0", "memory");	break;    case 12:	__asm__ __volatile__	    ("   movel (%1)+,%%d0\n"	     "21:movesl %%d0,(%0)+\n"	     "1: movel (%1)+,%%d0\n"	     "22:movesl %%d0,(%0)+\n"	     "2: movel (%1)+,%%d0\n"	     "23:movesl %%d0,(%0)+\n"	     "3:\n"	     ".section .fixup,\"ax\"\n"	     "   .even\n"	     "4: addql #4,%2\n"	     "5: addql #4,%2\n"	     "6: addql #4,%2\n"	     "   jra 3b\n"	     ".previous\n"	     ".section __ex_table,\"a\"\n"	     "   .align 4\n"	     "   .long 21b,4b\n"	     "   .long 1b,4b\n"	     "   .long 22b,5b\n"	     "   .long 2b,5b\n"	     "   .long 23b,6b\n"	     "   .long 3b,6b\n"	     ".previous"	     : "=a"(to), "=a"(from), "=d"(n)	     : "0"(to), "1"(from), "2"(0)	     : "d0", "memory");	break;    case 16:	__asm__ __volatile__	    ("   movel (%1)+,%%d0\n"	     "21:movesl %%d0,(%0)+\n"	     "1: movel (%1)+,%%d0\n"	     "22:movesl %%d0,(%0)+\n"	     "2: movel (%1)+,%%d0\n"	     "23:movesl %%d0,(%0)+\n"	     "3: movel (%1)+,%%d0\n"	     "24:movesl %%d0,(%0)+\n"	     "4:"	     ".section .fixup,\"ax\"\n"	     "   .even\n"	     "5: addql #4,%2\n"	     "6: addql #4,%2\n"	     "7: addql #4,%2\n"	     "8: addql #4,%2\n"	     "   jra 4b\n"	     ".previous\n"	     ".section __ex_table,\"a\"\n"	     "   .align 4\n"	     "   .long 21b,5b\n"	     "   .long 1b,5b\n"	     "   .long 22b,6b\n"	     "   .long 2b,6b\n"	     "   .long 23b,7b\n"	     "   .long 3b,7b\n"	     "   .long 24b,8b\n"	     "   .long 4b,8b\n"	     ".previous"	     : "=a"(to), "=a"(from), "=d"(n)	     : "0"(to), "1"(from), "2"(0)	     : "d0", "memory");	break;    default:	switch (n & 3) {	case 0:	    __copy_to_user_big(to, from, n, "", "");	    break;	case 1:	    __copy_to_user_big(to, from, n,			       /* fixup */			       "1: addql #1,%2",			       /* copy */			       "   moveb (%1)+,%%d0\n"			       "22:movesb %%d0,(%0)+\n"			       "2:"			       ".section __ex_table,\"a\"\n"			       "   .long 22b,1b\n"			       "   .long 2b,1b\n"			       ".previous");	    break;	case 2:	    __copy_to_user_big(to, from, n,			       /* fixup */			       "1: addql #2,%2",			       /* copy */			       "   movew (%1)+,%%d0\n"			       "22:movesw %%d0,(%0)+\n"			       "2:"			       ".section __ex_table,\"a\"\n"			       "   .long 22b,1b\n"			       "   .long 2b,1b\n"			       ".previous");	    break;	case 3:	    __copy_to_user_big(to, from, n,			       /* fixup */			       "1: addql #2,%2\n"			       "2: addql #1,%2",			       /* copy */			       "   movew (%1)+,%%d0\n"			       "23:movesw %%d0,(%0)+\n"			       "3: moveb (%1)+,%%d0\n"			       "24:movesb %%d0,(%0)+\n"			       "4:"			       ".section __ex_table,\"a\"\n"			       "   .long 23b,1b\n"			       "   .long 3b,1b\n"			       "   .long 24b,2b\n"			       "   .long 4b,2b\n"			       ".previous");	    break;	}	break;    }    return n;}#define copy_from_user(to, from, n)		\(__builtin_constant_p(n) ?			\ __constant_copy_from_user(to, from, n) :	\ __generic_copy_from_user(to, from, n))#define copy_to_user(to, from, n)		\(__builtin_constant_p(n) ?			\ __constant_copy_to_user(to, from, n) :		\ __generic_copy_to_user(to, from, n))#define __copy_from_user(to, from, n) copy_from_user(to, from, n)#define __copy_to_user(to, from, n) copy_to_user(to, from, n)/* * Copy a null terminated string from userspace. */static inline longstrncpy_from_user(char *dst, const char *src, long count){    long res;    if (count == 0) return count;    __asm__ __volatile__	("1: movesb (%2)+,%%d0\n"	 "12:moveb %%d0,(%1)+\n"	 "   jeq 2f\n"	 "   subql #1,%3\n"	 "   jne 1b\n"	 "2: subl %3,%0\n"	 "3:\n"	 ".section .fixup,\"ax\"\n"	 "   .even\n"	 "4: movel %4,%0\n"	 "   jra 3b\n"	 ".previous\n"	 ".section __ex_table,\"a\"\n"	 "   .align 4\n"	 "   .long 1b,4b\n"	 "   .long 12b,4b\n"	 ".previous"	 : "=d"(res), "=a"(dst), "=a"(src), "=d"(count)	 : "i"(-EFAULT), "0"(count), "1"(dst), "2"(src), "3"(count)	 : "d0", "memory");    return res;}/* * Return the size of a string (including the ending 0) * * Return 0 on exception, a value greater than N if too long */static inline long strnlen_user(const char *src, long n){	long res;	res = -(long)src;	__asm__ __volatile__		("1:\n"		 "   tstl %2\n"		 "   jeq 3f\n"		 "2: movesb (%1)+,%%d0\n"		 "22:\n"		 "   subql #1,%2\n"		 "   tstb %%d0\n"		 "   jne 1b\n"		 "   jra 4f\n"		 "3:\n"		 "   addql #1,%0\n"		 "4:\n"		 "   addl %1,%0\n"		 "5:\n"		 ".section .fixup,\"ax\"\n"		 "   .even\n"		 "6: moveq %3,%0\n"		 "   jra 5b\n"		 ".previous\n"		 ".section __ex_table,\"a\"\n"		 "   .align 4\n"		 "   .long 2b,6b\n"		 "   .long 22b,6b\n"		 ".previous"		 : "=d"(res), "=a"(src), "=d"(n)		 : "i"(0), "0"(res), "1"(src), "2"(n)		 : "d0");	return res;}#define strlen_user(str) strnlen_user(str, 32767)/* * Zero Userspace */static inline unsigned longclear_user(void *to, unsigned long n){    __asm__ __volatile__	("   tstl %1\n"	 "   jeq 3f\n"	 "1: movesl %3,(%0)+\n"	 "2: subql #1,%1\n"	 "   jne 1b\n"	 "3: movel %2,%1\n"	 "   bclr #1,%1\n"	 "   jeq 4f\n"	 "24:movesw %3,(%0)+\n"	 "4: bclr #0,%1\n"	 "   jeq 5f\n"	 "25:movesb %3,(%0)+\n"	 "5:\n"	 ".section .fixup,\"ax\"\n"	 "   .even\n"	 "61:addql #1,%1\n"	 "6: lsll #2,%1\n"	 "   addl %2,%1\n"	 "   jra 5b\n"	 "7: addql #2,%1\n"	 "   jra 5b\n"	 "8: addql #1,%1\n"	 "   jra 5b\n"	 ".previous\n"	 ".section __ex_table,\"a\"\n"	 "   .align 4\n"	 "   .long 1b,61b\n"	 "   .long 2b,6b\n"	 "   .long 3b,61b\n"	 "   .long 24b,7b\n"	 "   .long 4b,7b\n"	 "   .long 25b,8b\n"	 "   .long 5b,8b\n"	 ".previous"	 : "=a"(to), "=d"(n)	 : "r"(n & 3), "r"(0), "0"(to), "1"(n/4));    return n;}#endif /* _M68K_UACCESS_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -