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

📄 uaccess.h

📁 基于组件方式开发操作系统的OSKIT源代码
💻 H
字号:
/* * linux/include/asm-arm/proc-armv/uaccess.h *//* * The fs functions are implemented on the ARMV3 and V4 architectures * using the domain register. * *  DOMAIN_IO     - domain 2 includes all IO only *  DOMAIN_KERNEL - domain 1 includes all kernel memory only *  DOMAIN_USER   - domain 0 includes all user memory only */#include <asm/hardware.h>#define DOMAIN_CLIENT	1#define DOMAIN_MANAGER	3 #define DOMAIN_USER_CLIENT	((DOMAIN_CLIENT) << 0)#define DOMAIN_USER_MANAGER	((DOMAIN_MANAGER) << 0)#define DOMAIN_KERNEL_CLIENT	((DOMAIN_CLIENT) << 2)#define DOMAIN_KERNEL_MANAGER	((DOMAIN_MANAGER) << 2)#define DOMAIN_IO_CLIENT	((DOMAIN_CLIENT) << 4)#define DOMAIN_IO_MANAGER	((DOMAIN_MANAGER) << 4)/* * When we want to access kernel memory in the *_user functions, * we change the domain register to KERNEL_DS, thus allowing * unrestricted access */#define KERNEL_DOMAIN	(DOMAIN_USER_CLIENT | DOMAIN_KERNEL_MANAGER | DOMAIN_IO_CLIENT)#define USER_DOMAIN	(DOMAIN_USER_CLIENT | DOMAIN_KERNEL_CLIENT  | DOMAIN_IO_CLIENT)/* * Note that this is actually 0x1,0000,0000 */#define KERNEL_DS	0x00000000#define USER_DS		PAGE_OFFSET#define get_ds()	(KERNEL_DS)#define get_fs()	(current->addr_limit)#define segment_eq(a,b)	((a) == (b))#ifdef OSKIT#define set_fs(x)	(current->addr_limit = (x))/* All accesses are okay? */#define __range_ok(addr,size)		1#define __addr_ok(addr)			1#define access_ok(type,addr,size)	1#elseextern __inline__ void set_fs (mm_segment_t fs){	current->addr_limit = fs;	__asm__ __volatile__("mcr	p15, 0, %0, c3, c0" :		: "r" (fs ? USER_DOMAIN : KERNEL_DOMAIN));}/* We use 33-bit arithmetic here... */#define __range_ok(addr,size) ({ \	unsigned long flag, sum; \	__asm__ __volatile__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" \		: "=&r" (flag), "=&r" (sum) \		: "r" (addr), "Ir" (size), "0" (current->addr_limit) \		: "cc"); \	flag; })#define __addr_ok(addr) ({ \	unsigned long flag; \	__asm__ __volatile__("cmp %2, %0; movlo %0, #0" \		: "=&r" (flag) \		: "0" (current->addr_limit), "r" (addr) \		: "cc"); \	(flag == 0); })#define access_ok(type,addr,size) (__range_ok(addr,size) == 0)#endif /* OSKIT */#define __put_user_asm_byte(x,addr,err)				\	__asm__ __volatile__(					\	"1:	strbt	%1,[%2],#0\n"				\	"2:\n"							\	"	.section .fixup,\"ax\"\n"			\	"	.align	2\n"					\	"3:	mvn	%0, %3\n"				\	"	b	2b\n"					\	"	.previous\n"					\	"	.section __ex_table,\"a\"\n"			\	"	.align	3\n"					\	"	.long	1b, 3b\n"				\	"	.previous"					\	: "=r" (err)						\	: "r" (x), "r" (addr), "i" (EFAULT), "0" (err))#define __put_user_asm_half(x,addr,err)				\({								\	unsigned long __temp = (unsigned long)(x);		\	__asm__ __volatile__(					\	"1:	strbt	%1,[%3],#0\n"				\	"2:	strbt	%2,[%4],#0\n"				\	"3:\n"							\	"	.section .fixup,\"ax\"\n"			\	"	.align	2\n"					\	"4:	mvn	%0, %5\n"				\	"	b	3b\n"					\	"	.previous\n"					\	"	.section __ex_table,\"a\"\n"			\	"	.align	3\n"					\	"	.long	1b, 4b\n"				\	"	.long	2b, 4b\n"				\	"	.previous"					\	: "=r" (err)						\	: "r" (__temp), "r" (__temp >> 8),			\	  "r" (addr), "r" ((int)(addr) + 1),			\	   "i" (EFAULT), "0" (err));				\})#define __put_user_asm_word(x,addr,err)				\	__asm__ __volatile__(					\	"1:	strt	%1,[%2],#0\n"				\	"2:\n"							\	"	.section .fixup,\"ax\"\n"			\	"	.align	2\n"					\	"3:	mvn	%0, %3\n"				\	"	b	2b\n"					\	"	.previous\n"					\	"	.section __ex_table,\"a\"\n"			\	"	.align	3\n"					\	"	.long	1b, 3b\n"				\	"	.previous"					\	: "=r" (err)						\	: "r" (x), "r" (addr), "i" (EFAULT), "0" (err))#define __get_user_asm_byte(x,addr,err)				\	__asm__ __volatile__(					\	"1:	ldrbt	%1,[%2],#0\n"				\	"2:\n"							\	"	.section .fixup,\"ax\"\n"			\	"	.align	2\n"					\	"3:	mvn	%0, %3\n"				\	"	mov	%1, #0\n"				\	"	b	2b\n"					\	"	.previous\n"					\	"	.section __ex_table,\"a\"\n"			\	"	.align	3\n"					\	"	.long	1b, 3b\n"				\	"	.previous"					\	: "=r" (err), "=r" (x)					\	: "r" (addr), "i" (EFAULT), "0" (err))#define __get_user_asm_half(x,addr,err)				\({								\	unsigned long __temp;					\	__asm__ __volatile__(					\	"1:	ldrbt	%1,[%3],#0\n"				\	"2:	ldrbt	%2,[%4],#0\n"				\	"	orr	%1, %1, %2, lsl #8\n"			\	"3:\n"							\	"	.section .fixup,\"ax\"\n"			\	"	.align	2\n"					\	"4:	mvn	%0, %5\n"				\	"	mov	%1, #0\n"				\	"	b	3b\n"					\	"	.previous\n"					\	"	.section __ex_table,\"a\"\n"			\	"	.align	3\n"					\	"	.long	1b, 4b\n"				\	"	.long	2b, 4b\n"				\	"	.previous"					\	: "=r" (err), "=r" (x), "=&r" (__temp)			\	: "r" (addr), "r" ((int)(addr) + 1),			\	   "i" (EFAULT), "0" (err));				\})#define __get_user_asm_word(x,addr,err)				\	__asm__ __volatile__(					\	"1:	ldrt	%1,[%2],#0\n"				\	"2:\n"							\	"	.section .fixup,\"ax\"\n"			\	"	.align	2\n"					\	"3:	mvn	%0, %3\n"				\	"	mov	%1, #0\n"				\	"	b	2b\n"					\	"	.previous\n"					\	"	.section __ex_table,\"a\"\n"			\	"	.align	3\n"					\	"	.long	1b, 3b\n"				\	"	.previous"					\	: "=r" (err), "=r" (x)					\	: "r" (addr), "i" (EFAULT), "0" (err))#ifdef OSKITstatic inline unsigned long__arch_copy_from_user(void *to, const void *from, unsigned long n){	memcpy(to, from, n);	return 0;	/* Totally stupid */}#elseextern unsigned long __arch_copy_from_user(void *to, const void *from, unsigned long n);#endif#define __do_copy_from_user(to,from,n)				\	(n) = __arch_copy_from_user(to,from,n)#ifdef OSKITstatic inline unsigned long__arch_copy_to_user(void *to, const void *from, unsigned long n){	memcpy(to, from, n);	return 0;	/* Totally stupid */}#elseextern unsigned long __arch_copy_to_user(void *to, const void *from, unsigned long n);#endif#define __do_copy_to_user(to,from,n)				\	(n) = __arch_copy_to_user(to,from,n)extern unsigned long __arch_clear_user(void *addr, unsigned long n);#define __do_clear_user(addr,sz)				\	(sz) = __arch_clear_user(addr,sz)extern unsigned long __arch_strncpy_from_user(char *to, const char *from, unsigned long count);#define __do_strncpy_from_user(dst,src,count,res)		\	(res) = __arch_strncpy_from_user(dst,src,count)extern unsigned long __arch_strlen_user(const char *s);#define __do_strlen_user(s,res)					\	(res) = __arch_strlen_user(s)

⌨️ 快捷键说明

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