| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef _LINUX_PERSONALITY_H | 
 | 2 | #define _LINUX_PERSONALITY_H | 
 | 3 |  | 
| Ralf Baechle | 34e856e | 2006-10-19 23:28:17 -0700 | [diff] [blame] | 4 | #ifdef __KERNEL__ | 
 | 5 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 6 | /* | 
 | 7 |  * Handling of different ABIs (personalities). | 
 | 8 |  */ | 
 | 9 |  | 
 | 10 | struct exec_domain; | 
 | 11 | struct pt_regs; | 
 | 12 |  | 
 | 13 | extern int		register_exec_domain(struct exec_domain *); | 
 | 14 | extern int		unregister_exec_domain(struct exec_domain *); | 
 | 15 | extern int		__set_personality(unsigned long); | 
 | 16 |  | 
| Ralf Baechle | 34e856e | 2006-10-19 23:28:17 -0700 | [diff] [blame] | 17 | #endif /* __KERNEL__ */ | 
 | 18 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 19 | /* | 
 | 20 |  * Flags for bug emulation. | 
 | 21 |  * | 
 | 22 |  * These occupy the top three bytes. | 
 | 23 |  */ | 
 | 24 | enum { | 
 | 25 | 	ADDR_NO_RANDOMIZE = 	0x0040000,	/* disable randomization of VA space */ | 
 | 26 | 	FDPIC_FUNCPTRS =	0x0080000,	/* userspace function ptrs point to descriptors | 
 | 27 | 						 * (signal handling) | 
 | 28 | 						 */ | 
 | 29 | 	MMAP_PAGE_ZERO =	0x0100000, | 
 | 30 | 	ADDR_COMPAT_LAYOUT =	0x0200000, | 
 | 31 | 	READ_IMPLIES_EXEC =	0x0400000, | 
 | 32 | 	ADDR_LIMIT_32BIT =	0x0800000, | 
 | 33 | 	SHORT_INODE =		0x1000000, | 
 | 34 | 	WHOLE_SECONDS =		0x2000000, | 
 | 35 | 	STICKY_TIMEOUTS	=	0x4000000, | 
 | 36 | 	ADDR_LIMIT_3GB = 	0x8000000, | 
 | 37 | }; | 
 | 38 |  | 
 | 39 | /* | 
 | 40 |  * Security-relevant compatibility flags that must be | 
 | 41 |  * cleared upon setuid or setgid exec: | 
 | 42 |  */ | 
 | 43 | #define PER_CLEAR_ON_SETID (READ_IMPLIES_EXEC|ADDR_NO_RANDOMIZE) | 
 | 44 |  | 
 | 45 | /* | 
 | 46 |  * Personality types. | 
 | 47 |  * | 
 | 48 |  * These go in the low byte.  Avoid using the top bit, it will | 
 | 49 |  * conflict with error returns. | 
 | 50 |  */ | 
 | 51 | enum { | 
 | 52 | 	PER_LINUX =		0x0000, | 
 | 53 | 	PER_LINUX_32BIT =	0x0000 | ADDR_LIMIT_32BIT, | 
 | 54 | 	PER_LINUX_FDPIC =	0x0000 | FDPIC_FUNCPTRS, | 
 | 55 | 	PER_SVR4 =		0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO, | 
 | 56 | 	PER_SVR3 =		0x0002 | STICKY_TIMEOUTS | SHORT_INODE, | 
 | 57 | 	PER_SCOSVR3 =		0x0003 | STICKY_TIMEOUTS | | 
 | 58 | 					 WHOLE_SECONDS | SHORT_INODE, | 
 | 59 | 	PER_OSR5 =		0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS, | 
 | 60 | 	PER_WYSEV386 =		0x0004 | STICKY_TIMEOUTS | SHORT_INODE, | 
 | 61 | 	PER_ISCR4 =		0x0005 | STICKY_TIMEOUTS, | 
 | 62 | 	PER_BSD =		0x0006, | 
 | 63 | 	PER_SUNOS =		0x0006 | STICKY_TIMEOUTS, | 
 | 64 | 	PER_XENIX =		0x0007 | STICKY_TIMEOUTS | SHORT_INODE, | 
 | 65 | 	PER_LINUX32 =		0x0008, | 
 | 66 | 	PER_LINUX32_3GB =	0x0008 | ADDR_LIMIT_3GB, | 
 | 67 | 	PER_IRIX32 =		0x0009 | STICKY_TIMEOUTS,/* IRIX5 32-bit */ | 
 | 68 | 	PER_IRIXN32 =		0x000a | STICKY_TIMEOUTS,/* IRIX6 new 32-bit */ | 
 | 69 | 	PER_IRIX64 =		0x000b | STICKY_TIMEOUTS,/* IRIX6 64-bit */ | 
 | 70 | 	PER_RISCOS =		0x000c, | 
 | 71 | 	PER_SOLARIS =		0x000d | STICKY_TIMEOUTS, | 
 | 72 | 	PER_UW7 =		0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO, | 
 | 73 | 	PER_OSF4 =		0x000f,			 /* OSF/1 v4 */ | 
 | 74 | 	PER_HPUX =		0x0010, | 
 | 75 | 	PER_MASK =		0x00ff, | 
 | 76 | }; | 
 | 77 |  | 
| Ralf Baechle | 34e856e | 2006-10-19 23:28:17 -0700 | [diff] [blame] | 78 | #ifdef __KERNEL__ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 79 |  | 
 | 80 | /* | 
 | 81 |  * Description of an execution domain. | 
 | 82 |  *  | 
 | 83 |  * The first two members are refernced from assembly source | 
 | 84 |  * and should stay where they are unless explicitly needed. | 
 | 85 |  */ | 
 | 86 | typedef void (*handler_t)(int, struct pt_regs *); | 
 | 87 |  | 
 | 88 | struct exec_domain { | 
 | 89 | 	const char		*name;		/* name of the execdomain */ | 
 | 90 | 	handler_t		handler;	/* handler for syscalls */ | 
 | 91 | 	unsigned char		pers_low;	/* lowest personality */ | 
 | 92 | 	unsigned char		pers_high;	/* highest personality */ | 
 | 93 | 	unsigned long		*signal_map;	/* signal mapping */ | 
 | 94 | 	unsigned long		*signal_invmap;	/* reverse signal mapping */ | 
 | 95 | 	struct map_segment	*err_map;	/* error mapping */ | 
 | 96 | 	struct map_segment	*socktype_map;	/* socket type mapping */ | 
 | 97 | 	struct map_segment	*sockopt_map;	/* socket option mapping */ | 
 | 98 | 	struct map_segment	*af_map;	/* address family mapping */ | 
 | 99 | 	struct module		*module;	/* module context of the ed. */ | 
 | 100 | 	struct exec_domain	*next;		/* linked list (internal) */ | 
 | 101 | }; | 
 | 102 |  | 
 | 103 | /* | 
 | 104 |  * Return the base personality without flags. | 
 | 105 |  */ | 
 | 106 | #define personality(pers)	(pers & PER_MASK) | 
 | 107 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 108 |  | 
 | 109 | /* | 
 | 110 |  * Change personality of the currently running process. | 
 | 111 |  */ | 
 | 112 | #define set_personality(pers) \ | 
| Russell King | d8b295f | 2006-11-10 12:27:53 -0800 | [diff] [blame] | 113 | 	((current->personality == (pers)) ? 0 : __set_personality(pers)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 114 |  | 
| Ralf Baechle | 34e856e | 2006-10-19 23:28:17 -0700 | [diff] [blame] | 115 | #endif /* __KERNEL__ */ | 
 | 116 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 117 | #endif /* _LINUX_PERSONALITY_H */ |