From 02d7da3acbde97df322d46f0a5bcf00f59cfebae Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 5 Dec 2023 03:14:45 +0300 Subject: [PATCH] An attempt to fix GH-12596: Segmentation fault on AArch64 release build with opcache.jit=1112 --- Zend/zend_vm_execute.h | 21 ++++++++++----------- Zend/zend_vm_execute.skl | 10 ---------- Zend/zend_vm_gen.php | 11 ++++++++++- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f3bee4aa7e034..fbec492f7d70a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -345,7 +345,16 @@ static const void *zend_vm_get_opcode_handler_func(uint8_t opcode, const zend_op # define VM_TRACE_END() #endif #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) -#define HYBRID_NEXT() goto *(void**)(OPLINE->handler) +# if defined(__GNUC__) && defined(__i386__) +# define HYBRID_JIT_GUARD() __asm__ __volatile__ (""::: "ebx") +# elif defined(__GNUC__) && defined(__x86_64__) +# define HYBRID_JIT_GUARD() __asm__ __volatile__ (""::: "rbx","r12","r13") +# elif defined(__GNUC__) && defined(__aarch64__) +# define HYBRID_JIT_GUARD() __asm__ __volatile__ (""::: "x19","x20","x21","x22","x23","x24","x25","x26") +# else +# define HYBRID_JIT_GUARD() +# endif +#define HYBRID_NEXT() HYBRID_JIT_GUARD(); goto *(void**)(OPLINE->handler) #define HYBRID_SWITCH() HYBRID_NEXT(); #define HYBRID_CASE(op) op ## _LABEL #define HYBRID_BREAK() HYBRID_NEXT() @@ -56980,16 +56989,6 @@ ZEND_API void execute_ex(zend_execute_data *ex) } #endif -#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) - /* Force C compiler to store preserved registers to allow JIT using them */ -# if defined(__GNUC__) && defined(__i386__) - __asm__ __volatile__ (""::: "ebx"); -# elif defined(__GNUC__) && defined(__x86_64__) - __asm__ __volatile__ (""::: "rbx","r12","r13"); -# elif defined(__GNUC__) && defined(__aarch64__) - __asm__ __volatile__ (""::: "x19","x20","x21","x22","x23","x24","x25","x26"); -# endif -#endif LOAD_OPLINE(); ZEND_VM_LOOP_INTERRUPT_CHECK(); diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl index 65aa52962bdb7..717d4ffd3e8af 100644 --- a/Zend/zend_vm_execute.skl +++ b/Zend/zend_vm_execute.skl @@ -13,16 +13,6 @@ ZEND_API void {%EXECUTOR_NAME%}_ex(zend_execute_data *ex) {%INTERNAL_LABELS%} -#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) - /* Force C compiler to store preserved registers to allow JIT using them */ -# if defined(__GNUC__) && defined(__i386__) - __asm__ __volatile__ (""::: "ebx"); -# elif defined(__GNUC__) && defined(__x86_64__) - __asm__ __volatile__ (""::: "rbx","r12","r13"); -# elif defined(__GNUC__) && defined(__aarch64__) - __asm__ __volatile__ (""::: "x19","x20","x21","x22","x23","x24","x25","x26"); -# endif -#endif LOAD_OPLINE(); ZEND_VM_LOOP_INTERRUPT_CHECK(); diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index f7b630bc5a048..695c05ab1bc93 100755 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -1844,7 +1844,16 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) switch ($kind) { case ZEND_VM_KIND_HYBRID: out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n"); - out($f,"#define HYBRID_NEXT() goto *(void**)(OPLINE->handler)\n"); + out($f,"# if defined(__GNUC__) && defined(__i386__)\n"); + out($f,"# define HYBRID_JIT_GUARD() __asm__ __volatile__ (\"\"::: \"ebx\")\n"); + out($f,"# elif defined(__GNUC__) && defined(__x86_64__)\n"); + out($f,"# define HYBRID_JIT_GUARD() __asm__ __volatile__ (\"\"::: \"rbx\",\"r12\",\"r13\")\n"); + out($f,"# elif defined(__GNUC__) && defined(__aarch64__)\n"); + out($f,"# define HYBRID_JIT_GUARD() __asm__ __volatile__ (\"\"::: \"x19\",\"x20\",\"x21\",\"x22\",\"x23\",\"x24\",\"x25\",\"x26\")\n"); + out($f,"# else\n"); + out($f,"# define HYBRID_JIT_GUARD()\n"); + out($f,"# endif\n"); + out($f,"#define HYBRID_NEXT() HYBRID_JIT_GUARD(); goto *(void**)(OPLINE->handler)\n"); out($f,"#define HYBRID_SWITCH() HYBRID_NEXT();\n"); out($f,"#define HYBRID_CASE(op) op ## _LABEL\n"); out($f,"#define HYBRID_BREAK() HYBRID_NEXT()\n");