@@ -26,6 +26,8 @@ pub const EM_SELF: u16 = {
2626 const VALUE : u16 = EM_386 ;
2727 #[ cfg( target_arch = "aarch64" ) ]
2828 const VALUE : u16 = EM_AARCH64 ;
29+ #[ cfg( target_arch = "riscv64" ) ]
30+ const VALUE : u16 = EM_RISCV ;
2931 VALUE
3032} ;
3133
@@ -37,6 +39,8 @@ pub const R_RELATIVE: u32 = {
3739 const VALUE : u32 = R_386_RELATIVE ;
3840 #[ cfg( target_arch = "aarch64" ) ]
3941 const VALUE : u32 = R_AARCH64_RELATIVE ;
42+ #[ cfg( target_arch = "riscv64" ) ]
43+ const VALUE : u32 = R_RISCV_RELATIVE ;
4044 VALUE
4145} ;
4246
@@ -49,6 +53,8 @@ pub const NIX_SYSTEM: &str = match option_env!("NIX_SYSTEM") {
4953 const VALUE : & str = "i686_linux" ;
5054 #[ cfg( target_arch = "aarch64" ) ]
5155 const VALUE : & str = "aarch64_linux" ;
56+ #[ cfg( target_arch = "riscv64" ) ]
57+ const VALUE : & str = "riscv64_linux" ;
5258 VALUE
5359 }
5460} ;
@@ -70,6 +76,8 @@ macro_rules! main_relocate_stack {
7076 core:: arch:: asm!( "mov esp, {}; call {}" , in( reg) $sp, sym $func, options( noreturn) ) ;
7177 #[ cfg( target_arch = "aarch64" ) ]
7278 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) ) ;
7381 } ;
7482}
7583pub ( crate ) use main_relocate_stack;
@@ -82,6 +90,8 @@ macro_rules! elf_jmp {
8290 core:: arch:: asm!( "mov esp, {}; jmp {}" , in( reg) $sp, in( reg) $target, options( noreturn) ) ;
8391 #[ cfg( target_arch = "aarch64" ) ]
8492 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) ) ;
8595 } ;
8696}
8797pub ( crate ) use elf_jmp;
@@ -131,6 +141,9 @@ pub const ENTRY_TRAMPOLINE: Option<unsafe extern "C" fn() -> !> = None;
131141#[ cfg( target_arch = "x86_64" ) ]
132142pub const ENTRY_TRAMPOLINE : Option < unsafe extern "C" fn ( ) -> !> = Some ( entry_trampoline) ;
133143
144+ #[ cfg( target_arch = "riscv64" ) ]
145+ pub const ENTRY_TRAMPOLINE : Option < unsafe extern "C" fn ( ) -> !> = Some ( entry_trampoline) ;
146+
134147#[ cfg( target_arch = "x86_64" ) ]
135148#[ naked]
136149unsafe extern "C" fn entry_trampoline ( ) -> ! {
@@ -173,13 +186,36 @@ unsafe extern "C" fn entry_trampoline() -> ! {
173186 }
174187}
175188
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+
176211// !!!!
177212// After adding a trampoline, remember to enable test_ld_path_restore for
178213// the target_arch in tests/tests.rs as well
179214// !!!!
180215#[ cfg( all(
181216 feature = "entry_trampoline" ,
182217 not( target_arch = "x86_64" ) ,
183- not( target_arch = "aarch64" )
218+ not( target_arch = "aarch64" ) ,
219+ not( target_arch = "riscv64" )
184220) ) ]
185221pub const ENTRY_TRAMPOLINE : Option < unsafe extern "C" fn ( ) -> !> = None ;
0 commit comments