1/*-
2 * Copyright (c) 1999, 2000 John D. Polstra.
3 * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com>
4 * All rights reserved.
5 *
6 * Portions of this software were developed by SRI International and the
7 * University of Cambridge Computer Laboratory under DARPA/AFRL contract
8 * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
9 *
10 * Portions of this software were developed by the University of Cambridge
11 * Computer Laboratory as part of the CTSRD Project, with support from the
12 * UK Higher Education Innovation Fund (HEIF).
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 * 1. Redistributions of source code must retain the above copyright
18 *    notice, this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 *    notice, this list of conditions and the following disclaimer in the
21 *    documentation and/or other materials provided with the distribution.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 * $FreeBSD: stable/11/libexec/rtld-elf/riscv/rtld_machdep.h 319434 2017-06-01 15:12:51Z vangyzen $
36 */
37
38#ifndef RTLD_MACHDEP_H
39#define RTLD_MACHDEP_H	1
40
41#include <sys/types.h>
42#include <machine/atomic.h>
43
44struct Struct_Obj_Entry;
45
46uint64_t set_gp(struct Struct_Obj_Entry *obj);
47
48/* Return the address of the .dynamic section in the dynamic linker. */
49#define rtld_dynamic(obj)                                               \
50({                                                                      \
51	Elf_Addr _dynamic_addr;                                         \
52	__asm __volatile("lla       %0, _DYNAMIC" : "=r"(_dynamic_addr));   \
53	(const Elf_Dyn *)_dynamic_addr;                                 \
54})
55
56Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
57    const struct Struct_Obj_Entry *defobj, const struct Struct_Obj_Entry *obj,
58    const Elf_Rel *rel);
59
60#define make_function_pointer(def, defobj) \
61	((defobj)->relocbase + (def)->st_value)
62
63#define call_initfini_pointer(obj, target)				\
64({									\
65	uint64_t old0;							\
66	old0 = set_gp(obj);						\
67	(((InitFunc)(target))());					\
68	__asm __volatile("mv    gp, %0" :: "r"(old0));			\
69})
70
71#define call_init_pointer(obj, target)					\
72({									\
73	uint64_t old1;							\
74	old1 = set_gp(obj);						\
75	(((InitArrFunc)(target))(main_argc, main_argv, environ));	\
76	__asm __volatile("mv    gp, %0" :: "r"(old1));			\
77})
78
79#define	call_ifunc_resolver(ptr) \
80	(((Elf_Addr (*)(void))ptr)())
81
82/*
83 * TLS
84 */
85#define	TLS_TP_OFFSET	0x0
86#define	TLS_DTV_OFFSET	0x800
87#define	TLS_TCB_SIZE	16
88
89#define round(size, align) \
90    (((size) + (align) - 1) & ~((align) - 1))
91#define calculate_first_tls_offset(size, align) \
92    round(16, align)
93#define calculate_tls_offset(prev_offset, prev_size, size, align) \
94    round(prev_offset + prev_size, align)
95#define calculate_tls_end(off, size)    ((off) + (size))
96
97typedef struct {
98	unsigned long ti_module;
99	unsigned long ti_offset;
100} tls_index;
101
102extern void *__tls_get_addr(tls_index* ti);
103
104#define	RTLD_DEFAULT_STACK_PF_EXEC	PF_X
105#define	RTLD_DEFAULT_STACK_EXEC		PROT_EXEC
106
107#define	md_abi_variant_hook(x)
108
109#endif
110