Skip to content

Commit 521532a

Browse files
committed
Fix longjmp caused crash at windows arm64
using mingw codes this may also speed up longjmp a little?
1 parent 617067f commit 521532a

File tree

5 files changed

+71
-14
lines changed

5 files changed

+71
-14
lines changed

Zend/asm/jump_arm64_ms_pe_armasm.asm

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
; (See accompanying file LICENSE_1_0.txt or copy at
44
; http://www.boost.org/LICENSE_1_0.txt)
55

6-
; ported by Yun Dou <dixyes@gmail.com> 2021
7-
86
;*******************************************************
97
;* *
108
;* ------------------------------------------------- *
@@ -52,8 +50,8 @@
5250
;* *
5351
;*******************************************************
5452

55-
AREA |.text|, CODE, READONLY, ALIGN=4, CODEALIGN
56-
EXPORT jump_fcontext
53+
AREA |.text|, CODE, READONLY, ALIGN=4, CODEALIGN
54+
EXPORT jump_fcontext
5755
jump_fcontext proc
5856
; prepare stack for GP + FPU
5957
sub sp, sp, #0xb0
@@ -107,5 +105,5 @@ jump_fcontext proc
107105
add sp, sp, #0xb0
108106

109107
ret x4
110-
ENDP
111-
END
108+
ENDP
109+
END

Zend/asm/make_arm64_ms_pe_armasm.asm

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
; (See accompanying file LICENSE_1_0.txt or copy at
44
; http://www.boost.org/LICENSE_1_0.txt)
55

6-
; ported by Yun Dou <dixyes@gmail.com> 2021
7-
86
;*******************************************************
97
;* *
108
;* ------------------------------------------------- *
@@ -52,9 +50,10 @@
5250
;* *
5351
;*******************************************************
5452

55-
AREA |.text|, CODE, READONLY, ALIGN=4, CODEALIGN
56-
EXPORT make_fcontext
57-
IMPORT _exit
53+
AREA |.text|, CODE, READONLY, ALIGN=4, CODEALIGN
54+
EXPORT make_fcontext
55+
IMPORT _exit
56+
5857
make_fcontext proc
5958
; shift address in x0 (allocated stack) to lower 16 byte boundary
6059
and x0, x0, ~0xF
@@ -78,5 +77,5 @@ finish
7877
mov x0, #0
7978
; exit application
8079
bl _exit
81-
ENDP
82-
END
80+
ENDP
81+
END

Zend/asm/sjlj_arm64_ms_pe_armasm.asm

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
2+
; from mingw-w64/mingw-w64-crt/misc/longjmp.S mingw-w64/mingw-w64-crt/misc/setjmp.S
3+
; in public domain
4+
5+
AREA |.text|, CODE, READONLY, ALIGN=4, CODEALIGN
6+
EXPORT mingw_setjmp
7+
EXPORT mingw_longjmp
8+
mingw_setjmp proc
9+
mov x1, #0
10+
str x1, [x0] ; jmp_buf->Frame
11+
stp x19, x20, [x0, #0x10] ; jmp_buf->X19, X20
12+
stp x21, x22, [x0, #0x20] ; jmp_buf->X21, X22
13+
stp x23, x24, [x0, #0x30] ; jmp_buf->X23, X24
14+
stp x25, x26, [x0, #0x40] ; jmp_buf->X25, X26
15+
stp x27, x28, [x0, #0x50] ; jmp_buf->X27, X28
16+
stp x29, x30, [x0, #0x60] ; jmp_buf->Fp, Lr
17+
mov x2, sp
18+
str x2, [x0, #0x70] ; jmp_buf->Sp
19+
mrs x2, fpcr
20+
str w2, [x0, #0x78] ; jmp_buf->Fpcr
21+
mrs x2, fpsr
22+
str w2, [x0, #0x7c] ; jmp_buf->Fpsr
23+
stp d8, d9, [x0, #0x80] ; jmp_buf->D[0-1]
24+
stp d10, d11, [x0, #0x90] ; jmp_buf->D[2-3]
25+
stp d12, d13, [x0, #0xa0] ; jmp_buf->D[4-5]
26+
stp d14, d15, [x0, #0xb0] ; jmp_buf->D[6-7]
27+
mov x0, #0
28+
ret
29+
ENDP
30+
31+
mingw_longjmp proc
32+
ldp x19, x20, [x0, #0x10] ; jmp_buf->X19, X20
33+
ldp x21, x22, [x0, #0x20] ; jmp_buf->X21, X22
34+
ldp x23, x24, [x0, #0x30] ; jmp_buf->X23, X24
35+
ldp x25, x26, [x0, #0x40] ; jmp_buf->X25, X26
36+
ldp x27, x28, [x0, #0x50] ; jmp_buf->X27, X28
37+
ldp x29, x30, [x0, #0x60] ; jmp_buf->Fp, Lr
38+
ldr x2, [x0, #0x70] ; jmp_buf->Sp
39+
mov sp, x2
40+
ldr w2, [x0, #0x78] ; jmp_buf->Fpcr
41+
msr fpcr, x2
42+
ldr w2, [x0, #0x7c] ; jmp_buf->Fpsr
43+
msr fpsr, x2
44+
ldp d8, d9, [x0, #0x80] ; jmp_buf->D[0-1]
45+
ldp d10, d11, [x0, #0x90] ; jmp_buf->D[2-3]
46+
ldp d12, d13, [x0, #0xa0] ; jmp_buf->D[4-5]
47+
ldp d14, d15, [x0, #0xb0] ; jmp_buf->D[6-7]
48+
mov x0, x1 ; retval
49+
ret
50+
ENDP
51+
END

Zend/zend_portability.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,10 +368,16 @@ char *alloca();
368368
# define SETJMP(a) sigsetjmp(a, 0)
369369
# define LONGJMP(a,b) siglongjmp(a, b)
370370
# define JMP_BUF sigjmp_buf
371-
#else
371+
#elif !(defined(PHP_WIN32) && defined(_M_ARM64))
372372
# define SETJMP(a) setjmp(a)
373373
# define LONGJMP(a,b) longjmp(a, b)
374374
# define JMP_BUF jmp_buf
375+
#else
376+
int __cdecl mingw_setjmp(jmp_buf _Buf);
377+
ZEND_NORETURN void __cdecl mingw_longjmp(jmp_buf _Buf, int _Value);
378+
# define SETJMP(a) mingw_setjmp(a)
379+
# define LONGJMP(a,b) mingw_longjmp(a, b)
380+
# define JMP_BUF jmp_buf
375381
#endif
376382

377383
#if ZEND_DEBUG

win32/build/config.w32

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,9 @@ DEFINE('FIBER_ASM_ABI', FIBER_ASM_ABI);
266266

267267
if (TARGET_ARCH == 'arm64') {
268268
DEFINE('FIBER_ASM_FLAGS', '-nologo -machine ARM64 -o');
269+
ADD_FLAG('LDFLAGS', '$(BUILD_DIR)\\Zend\\sjlj_arm64_ms_pe_armasm.obj');
270+
MFO.WriteLine('$(BUILD_DIR)\\Zend\\sjlj_arm64_ms_pe_armasm.obj: Zend\\asm\\sjlj_arm64_ms_pe_armasm.asm');
271+
MFO.WriteLine('\t$(FIBER_ASSEMBLER) $(FIBER_ASM_FLAGS) $(BUILD_DIR)\\Zend\\sjlj_arm64_ms_pe_armasm.obj Zend\\asm\\sjlj_arm64_ms_pe_armasm.asm');
269272
} else {
270273
DEFINE('FIBER_ASM_FLAGS', '/DBOOST_CONTEXT_EXPORT=EXPORT /nologo /c /Fo');
271274
}

0 commit comments

Comments
 (0)