diff options
Diffstat (limited to 'arch/alpha/kernel/binfmt_loader.c')
| -rw-r--r-- | arch/alpha/kernel/binfmt_loader.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/arch/alpha/kernel/binfmt_loader.c b/arch/alpha/kernel/binfmt_loader.c new file mode 100644 index 000000000000..4a0af906b00a --- /dev/null +++ b/arch/alpha/kernel/binfmt_loader.c | |||
| @@ -0,0 +1,51 @@ | |||
| 1 | #include <linux/init.h> | ||
| 2 | #include <linux/fs.h> | ||
| 3 | #include <linux/file.h> | ||
| 4 | #include <linux/mm_types.h> | ||
| 5 | #include <linux/binfmts.h> | ||
| 6 | #include <linux/a.out.h> | ||
| 7 | |||
| 8 | static int load_binary(struct linux_binprm *bprm, struct pt_regs *regs) | ||
| 9 | { | ||
| 10 | struct exec *eh = (struct exec *)bprm->buf; | ||
| 11 | unsigned long loader; | ||
| 12 | struct file *file; | ||
| 13 | int retval; | ||
| 14 | |||
| 15 | if (eh->fh.f_magic != 0x183 || (eh->fh.f_flags & 0x3000) != 0x3000) | ||
| 16 | return -ENOEXEC; | ||
| 17 | |||
| 18 | if (bprm->loader) | ||
| 19 | return -ENOEXEC; | ||
| 20 | |||
| 21 | allow_write_access(bprm->file); | ||
| 22 | fput(bprm->file); | ||
| 23 | bprm->file = NULL; | ||
| 24 | |||
| 25 | loader = bprm->vma->vm_end - sizeof(void *); | ||
| 26 | |||
| 27 | file = open_exec("/sbin/loader"); | ||
| 28 | retval = PTR_ERR(file); | ||
| 29 | if (IS_ERR(file)) | ||
| 30 | return retval; | ||
| 31 | |||
| 32 | /* Remember if the application is TASO. */ | ||
| 33 | bprm->taso = eh->ah.entry < 0x100000000UL; | ||
| 34 | |||
| 35 | bprm->file = file; | ||
| 36 | bprm->loader = loader; | ||
| 37 | retval = prepare_binprm(bprm); | ||
| 38 | if (retval < 0) | ||
| 39 | return retval; | ||
| 40 | return search_binary_handler(bprm,regs); | ||
| 41 | } | ||
| 42 | |||
| 43 | static struct linux_binfmt loader_format = { | ||
| 44 | .load_binary = load_binary, | ||
| 45 | }; | ||
| 46 | |||
| 47 | static int __init init_loader_binfmt(void) | ||
| 48 | { | ||
| 49 | return register_binfmt(&loader_format); | ||
| 50 | } | ||
| 51 | arch_initcall(init_loader_binfmt); | ||
