root/include/linux/personality.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


#ifndef _LINUX_PERSONALITY_H
#define _LINUX_PERSONALITY_H

#include <uapi/linux/personality.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 int);


/*
 * 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;          /* 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) */
};

/*
 * Return the base personality without flags.
 */
#define personality(pers)       (pers & PER_MASK)


/*
 * Change personality of the currently running process.
 */
#define set_personality(pers) \
        ((current->personality == (pers)) ? 0 : __set_personality(pers))

#endif /* _LINUX_PERSONALITY_H */

/* [<][>][^][v][top][bottom][index][help] */