xref: /OK3568_Linux_fs/kernel/arch/alpha/kernel/binfmt_loader.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun #include <linux/init.h>
3*4882a593Smuzhiyun #include <linux/fs.h>
4*4882a593Smuzhiyun #include <linux/file.h>
5*4882a593Smuzhiyun #include <linux/mm_types.h>
6*4882a593Smuzhiyun #include <linux/binfmts.h>
7*4882a593Smuzhiyun #include <linux/a.out.h>
8*4882a593Smuzhiyun 
load_binary(struct linux_binprm * bprm)9*4882a593Smuzhiyun static int load_binary(struct linux_binprm *bprm)
10*4882a593Smuzhiyun {
11*4882a593Smuzhiyun 	struct exec *eh = (struct exec *)bprm->buf;
12*4882a593Smuzhiyun 	unsigned long loader;
13*4882a593Smuzhiyun 	struct file *file;
14*4882a593Smuzhiyun 	int retval;
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun 	if (eh->fh.f_magic != 0x183 || (eh->fh.f_flags & 0x3000) != 0x3000)
17*4882a593Smuzhiyun 		return -ENOEXEC;
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun 	if (bprm->loader)
20*4882a593Smuzhiyun 		return -ENOEXEC;
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	loader = bprm->vma->vm_end - sizeof(void *);
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun 	file = open_exec("/sbin/loader");
25*4882a593Smuzhiyun 	retval = PTR_ERR(file);
26*4882a593Smuzhiyun 	if (IS_ERR(file))
27*4882a593Smuzhiyun 		return retval;
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	/* Remember if the application is TASO.  */
30*4882a593Smuzhiyun 	bprm->taso = eh->ah.entry < 0x100000000UL;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	bprm->interpreter = file;
33*4882a593Smuzhiyun 	bprm->loader = loader;
34*4882a593Smuzhiyun 	return 0;
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun static struct linux_binfmt loader_format = {
38*4882a593Smuzhiyun 	.load_binary	= load_binary,
39*4882a593Smuzhiyun };
40*4882a593Smuzhiyun 
init_loader_binfmt(void)41*4882a593Smuzhiyun static int __init init_loader_binfmt(void)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun 	insert_binfmt(&loader_format);
44*4882a593Smuzhiyun 	return 0;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun arch_initcall(init_loader_binfmt);
47