Skip to content

Commit

Permalink
support new arch (#42)
Browse files Browse the repository at this point in the history
  • Loading branch information
loongs-zhang authored Sep 4, 2023
1 parent efbaf19 commit da861cb
Show file tree
Hide file tree
Showing 66 changed files with 4,059 additions and 1,203 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
target
Cargo.lock
.idea
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,13 @@ Architecture | Linux (UNIX) | Windows | MacOS X | iOS
i386 | SYSV (ELF) | MS (PE) | SYSV (MACH-O) | -
x86_64 | SYSV, X32 (ELF) | MS (PE) | SYSV (MACH-O) | -
arm (aarch32) | AAPCS (ELF) | AAPCS (PE) | - | AAPCS (MACH-O)
arm (aarch64) | AAPCS (ELF) | - | - | AAPCS (MACH-O)
arm (aarch64) | AAPCS (ELF) | AAPCS (PE) | - | AAPCS (MACH-O)
mips1 | O32 (ELF) | - | - | -
mips64 | N64 (ELF) | - | - | -
ppc32 | SYSV (ELF), XCOFF | - | SYSV (MACH-O) | -
ppc64 | SYSV (ELF), XCOFF | - | SYSV (MACH-O) | -
loongarch64 | SYSV (ELF) | - | - | -
riscv64 | SYSV (ELF) | - | - | -

Format: `ABI (binary format)`.
Source: [Boost.Context](http://www.boost.org/doc/libs/1_60_0/libs/context/doc/html/context/architectures.html)
4 changes: 4 additions & 0 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ fn main() {
"powerpc" => "ppc32",
"powerpc64" => "ppc64",
"x86_64" => "x86_64",
"mips64" => "mips64",
"loongarch64" => "loongarch64",
"riscv64" => "riscv64",
_ => {
panic!("Unsupported architecture: {}", target);
}
Expand All @@ -32,6 +35,7 @@ fn main() {
let abi = match arch {
"arm" | "arm64" => "aapcs",
"mips32" => "o32",
"mips64" => "n64",
_ => {
if is_win {
"ms"
Expand Down
1 change: 1 addition & 0 deletions src/asm/jump_arm64_aapcs_elf_gas.S
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
* *
*******************************************************/

.file "jump_arm64_aapcs_elf_gas.S"
.text
.align 2
.global jump_fcontext
Expand Down
133 changes: 133 additions & 0 deletions src/asm/jump_arm64_aapcs_pe_armasm.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
; Copyright Edward Nevill + Oliver Kowalke 2015
; Distributed under the Boost Software License, Version 1.0.
; (See accompanying file LICENSE_1_0.txt or copy at
; http://www.boost.org/LICENSE_1_0.txt)

;*******************************************************
;* *
;* ------------------------------------------------- *
;* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
;* ------------------------------------------------- *
;* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
;* ------------------------------------------------- *
;* | d8 | d9 | d10 | d11 | *
;* ------------------------------------------------- *
;* ------------------------------------------------- *
;* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
;* ------------------------------------------------- *
;* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
;* ------------------------------------------------- *
;* | d12 | d13 | d14 | d15 | *
;* ------------------------------------------------- *
;* ------------------------------------------------- *
;* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
;* ------------------------------------------------- *
;* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
;* ------------------------------------------------- *
;* | x19 | x20 | x21 | x22 | *
;* ------------------------------------------------- *
;* ------------------------------------------------- *
;* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
;* ------------------------------------------------- *
;* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
;* ------------------------------------------------- *
;* | x23 | x24 | x25 | x26 | *
;* ------------------------------------------------- *
;* ------------------------------------------------- *
;* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
;* ------------------------------------------------- *
;* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
;* ------------------------------------------------- *
;* | x27 | x28 | FP | LR | *
;* ------------------------------------------------- *
;* ------------------------------------------------- *
;* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
;* ------------------------------------------------- *
;* | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| *
;* ------------------------------------------------- *
;* | fiber data| base | limit | dealloc | *
;* ------------------------------------------------- *
;* ------------------------------------------------- *
;* | 48 | 49 | 50 | 51 | | | *
;* ------------------------------------------------- *
;* | 0xc0| 0xc4| 0xc8| 0xcc| | | *
;* ------------------------------------------------- *
;* | PC | align | | | *
;* ------------------------------------------------- *
;* *
;*******************************************************

AREA |.text|, CODE, READONLY, ALIGN=4, CODEALIGN
EXPORT jump_fcontext

jump_fcontext proc
; prepare stack for GP + FPU
sub sp, sp, #0xd0

; save d8 - d15
stp d8, d9, [sp, #0x00]
stp d10, d11, [sp, #0x10]
stp d12, d13, [sp, #0x20]
stp d14, d15, [sp, #0x30]

; save x19-x30
stp x19, x20, [sp, #0x40]
stp x21, x22, [sp, #0x50]
stp x23, x24, [sp, #0x60]
stp x25, x26, [sp, #0x70]
stp x27, x28, [sp, #0x80]
stp x29, x30, [sp, #0x90]

; save LR as PC
str x30, [sp, #0xc0]

; save current stack base and limit
ldp x5, x6, [x18, #0x08] ; TeStackBase and TeStackLimit at ksarm64.h
stp x5, x6, [sp, #0xa0]
; save current fiber data and deallocation stack
ldr x5, [x18, #0x1478] ; TeDeallocationStack at ksarm64.h
ldr x6, [x18, #0x20] ; TeFiberData at ksarm64.h
stp x5, x6, [sp, #0xb0]

; store RSP (pointing to context-data) in X0
mov x4, sp

; restore RSP (pointing to context-data) from X1
mov sp, x0

; restore stack base and limit
ldp x5, x6, [sp, #0xa0]
stp x5, x6, [x18, #0x08] ; TeStackBase and TeStackLimit at ksarm64.h
; restore fiber data and deallocation stack
ldp x5, x6, [sp, #0xb0]
str x5, [x18, #0x1478] ; TeDeallocationStack at ksarm64.h
str x6, [x18, #0x20] ; TeFiberData at ksarm64.h

; load d8 - d15
ldp d8, d9, [sp, #0x00]
ldp d10, d11, [sp, #0x10]
ldp d12, d13, [sp, #0x20]
ldp d14, d15, [sp, #0x30]

; load x19-x30
ldp x19, x20, [sp, #0x40]
ldp x21, x22, [sp, #0x50]
ldp x23, x24, [sp, #0x60]
ldp x25, x26, [sp, #0x70]
ldp x27, x28, [sp, #0x80]
ldp x29, x30, [sp, #0x90]

; return transfer_t from jump
; pass transfer_t as first arg in context function
; X0 == FCTX, X1 == DATA
mov x0, x4

; load pc
ldr x4, [sp, #0xc0]

; restore stack from GP + FPU
add sp, sp, #0xd0

ret x4
ENDP
END
2 changes: 2 additions & 0 deletions src/asm/jump_arm_aapcs_elf_gas.S
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@
* *
*******************************************************/

.file "jump_arm_aapcs_elf_gas.S"
.text
.globl jump_fcontext
.align 2
.type jump_fcontext,%function
.syntax unified
jump_fcontext:
@ save LR as PC
push {lr}
Expand Down
4 changes: 2 additions & 2 deletions src/asm/jump_arm_aapcs_macho_gas.S
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ _jump_fcontext:
bic v2, v2, #3

@ load TLS[__PTK_LIBC_DYLD_Unwind_SjLj_Key]
ldr v1, [v2, #8]
ldr v1, [v2, #72]
@ save SjLj handler
push {v1}

Expand All @@ -79,7 +79,7 @@ _jump_fcontext:
@ r#estore SjLj handler
pop {v1}
@ store SjLj handler in TLS
str v1, [v2, #8]
str v1, [v2, #72]

@ restore hidden,V1-V8,LR
pop {a4,v1-v8,lr}
Expand Down
20 changes: 0 additions & 20 deletions src/asm/jump_combined_sysv_macho_gas.S

This file was deleted.

123 changes: 123 additions & 0 deletions src/asm/jump_i386_ms_pe_clang_gas.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
/*
Copyright Oliver Kowalke 2009.
Copyright Thomas Sailer 2013.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
*/

/*************************************************************************************
* --------------------------------------------------------------------------------- *
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
* --------------------------------------------------------------------------------- *
* | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch | *
* --------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI | *
* --------------------------------------------------------------------------------- *
* --------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* --------------------------------------------------------------------------------- *
* | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch | *
* --------------------------------------------------------------------------------- *
* | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR| *
* --------------------------------------------------------------------------------- *
**************************************************************************************/

.file "jump_i386_ms_pe_clang_gas.S"
.text
.p2align 4,,15

/* mark as using no unregistered SEH handlers */
.globl @feat.00
.def @feat.00; .scl 3; .type 0; .endef
.set @feat.00, 1

.globl _jump_fcontext
.def _jump_fcontext; .scl 2; .type 32; .endef
_jump_fcontext:
/* prepare stack */
leal -0x2c(%esp), %esp

#if !defined(BOOST_USE_TSX)
/* save MMX control- and status-word */
stmxcsr (%esp)
/* save x87 control-word */
fnstcw 0x4(%esp)
#endif

/* load NT_TIB */
movl %fs:(0x18), %edx
/* load fiber local storage */
movl 0x10(%edx), %eax
movl %eax, 0x8(%esp)
/* load current dealloction stack */
movl 0xe0c(%edx), %eax
movl %eax, 0xc(%esp)
/* load current stack limit */
movl 0x8(%edx), %eax
movl %eax, 0x10(%esp)
/* load current stack base */
movl 0x4(%edx), %eax
movl %eax, 0x14(%esp)
/* load current SEH exception list */
movl (%edx), %eax
movl %eax, 0x18(%esp)

movl %edi, 0x1c(%esp) /* save EDI */
movl %esi, 0x20(%esp) /* save ESI */
movl %ebx, 0x24(%esp) /* save EBX */
movl %ebp, 0x28(%esp) /* save EBP */

/* store ESP (pointing to context-data) in EAX */
movl %esp, %eax

/* firstarg of jump_fcontext() == fcontext to jump to */
movl 0x30(%esp), %ecx

/* restore ESP (pointing to context-data) from ECX */
movl %ecx, %esp

#if !defined(BOOST_USE_TSX)
/* restore MMX control- and status-word */
ldmxcsr (%esp)
/* restore x87 control-word */
fldcw 0x4(%esp)
#endif

/* restore NT_TIB into EDX */
movl %fs:(0x18), %edx
/* restore fiber local storage */
movl 0x8(%esp), %ecx
movl %ecx, 0x10(%edx)
/* restore current deallocation stack */
movl 0xc(%esp), %ecx
movl %ecx, 0xe0c(%edx)
/* restore current stack limit */
movl 0x10(%esp), %ecx
movl %ecx, 0x8(%edx)
/* restore current stack base */
movl 0x14(%esp), %ecx
movl %ecx, 0x4(%edx)
/* restore current SEH exception list */
movl 0x18(%esp), %ecx
movl %ecx, (%edx)

movl 0x2c(%esp), %ecx /* restore EIP */

movl 0x1c(%esp), %edi /* restore EDI */
movl 0x20(%esp), %esi /* restore ESI */
movl 0x24(%esp), %ebx /* restore EBX */
movl 0x28(%esp), %ebp /* restore EBP */

/* prepare stack */
leal 0x30(%esp), %esp

/* return transfer_t */
/* FCTX == EAX, DATA == EDX */
movl 0x34(%eax), %edx

/* jump to context */
jmp *%ecx

.section .drectve
.ascii " -export:\"_jump_fcontext\""
6 changes: 6 additions & 0 deletions src/asm/jump_i386_ms_pe_gas.asm
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@
.file "jump_i386_ms_pe_gas.asm"
.text
.p2align 4,,15

/* mark as using no unregistered SEH handlers */
.globl @feat.00
.def @feat.00; .scl 3; .type 0; .endef
.set @feat.00, 1

.globl _jump_fcontext
.def _jump_fcontext; .scl 2; .type 32; .endef
_jump_fcontext:
Expand Down
Loading

0 comments on commit da861cb

Please sign in to comment.