diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:02:58 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:02:58 +0000 |
commit | 698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch) | |
tree | 173a775858bd501c378080a10dca74132f05bc50 /vendor/psm/src/arch/sparc64.s | |
parent | Initial commit. (diff) | |
download | rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip |
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/psm/src/arch/sparc64.s')
-rw-r--r-- | vendor/psm/src/arch/sparc64.s | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/vendor/psm/src/arch/sparc64.s b/vendor/psm/src/arch/sparc64.s new file mode 100644 index 000000000..a0db27dde --- /dev/null +++ b/vendor/psm/src/arch/sparc64.s @@ -0,0 +1,67 @@ +#include "psm.h" + +.text +.globl rust_psm_stack_direction +.p2align 2 +.type rust_psm_stack_direction,@function +rust_psm_stack_direction: +/* extern "C" fn() -> u8 */ +.cfi_startproc + jmpl %o7 + 8, %g0 + mov STACK_DIRECTION_DESCENDING, %o0 +.rust_psm_stack_direction_end: +.size rust_psm_stack_direction,.rust_psm_stack_direction_end-rust_psm_stack_direction +.cfi_endproc + + +.globl rust_psm_stack_pointer +.p2align 2 +.type rust_psm_stack_pointer,@function +rust_psm_stack_pointer: +/* extern "C" fn() -> *mut u8 */ +.cfi_startproc + jmpl %o7 + 8, %g0 + mov %o6, %o0 +.rust_psm_stack_pointer_end: +.size rust_psm_stack_pointer,.rust_psm_stack_pointer_end-rust_psm_stack_pointer +.cfi_endproc + + +.globl rust_psm_replace_stack +.p2align 2 +.type rust_psm_replace_stack,@function +rust_psm_replace_stack: +/* extern "C" fn(%i0: usize, %i1: extern "C" fn(usize), %i2: *mut u8) */ +.cfi_startproc + .cfi_def_cfa 0, 0 + .cfi_return_column 0 + jmpl %o1, %g0 + /* WEIRD: Why is the LSB set for the %sp and %fp on SPARC?? */ + add %o2, -0x7ff, %o6 +.rust_psm_replace_stack_end: +.size rust_psm_replace_stack,.rust_psm_replace_stack_end-rust_psm_replace_stack +.cfi_endproc + + +.globl rust_psm_on_stack +.p2align 2 +.type rust_psm_on_stack,@function +rust_psm_on_stack: +/* extern "C" fn(%i0: usize, %i1: usize, %i2: extern "C" fn(usize, usize), %i3: *mut u8) */ +.cfi_startproc + /* The fact that locals and saved register windows are offset by 2kB is + very nasty property of SPARC architecture and ABI. In this case it forces us to slice off + 2kB of the stack space outright for no good reason other than adapting to a botched design. + */ + save %o3, -0x87f, %o6 + .cfi_def_cfa_register %fp + .cfi_window_save + .cfi_register %r15, %r31 + mov %i1, %o1 + jmpl %i2, %o7 + mov %i0, %o0 + ret + restore +.rust_psm_on_stack_end: +.size rust_psm_on_stack,.rust_psm_on_stack_end-rust_psm_on_stack +.cfi_endproc |