xref: /netbsd-src/sys/arch/ia64/stand/common/load_elf64.c (revision 4e9f8b500d54d4b7b896d80bcb17f1948eb4d965)
1 /*	$NetBSD: load_elf64.c,v 1.4 2017/10/15 01:28:32 maya Exp $	*/
2 
3 /*-
4  * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
5  * Copyright (c) 1998 Peter Wemm <peter@freebsd.org>
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29 
30 #include <sys/cdefs.h>
31 /* __FBSDID("$FreeBSD: src/sys/boot/common/load_elf.c,v 1.30.2.1 2004/09/03 19:25:40 iedowse Exp $"); */
32 
33 #include <sys/param.h>
34 #include <sys/exec.h>
35 
36 #include <lib/libsa/stand.h>
37 #include <lib/libsa/loadfile.h>
38 
39 #include "bootstrap.h"
40 
41 #ifdef BOOT_ELF64
42 
43 /*
44  * Attempt to load the file (file) as an ELF module.  It will be stored at
45  * (dest), and a pointer to a module structure describing the loaded object
46  * will be saved in (result).
47  */
48 int
elf64_loadfile(char * filename,u_int64_t dest,struct preloaded_file ** result)49 elf64_loadfile(char *filename, u_int64_t dest, struct preloaded_file **result)
50 {
51     struct preloaded_file	*fp;
52     u_long                      *marks;
53     int				err;
54     u_int			pad;
55     ssize_t			bytes_read;
56     int                         fd;
57 
58     /*
59      * Open the image, read and validate the ELF header
60      */
61     if (filename == NULL)	/* can't handle nameless */
62 	return(EFTYPE);
63 
64     fp = file_alloc();
65 
66     if (fp == NULL) {
67 	    printf("elf64_loadfile: cannot allocate module info\n");
68 	    err = EPERM;
69 	    goto out;
70     }
71 
72     marks = fp->marks;
73     fp->f_name = strdup(filename);
74     fp->f_type = strdup(ELF64_KERNELTYPE);
75 
76     marks[MARK_START] = dest;
77 
78     if ((fd = loadfile(filename, marks, LOAD_KERNEL)) == -1) {
79 	    err = EPERM;
80 	    goto oerr;
81     }
82     close(fd);
83 
84     dest = marks[MARK_ENTRY];
85 
86     printf("%s entry at 0x%lx\n", filename, (uintmax_t)dest);
87 
88     fp->f_size = marks[MARK_END] - marks[MARK_START];
89     fp->f_addr = marks[MARK_START];
90 
91     if (fp->f_size == 0 || fp->f_addr == 0)
92 	goto ioerr;
93 
94     /* Load OK, return module pointer */
95     *result = fp;
96     err = 0;
97     goto out;
98 
99  ioerr:
100     err = EIO;
101  oerr:
102     file_discard(fp);
103  out:
104     return(err);
105 }
106 
107 #endif /*BOOT_ELF64*/
108