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