1/* $NetBSD: elf_machdep.h,v 1.10 2024/08/04 08:16:25 skrll Exp $ */
2
3/*-
4 * Copyright (c) 2014 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Matt Thomas of 3am Software Foundry.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifndef _RISCV_ELF_MACHDEP_H_
33#define _RISCV_ELF_MACHDEP_H_
34
35#define ELF32_MACHDEP_ID EM_RISCV
36#define ELF64_MACHDEP_ID EM_RISCV
37
38#define ELF32_MACHDEP_ENDIANNESS ELFDATA2LSB
39#define ELF64_MACHDEP_ENDIANNESS ELFDATA2LSB
40
41#define ELF32_MACHDEP_ID_CASES \
42 case EM_RISCV: \
43 break;
44
45#define ELF64_MACHDEP_ID_CASES \
46 case EM_RISCV: \
47 break;
48
49#ifdef _LP64
50#define KERN_ELFSIZE 64
51#define ARCH_ELFSIZE 64 /* MD native binary size */
52#else
53#define KERN_ELFSIZE 32
54#define ARCH_ELFSIZE 32 /* MD native binary size */
55#endif
56
57/* Processor specific flags for the ELF header e_flags field. */
58
59/* Processor specific relocation types */
60
61#define R_RISCV_NONE 0
62#define R_RISCV_32 1 // A
63#define R_RISCV_64 2
64#define R_RISCV_RELATIVE 3
65#define R_RISCV_COPY 4
66#define R_RISCV_JMP_SLOT 5
67#define R_RISCV_TLS_DTPMOD32 6
68#define R_RISCV_TLS_DTPMOD64 7
69#define R_RISCV_TLS_DTPREL32 8
70#define R_RISCV_TLS_DTPREL64 9
71#define R_RISCV_TLS_TPREL32 10
72#define R_RISCV_TLS_TPREL64 11
73
74/* The rest are not used by the dynamic linker */
75#define R_RISCV_BRANCH 16 // (A - P) & 0xffff
76#define R_RISCV_JAL 17 // A & 0xff
77#define R_RISCV_CALL 18 // (A - P) & 0xff
78#define R_RISCV_CALL_PLT 19
79#define R_RISCV_GOT_HI20 20
80#define R_RISCV_TLS_GOT_HI20 21
81#define R_RISCV_TLS_GD_HI20 22
82#define R_RISCV_PCREL_HI20 23
83#define R_RISCV_PCREL_LO12_I 24
84#define R_RISCV_PCREL_LO12_S 25
85#define R_RISCV_HI20 26 // A & 0xffff
86#define R_RISCV_LO12_I 27 // (A >> 16) & 0xffff
87#define R_RISCV_LO12_S 28 // (S + A - P) >> 2
88#define R_RISCV_TPREL_HI20 29
89#define R_RISCV_TPREL_LO12_I 30
90#define R_RISCV_TPREL_LO12_S 31
91#define R_RISCV_TPREL_ADD 32
92#define R_RISCV_ADD8 33
93#define R_RISCV_ADD16 34
94#define R_RISCV_ADD32 35
95#define R_RISCV_ADD64 36
96#define R_RISCV_SUB8 37
97#define R_RISCV_SUB16 38
98#define R_RISCV_SUB32 39
99#define R_RISCV_SUB64 40
100#define R_RISCV_GNU_VTINHERIT 41 // A & 0xffff
101#define R_RISCV_GNU_VTENTRY 42
102#define R_RISCV_ALIGN 43
103#define R_RISCV_RVC_BRANCH 44
104#define R_RISCV_RVC_JUMP 45
105#define R_RISCV_RVC_LUI 46
106#define R_RISCV_GPREL_I 47
107#define R_RISCV_GPREL_S 48
108#define R_RISCV_TPREL_I 49
109#define R_RISCV_TPREL_S 50
110#define R_RISCV_RELAX 51
111#define R_RISCV_SUB6 52
112#define R_RISCV_SET6 53
113#define R_RISCV_SET8 54
114#define R_RISCV_SET16 55
115#define R_RISCV_SET32 56
116#define R_RISCV_32_PCREL 57
117
118/* These are aliases we can use R_TYPESZ */
119#define R_RISCV_ADDR32 R_RISCV_32
120#define R_RISCV_ADDR64 R_RISCV_64
121
122#define R_TYPE(name) R_RISCV_ ## name
123#if ELFSIZE == 32
124#define R_TYPESZ(name) R_RISCV_ ## name ## 32
125#else
126#define R_TYPESZ(name) R_RISCV_ ## name ## 64
127#endif
128
129#ifdef _KERNEL
130#ifdef ELFSIZE
131#define ELF_MD_PROBE_FUNC ELFNAME2(cpu_netbsd,probe)
132#endif
133
134struct exec_package;
135
136int cpu_netbsd_elf32_probe(struct lwp *, struct exec_package *, void *, char *,
137 vaddr_t *);
138
139int cpu_netbsd_elf64_probe(struct lwp *, struct exec_package *, void *, char *,
140 vaddr_t *);
141
142#endif /* _KERNEL */
143
144#endif /* _RISCV_ELF_MACHDEP_H_ */