@@ -26,6 +26,8 @@ pub const EM_SELF: u16 = {
26
26
const VALUE : u16 = EM_386 ;
27
27
#[ cfg( target_arch = "aarch64" ) ]
28
28
const VALUE : u16 = EM_AARCH64 ;
29
+ #[ cfg( target_arch = "riscv64" ) ]
30
+ const VALUE : u16 = EM_RISCV ;
29
31
VALUE
30
32
} ;
31
33
@@ -37,6 +39,8 @@ pub const R_RELATIVE: u32 = {
37
39
const VALUE : u32 = R_386_RELATIVE ;
38
40
#[ cfg( target_arch = "aarch64" ) ]
39
41
const VALUE : u32 = R_AARCH64_RELATIVE ;
42
+ #[ cfg( target_arch = "riscv64" ) ]
43
+ const VALUE : u32 = R_RISCV_RELATIVE ;
40
44
VALUE
41
45
} ;
42
46
@@ -49,6 +53,8 @@ pub const NIX_SYSTEM: &str = match option_env!("NIX_SYSTEM") {
49
53
const VALUE : & str = "i686_linux" ;
50
54
#[ cfg( target_arch = "aarch64" ) ]
51
55
const VALUE : & str = "aarch64_linux" ;
56
+ #[ cfg( target_arch = "riscv64" ) ]
57
+ const VALUE : & str = "riscv64_linux" ;
52
58
VALUE
53
59
}
54
60
} ;
@@ -70,6 +76,8 @@ macro_rules! main_relocate_stack {
70
76
core:: arch:: asm!( "mov esp, {}; call {}" , in( reg) $sp, sym $func, options( noreturn) ) ;
71
77
#[ cfg( target_arch = "aarch64" ) ]
72
78
core:: arch:: asm!( "mov sp, {}; bl {}" , in( reg) $sp, sym $func, options( noreturn) ) ;
79
+ #[ cfg( target_arch = "riscv64" ) ]
80
+ core:: arch:: asm!( "mv sp, {}; call {}" , in( reg) $sp, sym $func, options( noreturn) ) ;
73
81
} ;
74
82
}
75
83
pub ( crate ) use main_relocate_stack;
@@ -82,6 +90,8 @@ macro_rules! elf_jmp {
82
90
core:: arch:: asm!( "mov esp, {}; jmp {}" , in( reg) $sp, in( reg) $target, options( noreturn) ) ;
83
91
#[ cfg( target_arch = "aarch64" ) ]
84
92
core:: arch:: asm!( "mov sp, {}; br {}" , in( reg) $sp, in( reg) $target, options( noreturn) ) ;
93
+ #[ cfg( target_arch = "riscv64" ) ]
94
+ core:: arch:: asm!( "mv sp, {}; jr {}" , in( reg) $sp, in( reg) $target, options( noreturn) ) ;
85
95
} ;
86
96
}
87
97
pub ( crate ) use elf_jmp;
@@ -131,6 +141,9 @@ pub const ENTRY_TRAMPOLINE: Option<unsafe extern "C" fn() -> !> = None;
131
141
#[ cfg( target_arch = "x86_64" ) ]
132
142
pub const ENTRY_TRAMPOLINE : Option < unsafe extern "C" fn ( ) -> !> = Some ( entry_trampoline) ;
133
143
144
+ #[ cfg( target_arch = "riscv64" ) ]
145
+ pub const ENTRY_TRAMPOLINE : Option < unsafe extern "C" fn ( ) -> !> = Some ( entry_trampoline) ;
146
+
134
147
#[ cfg( target_arch = "x86_64" ) ]
135
148
#[ naked]
136
149
unsafe extern "C" fn entry_trampoline ( ) -> ! {
@@ -173,13 +186,36 @@ unsafe extern "C" fn entry_trampoline() -> ! {
173
186
}
174
187
}
175
188
189
+ #[ cfg( target_arch = "riscv64" ) ]
190
+ #[ naked]
191
+ unsafe extern "C" fn entry_trampoline ( ) -> ! {
192
+ unsafe {
193
+ core:: arch:: naked_asm!(
194
+ "1:" ,
195
+ "auipc t0, %pcrel_hi({context})" ,
196
+ "addi t0, t0, %pcrel_lo(1b)" ,
197
+ "ld t1, {env_entry_off}(t0)" , // .env_entry
198
+ "beqz t1, 2f" ,
199
+ "ld t2, {env_string_off}(t0)" , // .env_string
200
+ "sd t2, 0(t1)" ,
201
+ "2:" ,
202
+ "ld t0, 0(t0)" ,
203
+ "jr t0" ,
204
+ context = sym TRAMPOLINE_CONTEXT ,
205
+ env_entry_off = const TrampolineContext :: ENV_ENTRY_OFFSET ,
206
+ env_string_off = const TrampolineContext :: ENV_STRING_OFFSET ,
207
+ )
208
+ }
209
+ }
210
+
176
211
// !!!!
177
212
// After adding a trampoline, remember to enable test_ld_path_restore for
178
213
// the target_arch in tests/tests.rs as well
179
214
// !!!!
180
215
#[ cfg( all(
181
216
feature = "entry_trampoline" ,
182
217
not( target_arch = "x86_64" ) ,
183
- not( target_arch = "aarch64" )
218
+ not( target_arch = "aarch64" ) ,
219
+ not( target_arch = "riscv64" )
184
220
) ) ]
185
221
pub const ENTRY_TRAMPOLINE : Option < unsafe extern "C" fn ( ) -> !> = None ;
0 commit comments