xref: /linux/kernel/exec_domain.c (revision 01b944fe1cd4e21a2a9ed51adbdbafe2d5e905ba)
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