From: Claudio Jeker Subject: php 8.X sparc64 support To: ports@openbsd.org Date: Tue, 6 Feb 2024 17:44:31 +0100 Since I like my sparc64 server and I like it to run roundcube lets bring modern php to sparc64. I sat down and implemented the necessary fiber ASM which could also be used in boost-context (but that code needs an additional ontop_fcontext() function). I built 8.1, 8.2 and 8.3 with this diff and ran make test (for 8.2 and 8.1). All fiber related tests pass so I think this could be good enough. sparc64 is a funky arch since the register windows hide all callee saved registers (if you save and restore in the jump function). So the implementation of jump_fcontext() is trivial. Also no FPU context needs to be saved (again all registers are volatile accross function calls). I'm not 100% sure about %g2, %g3, %g6 and %g7 from my understanding those are either scratch regs (and therefor volatile) or must not be changed by userland code (e.g. %g7 for TLS). From my understanding only %g7 has a special meaning on OpenBSD but this information about the ABI is very vague. In make_fcontext() I need an extra trampoline since stackghost does not allow me to alter / fake the return address of the function called. Does someone know of some PHP code that heavily depends on fiber? -- :wq Claudio Index: 8.1/Makefile =================================================================== RCS file: /cvs/ports/lang/php/8.1/Makefile,v diff -u -p -r1.45 Makefile --- 8.1/Makefile 22 Dec 2023 13:30:56 -0000 1.45 +++ 8.1/Makefile 6 Feb 2024 16:32:11 -0000 @@ -1,5 +1,3 @@ -BROKEN-sparc64= fibers requires either ucontext or asm code (not present for sparc64) - PHP_VERSION= 8.1.27 PHP_PKGSPEC= >=8.1,<8.2 Index: 8.1/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S =================================================================== RCS file: 8.1/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S diff -N 8.1/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ 8.1/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S 6 Feb 2024 16:32:11 -0000 @@ -0,0 +1,55 @@ +Index: Zend/asm/jump_sparc64_sysv_elf_gas.S +--- Zend/asm/jump_sparc64_sysv_elf_gas.S.orig ++++ Zend/asm/jump_sparc64_sysv_elf_gas.S +@@ -0,0 +1,51 @@ ++/* ++ Copyright Claudio Jeker 2024 ++ 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) ++*/ ++ ++/* ++ * typedef struct { ++ * void *handle; ++ * zend_fiber_transfer *transfer; ++ * } boost_context_data; ++ * ++ * boost_context_data jump_fcontext(void *to, zend_fiber_transfer *transfer); ++ */ ++#define FRAMESIZE 176 ++#define BIAS 2047 ++#define SP 128 ++#define I7 136 ++ ++.file "jump_sparc64_sysv_elf_gas.S" ++.text ++.align 4 ++.global jump_fcontext ++.type jump_fcontext, %function ++jump_fcontext: ++ # prepare stack ++ save %sp, -FRAMESIZE, %sp ++ ++ # store framepointer and return address in slots reserved ++ # for arguments ++ stx %fp, [%sp + BIAS + SP] ++ stx %i7, [%sp + BIAS + I7] ++ mov %sp, %o0 ++ # force flush register windows to stack and with that save context ++ flushw ++ # get SP (pointing to new context-data) from %i0 param ++ mov %i0, %sp ++ # load framepointer and return address from context ++ ldx [%sp + BIAS + SP], %fp ++ ldx [%sp + BIAS + I7], %i7 ++ ++ # store old %sp (pointing to old context-data) in %i0 as return ++ # *data stored in %i1 is unmodified ++ mov %o0, %i0 ++ ++ ret ++ restore ++.size jump_fcontext,.-jump_fcontext ++# Mark that we don't need executable stack. ++.section .note.GNU-stack,"",%progbits Index: 8.1/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S =================================================================== RCS file: 8.1/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S diff -N 8.1/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ 8.1/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S 6 Feb 2024 16:32:11 -0000 @@ -0,0 +1,73 @@ +Index: Zend/asm/make_sparc64_sysv_elf_gas.S +--- Zend/asm/make_sparc64_sysv_elf_gas.S.orig ++++ Zend/asm/make_sparc64_sysv_elf_gas.S +@@ -0,0 +1,69 @@ ++/* ++ Copyright Claudio Jeker 2024 ++ 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) ++*/ ++ ++/* ++ * void *make_fcontext(void *sp, size_t size, void (*fn)(boost_context_data)); ++ */ ++#define FRAMESIZE 176 ++#define BIAS 2047 ++#define FP 112 ++#define SP 128 ++#define I7 136 ++ ++.file "make_sparc64_sysv_elf_gas.S" ++.text ++.align 4 ++.global make_fcontext ++.type make_fcontext, %function ++make_fcontext: ++ save %sp, -FRAMESIZE, %sp ++ ++ # shift address in %i0 (allocated stack) to lower 16 byte boundary ++ and %i0, -0xf, %i0 ++ ++ # reserve space for two frames on the stack ++ # the first frame is for the call the second one holds the data ++ # for jump_fcontext ++ sub %i0, 2 * FRAMESIZE, %i0 ++ ++ # third argument of make_fcontext() is the context-function to call ++ # store it in the first stack frame, also clear %fp there to indicate ++ # the end of the stack. ++ stx %i2, [%i0 + FRAMESIZE + I7] ++ stx %g0, [%i0 + FRAMESIZE + FP] ++ ++ # On OpenBSD stackghost prevents overriding the return address on ++ # a stack frame. So this code uses an extra trampoline to load ++ # to call the context-function and then do the _exit(0) dance. ++ # Extract the full address of the trampoline via pc relative addressing ++1: ++ rd %pc, %l0 ++ add %l0, (trampoline - 1b - 8), %l0 ++ stx %l0, [%i0 + I7] ++ ++ # Save framepointer to first stack frame but first substract the BIAS ++ add %i0, FRAMESIZE - BIAS, %l0 ++ stx %l0, [%i0 + SP] ++ ++ # Return context-data which is also includes the BIAS ++ sub %i0, BIAS, %i0 ++ ret ++ restore ++ ++trampoline: ++ ldx [%sp + BIAS + I7], %l0 ++ ++ # no need to setup boost_context_data, already in %o0 and %o1 ++ jmpl %l0, %o7 ++ nop ++ ++ call _exit ++ clr %o0 ++ unimp ++.size make_fcontext,.-make_fcontext ++# Mark that we don't need executable stack. ++.section .note.GNU-stack,"",%progbits Index: 8.1/patches/patch-configure_ac =================================================================== RCS file: /cvs/ports/lang/php/8.1/patches/patch-configure_ac,v diff -u -p -r1.11 patch-configure_ac --- 8.1/patches/patch-configure_ac 28 Sep 2023 23:29:08 -0000 1.11 +++ 8.1/patches/patch-configure_ac 6 Feb 2024 16:32:11 -0000 @@ -21,7 +21,23 @@ Index: configure.ac if test -z "$PHP_MODULES" && test -z "$PHP_ZEND_EX"; then enable_shared=no fi -@@ -1383,7 +1383,7 @@ EXPANDED_SYSCONFDIR=`eval echo $sysconfdir` +@@ -1216,6 +1216,7 @@ AS_CASE([$host_cpu], + [s390x*], [fiber_cpu="s390x"], + [mips64*], [fiber_cpu="mips64"], + [mips*], [fiber_cpu="mips32"], ++ [sparc64], [fiber_cpu="sparc64"], + [fiber_cpu="unknown"] + ) + +@@ -1237,6 +1238,7 @@ AS_CASE([$fiber_cpu], + [s390x], [fiber_asm_file_prefix="s390x_sysv"], + [mips64], [fiber_asm_file_prefix="mips64_n64"], + [mips32], [fiber_asm_file_prefix="mips32_o32"], ++ [sparc64], [fiber_asm_file_prefix="sparc64_sysv"], + [fiber_asm_file_prefix="unknown"] + ) + +@@ -1383,7 +1385,7 @@ EXPANDED_SYSCONFDIR=`eval echo $sysconfdir` EXPANDED_DATADIR=$datadir EXPANDED_PHP_CONFIG_FILE_PATH=`eval echo "$PHP_CONFIG_FILE_PATH"` EXPANDED_PHP_CONFIG_FILE_SCAN_DIR=`eval echo "$PHP_CONFIG_FILE_SCAN_DIR"` Index: 8.2/Makefile =================================================================== RCS file: /cvs/ports/lang/php/8.2/Makefile,v diff -u -p -r1.21 Makefile --- 8.2/Makefile 21 Jan 2024 10:51:30 -0000 1.21 +++ 8.2/Makefile 6 Feb 2024 16:32:11 -0000 @@ -1,5 +1,3 @@ -BROKEN-sparc64= fibers requires either ucontext or asm code (not present for sparc64) - PHP_VERSION= 8.2.15 PHP_PKGSPEC= >=8.2,<8.3 Index: 8.2/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S =================================================================== RCS file: 8.2/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S diff -N 8.2/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ 8.2/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S 6 Feb 2024 16:32:11 -0000 @@ -0,0 +1,55 @@ +Index: Zend/asm/jump_sparc64_sysv_elf_gas.S +--- Zend/asm/jump_sparc64_sysv_elf_gas.S.orig ++++ Zend/asm/jump_sparc64_sysv_elf_gas.S +@@ -0,0 +1,51 @@ ++/* ++ Copyright Claudio Jeker 2024 ++ 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) ++*/ ++ ++/* ++ * typedef struct { ++ * void *handle; ++ * zend_fiber_transfer *transfer; ++ * } boost_context_data; ++ * ++ * boost_context_data jump_fcontext(void *to, zend_fiber_transfer *transfer); ++ */ ++#define FRAMESIZE 176 ++#define BIAS 2047 ++#define SP 128 ++#define I7 136 ++ ++.file "jump_sparc64_sysv_elf_gas.S" ++.text ++.align 4 ++.global jump_fcontext ++.type jump_fcontext, %function ++jump_fcontext: ++ # prepare stack ++ save %sp, -FRAMESIZE, %sp ++ ++ # store framepointer and return address in slots reserved ++ # for arguments ++ stx %fp, [%sp + BIAS + SP] ++ stx %i7, [%sp + BIAS + I7] ++ mov %sp, %o0 ++ # force flush register windows to stack and with that save context ++ flushw ++ # get SP (pointing to new context-data) from %i0 param ++ mov %i0, %sp ++ # load framepointer and return address from context ++ ldx [%sp + BIAS + SP], %fp ++ ldx [%sp + BIAS + I7], %i7 ++ ++ # store old %sp (pointing to old context-data) in %i0 as return ++ # *data stored in %i1 is unmodified ++ mov %o0, %i0 ++ ++ ret ++ restore ++.size jump_fcontext,.-jump_fcontext ++# Mark that we don't need executable stack. ++.section .note.GNU-stack,"",%progbits Index: 8.2/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S =================================================================== RCS file: 8.2/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S diff -N 8.2/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ 8.2/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S 6 Feb 2024 16:32:11 -0000 @@ -0,0 +1,73 @@ +Index: Zend/asm/make_sparc64_sysv_elf_gas.S +--- Zend/asm/make_sparc64_sysv_elf_gas.S.orig ++++ Zend/asm/make_sparc64_sysv_elf_gas.S +@@ -0,0 +1,69 @@ ++/* ++ Copyright Claudio Jeker 2024 ++ 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) ++*/ ++ ++/* ++ * void *make_fcontext(void *sp, size_t size, void (*fn)(boost_context_data)); ++ */ ++#define FRAMESIZE 176 ++#define BIAS 2047 ++#define FP 112 ++#define SP 128 ++#define I7 136 ++ ++.file "make_sparc64_sysv_elf_gas.S" ++.text ++.align 4 ++.global make_fcontext ++.type make_fcontext, %function ++make_fcontext: ++ save %sp, -FRAMESIZE, %sp ++ ++ # shift address in %i0 (allocated stack) to lower 16 byte boundary ++ and %i0, -0xf, %i0 ++ ++ # reserve space for two frames on the stack ++ # the first frame is for the call the second one holds the data ++ # for jump_fcontext ++ sub %i0, 2 * FRAMESIZE, %i0 ++ ++ # third argument of make_fcontext() is the context-function to call ++ # store it in the first stack frame, also clear %fp there to indicate ++ # the end of the stack. ++ stx %i2, [%i0 + FRAMESIZE + I7] ++ stx %g0, [%i0 + FRAMESIZE + FP] ++ ++ # On OpenBSD stackghost prevents overriding the return address on ++ # a stack frame. So this code uses an extra trampoline to load ++ # to call the context-function and then do the _exit(0) dance. ++ # Extract the full address of the trampoline via pc relative addressing ++1: ++ rd %pc, %l0 ++ add %l0, (trampoline - 1b - 8), %l0 ++ stx %l0, [%i0 + I7] ++ ++ # Save framepointer to first stack frame but first substract the BIAS ++ add %i0, FRAMESIZE - BIAS, %l0 ++ stx %l0, [%i0 + SP] ++ ++ # Return context-data which is also includes the BIAS ++ sub %i0, BIAS, %i0 ++ ret ++ restore ++ ++trampoline: ++ ldx [%sp + BIAS + I7], %l0 ++ ++ # no need to setup boost_context_data, already in %o0 and %o1 ++ jmpl %l0, %o7 ++ nop ++ ++ call _exit ++ clr %o0 ++ unimp ++.size make_fcontext,.-make_fcontext ++# Mark that we don't need executable stack. ++.section .note.GNU-stack,"",%progbits Index: 8.2/patches/patch-configure_ac =================================================================== RCS file: /cvs/ports/lang/php/8.2/patches/patch-configure_ac,v diff -u -p -r1.6 patch-configure_ac --- 8.2/patches/patch-configure_ac 28 Sep 2023 23:28:58 -0000 1.6 +++ 8.2/patches/patch-configure_ac 6 Feb 2024 16:32:11 -0000 @@ -21,7 +21,23 @@ Index: configure.ac if test -z "$PHP_MODULES" && test -z "$PHP_ZEND_EX"; then enable_shared=no fi -@@ -1424,7 +1424,7 @@ EXPANDED_SYSCONFDIR=`eval echo $sysconfdir` +@@ -1257,6 +1257,7 @@ AS_CASE([$host_cpu], + [s390x*], [fiber_cpu="s390x"], + [mips64*], [fiber_cpu="mips64"], + [mips*], [fiber_cpu="mips32"], ++ [sparc64], [fiber_cpu="sparc64"], + [fiber_cpu="unknown"] + ) + +@@ -1278,6 +1279,7 @@ AS_CASE([$fiber_cpu], + [s390x], [fiber_asm_file_prefix="s390x_sysv"], + [mips64], [fiber_asm_file_prefix="mips64_n64"], + [mips32], [fiber_asm_file_prefix="mips32_o32"], ++ [sparc64], [fiber_asm_file_prefix="sparc64_sysv"], + [fiber_asm_file_prefix="unknown"] + ) + +@@ -1424,7 +1426,7 @@ EXPANDED_SYSCONFDIR=`eval echo $sysconfdir` EXPANDED_DATADIR=$datadir EXPANDED_PHP_CONFIG_FILE_PATH=`eval echo "$PHP_CONFIG_FILE_PATH"` EXPANDED_PHP_CONFIG_FILE_SCAN_DIR=`eval echo "$PHP_CONFIG_FILE_SCAN_DIR"` Index: 8.3/Makefile =================================================================== RCS file: /cvs/ports/lang/php/8.3/Makefile,v diff -u -p -r1.3 Makefile --- 8.3/Makefile 21 Jan 2024 10:51:45 -0000 1.3 +++ 8.3/Makefile 6 Feb 2024 16:32:11 -0000 @@ -1,5 +1,3 @@ -BROKEN-sparc64= fibers requires either ucontext or asm code (not present for sparc64) - PHP_VERSION= 8.3.2 PHP_PKGSPEC= >=8.3,<8.4 Index: 8.3/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S =================================================================== RCS file: 8.3/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S diff -N 8.3/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ 8.3/patches/patch-Zend_asm_jump_sparc64_sysv_elf_gas_S 6 Feb 2024 16:32:11 -0000 @@ -0,0 +1,55 @@ +Index: Zend/asm/jump_sparc64_sysv_elf_gas.S +--- Zend/asm/jump_sparc64_sysv_elf_gas.S.orig ++++ Zend/asm/jump_sparc64_sysv_elf_gas.S +@@ -0,0 +1,51 @@ ++/* ++ Copyright Claudio Jeker 2024 ++ 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) ++*/ ++ ++/* ++ * typedef struct { ++ * void *handle; ++ * zend_fiber_transfer *transfer; ++ * } boost_context_data; ++ * ++ * boost_context_data jump_fcontext(void *to, zend_fiber_transfer *transfer); ++ */ ++#define FRAMESIZE 176 ++#define BIAS 2047 ++#define SP 128 ++#define I7 136 ++ ++.file "jump_sparc64_sysv_elf_gas.S" ++.text ++.align 4 ++.global jump_fcontext ++.type jump_fcontext, %function ++jump_fcontext: ++ # prepare stack ++ save %sp, -FRAMESIZE, %sp ++ ++ # store framepointer and return address in slots reserved ++ # for arguments ++ stx %fp, [%sp + BIAS + SP] ++ stx %i7, [%sp + BIAS + I7] ++ mov %sp, %o0 ++ # force flush register windows to stack and with that save context ++ flushw ++ # get SP (pointing to new context-data) from %i0 param ++ mov %i0, %sp ++ # load framepointer and return address from context ++ ldx [%sp + BIAS + SP], %fp ++ ldx [%sp + BIAS + I7], %i7 ++ ++ # store old %sp (pointing to old context-data) in %i0 as return ++ # *data stored in %i1 is unmodified ++ mov %o0, %i0 ++ ++ ret ++ restore ++.size jump_fcontext,.-jump_fcontext ++# Mark that we don't need executable stack. ++.section .note.GNU-stack,"",%progbits Index: 8.3/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S =================================================================== RCS file: 8.3/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S diff -N 8.3/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ 8.3/patches/patch-Zend_asm_make_sparc64_sysv_elf_gas_S 6 Feb 2024 16:32:11 -0000 @@ -0,0 +1,73 @@ +Index: Zend/asm/make_sparc64_sysv_elf_gas.S +--- Zend/asm/make_sparc64_sysv_elf_gas.S.orig ++++ Zend/asm/make_sparc64_sysv_elf_gas.S +@@ -0,0 +1,69 @@ ++/* ++ Copyright Claudio Jeker 2024 ++ 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) ++*/ ++ ++/* ++ * void *make_fcontext(void *sp, size_t size, void (*fn)(boost_context_data)); ++ */ ++#define FRAMESIZE 176 ++#define BIAS 2047 ++#define FP 112 ++#define SP 128 ++#define I7 136 ++ ++.file "make_sparc64_sysv_elf_gas.S" ++.text ++.align 4 ++.global make_fcontext ++.type make_fcontext, %function ++make_fcontext: ++ save %sp, -FRAMESIZE, %sp ++ ++ # shift address in %i0 (allocated stack) to lower 16 byte boundary ++ and %i0, -0xf, %i0 ++ ++ # reserve space for two frames on the stack ++ # the first frame is for the call the second one holds the data ++ # for jump_fcontext ++ sub %i0, 2 * FRAMESIZE, %i0 ++ ++ # third argument of make_fcontext() is the context-function to call ++ # store it in the first stack frame, also clear %fp there to indicate ++ # the end of the stack. ++ stx %i2, [%i0 + FRAMESIZE + I7] ++ stx %g0, [%i0 + FRAMESIZE + FP] ++ ++ # On OpenBSD stackghost prevents overriding the return address on ++ # a stack frame. So this code uses an extra trampoline to load ++ # to call the context-function and then do the _exit(0) dance. ++ # Extract the full address of the trampoline via pc relative addressing ++1: ++ rd %pc, %l0 ++ add %l0, (trampoline - 1b - 8), %l0 ++ stx %l0, [%i0 + I7] ++ ++ # Save framepointer to first stack frame but first substract the BIAS ++ add %i0, FRAMESIZE - BIAS, %l0 ++ stx %l0, [%i0 + SP] ++ ++ # Return context-data which is also includes the BIAS ++ sub %i0, BIAS, %i0 ++ ret ++ restore ++ ++trampoline: ++ ldx [%sp + BIAS + I7], %l0 ++ ++ # no need to setup boost_context_data, already in %o0 and %o1 ++ jmpl %l0, %o7 ++ nop ++ ++ call _exit ++ clr %o0 ++ unimp ++.size make_fcontext,.-make_fcontext ++# Mark that we don't need executable stack. ++.section .note.GNU-stack,"",%progbits Index: 8.3/patches/patch-configure_ac =================================================================== RCS file: /cvs/ports/lang/php/8.3/patches/patch-configure_ac,v diff -u -p -r1.1 patch-configure_ac --- 8.3/patches/patch-configure_ac 27 Nov 2023 19:02:16 -0000 1.1 +++ 8.3/patches/patch-configure_ac 6 Feb 2024 16:32:11 -0000 @@ -21,7 +21,23 @@ Index: configure.ac if test -z "$PHP_MODULES" && test -z "$PHP_ZEND_EX"; then enable_shared=no fi -@@ -1463,7 +1463,7 @@ EXPANDED_SYSCONFDIR=`eval echo $sysconfdir` +@@ -1272,6 +1272,7 @@ AS_CASE([$host_cpu], + [s390x*], [fiber_cpu="s390x"], + [mips64*], [fiber_cpu="mips64"], + [mips*], [fiber_cpu="mips32"], ++ [sparc64], [fiber_cpu="sparc64"], + [fiber_cpu="unknown"] + ) + +@@ -1293,6 +1294,7 @@ AS_CASE([$fiber_cpu], + [s390x], [fiber_asm_file_prefix="s390x_sysv"], + [mips64], [fiber_asm_file_prefix="mips64_n64"], + [mips32], [fiber_asm_file_prefix="mips32_o32"], ++ [sparc64], [fiber_asm_file_prefix="sparc64_sysv"], + [fiber_asm_file_prefix="unknown"] + ) + +@@ -1463,7 +1465,7 @@ EXPANDED_SYSCONFDIR=`eval echo $sysconfdir` EXPANDED_DATADIR=$datadir EXPANDED_PHP_CONFIG_FILE_PATH=`eval echo "$PHP_CONFIG_FILE_PATH"` EXPANDED_PHP_CONFIG_FILE_SCAN_DIR=`eval echo "$PHP_CONFIG_FILE_SCAN_DIR"`