diff options
| author | Linus Torvalds <torvalds@athlon.transmeta.com> | 2002-02-04 20:17:27 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@athlon.transmeta.com> | 2002-02-04 20:17:27 -0800 |
| commit | 932f485f76f33b46e302fc390ee8e66529a2e5b4 (patch) | |
| tree | 80745a1b1c96c768c7ea1a2278b99a0b5ec0ab7d /include/linux/personality.h | |
| parent | 7df131525f431f502873361fa2f8da2039d96c79 (diff) | |
v2.4.9.7 -> v2.4.9.8
- Christoph Hellwig: clean up personality handling a bit
- Robert Love: update sysctl/vm documentation
- make the three-argument (that everybody hates) "min()" be "min_t()",
and introduce a type-anal "min()" that complains about arguments of
different types.
Diffstat (limited to 'include/linux/personality.h')
| -rw-r--r-- | include/linux/personality.h | 174 |
1 files changed, 116 insertions, 58 deletions
diff --git a/include/linux/personality.h b/include/linux/personality.h index 58cab509e3d7..230d39460364 100644 --- a/include/linux/personality.h +++ b/include/linux/personality.h @@ -1,68 +1,126 @@ -#ifndef _PERSONALITY_H -#define _PERSONALITY_H +#ifndef _LINUX_PERSONALITY_H +#define _LINUX_PERSONALITY_H -#include <linux/linkage.h> -#include <linux/ptrace.h> -#include <asm/current.h> +/* + * Handling of different ABIs (personalities). + */ + +struct exec_domain; +struct pt_regs; + +extern int register_exec_domain(struct exec_domain *); +extern int unregister_exec_domain(struct exec_domain *); +extern int __set_personality(unsigned long); + + +/* + * Sysctl variables related to binary emulation. + */ +extern unsigned long abi_defhandler_coff; +extern unsigned long abi_defhandler_elf; +extern unsigned long abi_defhandler_lcall7; +extern unsigned long abi_defhandler_libcso; +extern int abi_fake_utsname; -/* Flags for bug emulation. These occupy the top three bytes. */ -#define STICKY_TIMEOUTS 0x4000000 -#define WHOLE_SECONDS 0x2000000 -#define ADDR_LIMIT_32BIT 0x0800000 -/* Personality types. These go in the low byte. Avoid using the top bit, - * it will conflict with error returns. +/* + * Flags for bug emulation. + * + * These occupy the top three bytes. */ -#define PER_MASK (0x00ff) -#define PER_LINUX (0x0000) -#define PER_LINUX_32BIT (0x0000 | ADDR_LIMIT_32BIT) -#define PER_SVR4 (0x0001 | STICKY_TIMEOUTS) -#define PER_SVR3 (0x0002 | STICKY_TIMEOUTS) -#define PER_SCOSVR3 (0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS) -#define PER_WYSEV386 (0x0004 | STICKY_TIMEOUTS) -#define PER_ISCR4 (0x0005 | STICKY_TIMEOUTS) -#define PER_BSD (0x0006) -#define PER_SUNOS (PER_BSD | STICKY_TIMEOUTS) -#define PER_XENIX (0x0007 | STICKY_TIMEOUTS) -#define PER_LINUX32 (0x0008) -#define PER_IRIX32 (0x0009 | STICKY_TIMEOUTS) /* IRIX5 32-bit */ -#define PER_IRIXN32 (0x000a | STICKY_TIMEOUTS) /* IRIX6 new 32-bit */ -#define PER_IRIX64 (0x000b | STICKY_TIMEOUTS) /* IRIX6 64-bit */ -#define PER_RISCOS (0x000c) -#define PER_SOLARIS (0x000d | STICKY_TIMEOUTS) - -/* Prototype for an lcall7 syscall handler. */ -typedef void (*lcall7_func)(int, struct pt_regs *); - - -/* Description of an execution domain - personality range supported, - * lcall7 syscall handler, start up / shut down functions etc. - * N.B. The name and lcall7 handler must be where they are since the - * offset of the handler is hard coded in kernel/sys_call.S. +enum { + MMAP_PAGE_ZERO = 0x0100000, + ADDR_LIMIT_32BIT = 0x0800000, + SHORT_INODE = 0x1000000, + WHOLE_SECONDS = 0x2000000, + STICKY_TIMEOUTS = 0x4000000, +}; + +/* + * Personality types. + * + * These go in the low byte. Avoid using the top bit, it will + * conflict with error returns. + */ +enum { + PER_LINUX = 0x0000, + PER_LINUX_32BIT = 0x0000 | ADDR_LIMIT_32BIT, + PER_SVR4 = 0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO, + PER_SVR3 = 0x0002 | STICKY_TIMEOUTS | SHORT_INODE, + PER_SCOSVR3 = 0x0003 | STICKY_TIMEOUTS | + WHOLE_SECONDS | SHORT_INODE, + PER_OSR5 = 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS, + PER_WYSEV386 = 0x0004 | STICKY_TIMEOUTS | SHORT_INODE, + PER_ISCR4 = 0x0005 | STICKY_TIMEOUTS, + PER_BSD = 0x0006, + PER_SUNOS = 0x0006 | STICKY_TIMEOUTS, + PER_XENIX = 0x0007 | STICKY_TIMEOUTS | SHORT_INODE, + PER_LINUX32 = 0x0008, + PER_IRIX32 = 0x0009 | STICKY_TIMEOUTS,/* IRIX5 32-bit */ + PER_IRIXN32 = 0x000a | STICKY_TIMEOUTS,/* IRIX6 new 32-bit */ + PER_IRIX64 = 0x000b | STICKY_TIMEOUTS,/* IRIX6 64-bit */ + PER_RISCOS = 0x000c, + PER_SOLARIS = 0x000d | STICKY_TIMEOUTS, + PER_UW7 = 0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO, + PER_MASK = 0x00ff, +}; + + +/* + * Description of an execution domain. + * + * The first two members are refernced from assembly source + * and should stay where they are unless explicitly needed. */ +typedef void (*handler_t)(int, struct pt_regs *); + struct exec_domain { - const char *name; - lcall7_func handler; - unsigned char pers_low, pers_high; - unsigned long * signal_map; - unsigned long * signal_invmap; - struct module * module; - struct exec_domain *next; + const char *name; /* name of the execdomain */ + handler_t handler; /* handler for syscalls */ + unsigned char pers_low; /* lowest personality */ + unsigned char pers_high; /* highest personality */ + unsigned long *signal_map; /* signal mapping */ + unsigned long *signal_invmap; /* reverse signal mapping */ + struct map_segment *err_map; /* error mapping */ + struct map_segment *socktype_map; /* socket type mapping */ + struct map_segment *sockopt_map; /* socket option mapping */ + struct map_segment *af_map; /* address family mapping */ + struct module *module; /* module context of the ed. */ + struct exec_domain *next; /* linked list (internal) */ }; -extern struct exec_domain default_exec_domain; - -extern int register_exec_domain(struct exec_domain *it); -extern int unregister_exec_domain(struct exec_domain *it); -#define put_exec_domain(it) \ - if (it && it->module) __MOD_DEC_USE_COUNT(it->module); -#define get_exec_domain(it) \ - if (it && it->module) __MOD_INC_USE_COUNT(it->module); -extern void __set_personality(unsigned long personality); -#define set_personality(pers) do { \ - if (current->personality != pers) \ - __set_personality(pers); \ +/* + * Return the base personality without flags. + */ +#define personality(pers) (pers & PER_MASK) + +/* + * Personality of the currently running process. + */ +#define get_personality (current->personality) + +/* + * Change personality of the currently running process. + */ +#define set_personality(pers) \ + ((current->personality == pers) ? 0 : __set_personality(pers)) + +/* + * Load an execution domain. + */ +#define get_exec_domain(ep) \ +do { \ + if (ep != NULL && ep->module != NULL) \ + __MOD_INC_USE_COUNT(ep->module); \ +} while (0) + +/* + * Unload an execution domain. + */ +#define put_exec_domain(ep) \ +do { \ + if (ep != NULL && ep->module != NULL) \ + __MOD_DEC_USE_COUNT(ep->module); \ } while (0) -asmlinkage long sys_personality(unsigned long personality); -#endif /* _PERSONALITY_H */ +#endif /* _LINUX_PERSONALITY_H */ |
