Download raw body.
php 8.X sparc64 support
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"`
php 8.X sparc64 support