xref: /netbsd-src/sys/arch/ia64/stand/common/load_elf64.c (revision b1c86f5f087524e68db12794ee9c3e3da1ab17a0)
1 /*	$NetBSD: load_elf64.c,v 1.2 2006/04/22 07:58:53 cherry 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
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     marks = fp->marks;
66 
67     if (fp == NULL) {
68 	    printf("elf64_loadfile: cannot allocate module info\n");
69 	    err = EPERM;
70 	    goto out;
71     }
72 
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 	    goto oerr;
80     close(fd);
81 
82     dest = marks[MARK_ENTRY];
83 
84     printf("%s entry at 0x%lx\n", filename, (uintmax_t)dest);
85 
86     fp->f_size = marks[MARK_END] - marks[MARK_START];
87     fp->f_addr = marks[MARK_START];
88 
89     if (fp->f_size == 0 || fp->f_addr == 0)
90 	goto ioerr;
91 
92     /* Load OK, return module pointer */
93     *result = fp;
94     err = 0;
95     goto out;
96 
97  ioerr:
98     err = EIO;
99  oerr:
100     file_discard(fp);
101  out:
102     return(err);
103 }
104 
105 #endif /*BOOT_ELF64*/
106