Skip to content

Commit 02d7da3

Browse files
committed
An attempt to fix phpGH-12596: Segmentation fault on AArch64 release build with opcache.jit=1112
1 parent 9c30647 commit 02d7da3

File tree

3 files changed

+20
-22
lines changed

3 files changed

+20
-22
lines changed

Zend/zend_vm_execute.h

Lines changed: 10 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Zend/zend_vm_execute.skl

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,6 @@ ZEND_API void {%EXECUTOR_NAME%}_ex(zend_execute_data *ex)
1313

1414
{%INTERNAL_LABELS%}
1515

16-
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
17-
/* Force C compiler to store preserved registers to allow JIT using them */
18-
# if defined(__GNUC__) && defined(__i386__)
19-
__asm__ __volatile__ (""::: "ebx");
20-
# elif defined(__GNUC__) && defined(__x86_64__)
21-
__asm__ __volatile__ (""::: "rbx","r12","r13");
22-
# elif defined(__GNUC__) && defined(__aarch64__)
23-
__asm__ __volatile__ (""::: "x19","x20","x21","x22","x23","x24","x25","x26");
24-
# endif
25-
#endif
2616
LOAD_OPLINE();
2717
ZEND_VM_LOOP_INTERRUPT_CHECK();
2818

Zend/zend_vm_gen.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1844,7 +1844,16 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
18441844
switch ($kind) {
18451845
case ZEND_VM_KIND_HYBRID:
18461846
out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
1847-
out($f,"#define HYBRID_NEXT() goto *(void**)(OPLINE->handler)\n");
1847+
out($f,"# if defined(__GNUC__) && defined(__i386__)\n");
1848+
out($f,"# define HYBRID_JIT_GUARD() __asm__ __volatile__ (\"\"::: \"ebx\")\n");
1849+
out($f,"# elif defined(__GNUC__) && defined(__x86_64__)\n");
1850+
out($f,"# define HYBRID_JIT_GUARD() __asm__ __volatile__ (\"\"::: \"rbx\",\"r12\",\"r13\")\n");
1851+
out($f,"# elif defined(__GNUC__) && defined(__aarch64__)\n");
1852+
out($f,"# define HYBRID_JIT_GUARD() __asm__ __volatile__ (\"\"::: \"x19\",\"x20\",\"x21\",\"x22\",\"x23\",\"x24\",\"x25\",\"x26\")\n");
1853+
out($f,"# else\n");
1854+
out($f,"# define HYBRID_JIT_GUARD()\n");
1855+
out($f,"# endif\n");
1856+
out($f,"#define HYBRID_NEXT() HYBRID_JIT_GUARD(); goto *(void**)(OPLINE->handler)\n");
18481857
out($f,"#define HYBRID_SWITCH() HYBRID_NEXT();\n");
18491858
out($f,"#define HYBRID_CASE(op) op ## _LABEL\n");
18501859
out($f,"#define HYBRID_BREAK() HYBRID_NEXT()\n");

0 commit comments

Comments
 (0)