Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
422 | giacomo | 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 | /* |
||
17 | * Sysctl variables related to binary emulation. |
||
18 | */ |
||
19 | extern unsigned long abi_defhandler_coff; |
||
20 | extern unsigned long abi_defhandler_elf; |
||
21 | extern unsigned long abi_defhandler_lcall7; |
||
22 | extern unsigned long abi_defhandler_libcso; |
||
23 | extern int abi_fake_utsname; |
||
24 | |||
25 | |||
26 | /* |
||
27 | * Flags for bug emulation. |
||
28 | * |
||
29 | * These occupy the top three bytes. |
||
30 | */ |
||
31 | enum { |
||
32 | MMAP_PAGE_ZERO = 0x0100000, |
||
33 | ADDR_LIMIT_32BIT = 0x0800000, |
||
34 | SHORT_INODE = 0x1000000, |
||
35 | WHOLE_SECONDS = 0x2000000, |
||
36 | STICKY_TIMEOUTS = 0x4000000, |
||
37 | ADDR_LIMIT_3GB = 0x8000000, |
||
38 | }; |
||
39 | |||
40 | /* |
||
41 | * Personality types. |
||
42 | * |
||
43 | * These go in the low byte. Avoid using the top bit, it will |
||
44 | * conflict with error returns. |
||
45 | */ |
||
46 | enum { |
||
47 | PER_LINUX = 0x0000, |
||
48 | PER_LINUX_32BIT = 0x0000 | ADDR_LIMIT_32BIT, |
||
49 | PER_SVR4 = 0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO, |
||
50 | PER_SVR3 = 0x0002 | STICKY_TIMEOUTS | SHORT_INODE, |
||
51 | PER_SCOSVR3 = 0x0003 | STICKY_TIMEOUTS | |
||
52 | WHOLE_SECONDS | SHORT_INODE, |
||
53 | PER_OSR5 = 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS, |
||
54 | PER_WYSEV386 = 0x0004 | STICKY_TIMEOUTS | SHORT_INODE, |
||
55 | PER_ISCR4 = 0x0005 | STICKY_TIMEOUTS, |
||
56 | PER_BSD = 0x0006, |
||
57 | PER_SUNOS = 0x0006 | STICKY_TIMEOUTS, |
||
58 | PER_XENIX = 0x0007 | STICKY_TIMEOUTS | SHORT_INODE, |
||
59 | PER_LINUX32 = 0x0008, |
||
60 | PER_LINUX32_3GB = 0x0008 | ADDR_LIMIT_3GB, |
||
61 | PER_IRIX32 = 0x0009 | STICKY_TIMEOUTS,/* IRIX5 32-bit */ |
||
62 | PER_IRIXN32 = 0x000a | STICKY_TIMEOUTS,/* IRIX6 new 32-bit */ |
||
63 | PER_IRIX64 = 0x000b | STICKY_TIMEOUTS,/* IRIX6 64-bit */ |
||
64 | PER_RISCOS = 0x000c, |
||
65 | PER_SOLARIS = 0x000d | STICKY_TIMEOUTS, |
||
66 | PER_UW7 = 0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO, |
||
67 | PER_OSF4 = 0x000f, /* OSF/1 v4 */ |
||
68 | PER_HPUX = 0x0010, |
||
69 | PER_MASK = 0x00ff, |
||
70 | }; |
||
71 | |||
72 | |||
73 | /* |
||
74 | * Description of an execution domain. |
||
75 | * |
||
76 | * The first two members are refernced from assembly source |
||
77 | * and should stay where they are unless explicitly needed. |
||
78 | */ |
||
79 | typedef void (*handler_t)(int, struct pt_regs *); |
||
80 | |||
81 | struct exec_domain { |
||
82 | const char *name; /* name of the execdomain */ |
||
83 | handler_t handler; /* handler for syscalls */ |
||
84 | unsigned char pers_low; /* lowest personality */ |
||
85 | unsigned char pers_high; /* highest personality */ |
||
86 | unsigned long *signal_map; /* signal mapping */ |
||
87 | unsigned long *signal_invmap; /* reverse signal mapping */ |
||
88 | struct map_segment *err_map; /* error mapping */ |
||
89 | struct map_segment *socktype_map; /* socket type mapping */ |
||
90 | struct map_segment *sockopt_map; /* socket option mapping */ |
||
91 | struct map_segment *af_map; /* address family mapping */ |
||
92 | struct module *module; /* module context of the ed. */ |
||
93 | struct exec_domain *next; /* linked list (internal) */ |
||
94 | }; |
||
95 | |||
96 | /* |
||
97 | * Return the base personality without flags. |
||
98 | */ |
||
99 | #define personality(pers) (pers & PER_MASK) |
||
100 | |||
101 | /* |
||
102 | * Personality of the currently running process. |
||
103 | */ |
||
104 | #define get_personality (current->personality) |
||
105 | |||
106 | /* |
||
107 | * Change personality of the currently running process. |
||
108 | */ |
||
109 | #define set_personality(pers) \ |
||
110 | ((current->personality == pers) ? 0 : __set_personality(pers)) |
||
111 | |||
112 | #endif /* _LINUX_PERSONALITY_H */ |