Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/stand/powerpc/ofw/ppc64_elf_freebsd.c
34860 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
#define __ELF_WORD_SIZE 64
28
29
#include <sys/param.h>
30
#include <sys/linker.h>
31
32
#include <machine/metadata.h>
33
#include <machine/elf.h>
34
#include <machine/md_var.h>
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
ppc64_ofw_elf_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
/*
57
* No need to sync the icache for modules: this will
58
* be done by the kernel after relocation.
59
*/
60
if (!strcmp((*result)->f_type, md_kerntype))
61
__syncicache((void *) (*result)->f_addr, (*result)->f_size);
62
return (0);
63
}
64
65
int
66
ppc64_ofw_elf_exec(struct preloaded_file *fp)
67
{
68
struct file_metadata *fmp;
69
vm_offset_t mdp, dtbp;
70
Elf_Ehdr *e;
71
int error;
72
intptr_t entry;
73
74
if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) {
75
return(EFTYPE);
76
}
77
e = (Elf_Ehdr *)&fmp->md_data;
78
79
/* Handle function descriptor for ELFv1 kernels */
80
if ((e->e_flags & 3) == 2)
81
entry = e->e_entry;
82
else
83
entry = *(uint64_t *)(intptr_t)e->e_entry;
84
85
if ((error = md_load64(fp->f_args, &mdp, &dtbp)) != 0)
86
return (error);
87
88
printf("Kernel entry at 0x%x ...\n", entry);
89
90
dev_cleanup();
91
92
if (dtbp != 0) {
93
OF_quiesce();
94
((int (*)(u_long, u_long, u_long, void *, u_long))entry)(dtbp,
95
0, 0, (void *)mdp, 0xfb5d104d);
96
} else {
97
OF_chain((void *)reloc, end - (char *)reloc, (void *)entry,
98
(void *)mdp, 0xfb5d104d);
99
}
100
101
panic("exec returned");
102
}
103
104
struct file_format ofw_elf64 =
105
{
106
ppc64_ofw_elf_loadfile,
107
ppc64_ofw_elf_exec
108
};
109
110