11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Handling of different ABIs (personalities). 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * We group personalities into execution domains which have their 51da177e4SLinus Torvalds * own handlers for kernel entry points, signal mapping, etc... 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * 2001-05-06 Complete rewrite, Christoph Hellwig (hch@infradead.org) 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #include <linux/init.h> 111da177e4SLinus Torvalds #include <linux/kernel.h> 121da177e4SLinus Torvalds #include <linux/kmod.h> 131da177e4SLinus Torvalds #include <linux/module.h> 141da177e4SLinus Torvalds #include <linux/personality.h> 156e62775eSAlexey Dobriyan #include <linux/proc_fs.h> 161da177e4SLinus Torvalds #include <linux/sched.h> 176e62775eSAlexey Dobriyan #include <linux/seq_file.h> 181da177e4SLinus Torvalds #include <linux/syscalls.h> 191da177e4SLinus Torvalds #include <linux/sysctl.h> 201da177e4SLinus Torvalds #include <linux/types.h> 215ad4e53bSAl Viro #include <linux/fs_struct.h> 221da177e4SLinus Torvalds 236e62775eSAlexey Dobriyan #ifdef CONFIG_PROC_FS 246e62775eSAlexey Dobriyan static int execdomains_proc_show(struct seq_file *m, void *v) 251da177e4SLinus Torvalds { 26*973f911fSRichard Weinberger seq_puts(m, "0-0\tLinux \t[kernel]\n"); 276e62775eSAlexey Dobriyan return 0; 281da177e4SLinus Torvalds } 291da177e4SLinus Torvalds 306e62775eSAlexey Dobriyan static int execdomains_proc_open(struct inode *inode, struct file *file) 316e62775eSAlexey Dobriyan { 326e62775eSAlexey Dobriyan return single_open(file, execdomains_proc_show, NULL); 336e62775eSAlexey Dobriyan } 346e62775eSAlexey Dobriyan 356e62775eSAlexey Dobriyan static const struct file_operations execdomains_proc_fops = { 366e62775eSAlexey Dobriyan .open = execdomains_proc_open, 376e62775eSAlexey Dobriyan .read = seq_read, 386e62775eSAlexey Dobriyan .llseek = seq_lseek, 396e62775eSAlexey Dobriyan .release = single_release, 406e62775eSAlexey Dobriyan }; 416e62775eSAlexey Dobriyan 426e62775eSAlexey Dobriyan static int __init proc_execdomains_init(void) 436e62775eSAlexey Dobriyan { 446e62775eSAlexey Dobriyan proc_create("execdomains", 0, NULL, &execdomains_proc_fops); 456e62775eSAlexey Dobriyan return 0; 466e62775eSAlexey Dobriyan } 476e62775eSAlexey Dobriyan module_init(proc_execdomains_init); 486e62775eSAlexey Dobriyan #endif 496e62775eSAlexey Dobriyan 50485d5276SOleg Nesterov SYSCALL_DEFINE1(personality, unsigned int, personality) 511da177e4SLinus Torvalds { 52485d5276SOleg Nesterov unsigned int old = current->personality; 531da177e4SLinus Torvalds 542ee7c922SOleg Nesterov if (personality != 0xffffffff) 551da177e4SLinus Torvalds set_personality(personality); 561da177e4SLinus Torvalds 57485d5276SOleg Nesterov return old; 581da177e4SLinus Torvalds } 59