Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/stand/powerpc/ofw/elf_freebsd.c
34876 views
1
/*-
2
* Copyright (c) 2001 Benno Rice <[email protected]>
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*/
26
27
#include <sys/param.h>
28
#include <sys/linker.h>
29
30
#include <machine/metadata.h>
31
#include <machine/elf.h>
32
#if defined(__powerpc__)
33
#include <machine/md_var.h>
34
#endif
35
36
#include <stand.h>
37
38
#include "bootstrap.h"
39
#include "libofw.h"
40
#include "openfirm.h"
41
#include "modinfo.h"
42
43
extern char end[];
44
extern vm_offset_t reloc; /* From <arch>/conf.c */
45
46
int
47
__elfN(ofw_loadfile)(char *filename, uint64_t dest,
48
struct preloaded_file **result)
49
{
50
int r;
51
52
r = __elfN(loadfile)(filename, dest, result);
53
if (r != 0)
54
return (r);
55
56
#if defined(__powerpc__)
57
/*
58
* No need to sync the icache for modules: this will
59
* be done by the kernel after relocation.
60
*/
61
if (!strcmp((*result)->f_type, md_kerntype))
62
__syncicache((void *) (*result)->f_addr, (*result)->f_size);
63
#endif
64
return (0);
65
}
66
67
int
68
__elfN(ofw_exec)(struct preloaded_file *fp)
69
{
70
struct file_metadata *fmp;
71
vm_offset_t mdp, dtbp;
72
Elf_Ehdr *e;
73
int error;
74
intptr_t entry;
75
76
if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) {
77
return(EFTYPE);
78
}
79
e = (Elf_Ehdr *)&fmp->md_data;
80
entry = e->e_entry;
81
82
if ((error = md_load(fp->f_args, &mdp, &dtbp)) != 0)
83
return (error);
84
85
printf("Kernel entry at 0x%x ...\n", entry);
86
87
dev_cleanup();
88
if (dtbp != 0) {
89
OF_quiesce();
90
((int (*)(u_long, u_long, u_long, void *, u_long))entry)(dtbp,
91
0, 0, (void *)mdp, 0xfb5d104d);
92
} else {
93
OF_chain((void *)reloc, end - (char *)reloc, (void *)entry,
94
(void *)mdp, 0xfb5d104d);
95
}
96
97
panic("exec returned");
98
}
99
100
struct file_format ofw_elf =
101
{
102
__elfN(ofw_loadfile),
103
__elfN(ofw_exec)
104
};
105
106