diff --git a/main/valgrind/0001-Bug-478624-Valgrind-incompatibility-with-binutils-2..patch b/main/valgrind/0001-Bug-478624-Valgrind-incompatibility-with-binutils-2..patch
deleted file mode 100644
index 1f6ae07b50bfec2a50d0c2dab8e9b386295562e2..0000000000000000000000000000000000000000
--- a/main/valgrind/0001-Bug-478624-Valgrind-incompatibility-with-binutils-2..patch
+++ /dev/null
@@ -1,136 +0,0 @@
-From d35005cef8ad8207542738812705ceabf137d7e0 Mon Sep 17 00:00:00 2001
-From: Paul Floyd <pjfloyd@wanadoo.fr>
-Date: Sun, 17 Dec 2023 14:18:51 +0100
-Subject: [PATCH] Bug 478624 - Valgrind incompatibility with binutils-2.42 on
- x86 with new nop patterns (unhandled instruction bytes: 0x2E 0x8D 0xB4 0x26)
-
-It was a bit of a struggle to get the testcase to build
-with both clang and gcc (oddly enough gcc was more difficult) so
-I just resorted to using .byte arrays.
----
- .gitignore                                 |  1 +
- NEWS                                       |  2 ++
- VEX/priv/guest_x86_toIR.c                  | 22 +++++++++++++-
- none/tests/x86/Makefile.am                 |  2 ++
- none/tests/x86/gnu_binutils_nop.c          | 34 ++++++++++++++++++++++
- none/tests/x86/gnu_binutils_nop.stderr.exp |  0
- none/tests/x86/gnu_binutils_nop.vgtest     |  2 ++
- 7 files changed, 62 insertions(+), 1 deletion(-)
- create mode 100644 none/tests/x86/gnu_binutils_nop.c
- create mode 100644 none/tests/x86/gnu_binutils_nop.stderr.exp
- create mode 100644 none/tests/x86/gnu_binutils_nop.vgtest
-
-diff --git a/VEX/priv/guest_x86_toIR.c b/VEX/priv/guest_x86_toIR.c
-index 5d6e6dc64..3b6efb387 100644
---- a/VEX/priv/guest_x86_toIR.c
-+++ b/VEX/priv/guest_x86_toIR.c
-@@ -8198,7 +8198,7 @@ DisResult disInstr_X86_WRK (
-          delta += 5;
-          goto decode_success;
-       }
--      /* Don't barf on recent binutils padding,
-+      /* Don't barf on recent (2010) binutils padding,
-          all variants of which are: nopw %cs:0x0(%eax,%eax,1)
-          66 2e 0f 1f 84 00 00 00 00 00
-          66 66 2e 0f 1f 84 00 00 00 00 00
-@@ -8223,6 +8223,26 @@ DisResult disInstr_X86_WRK (
-          }
-       }
- 
-+      /* bug478624 GNU binutils uses a leal of esi into itself with
-+         a zero offset and CS prefix as an 8 byte no-op (Dec 2023).
-+         Since the CS prefix is hardly ever used we don't do much
-+         to decode it, just a few cases for conditional branches.
-+         So add handling here with other pseudo-no-ops.
-+       */
-+      if (code[0] == 0x2E && code[1] == 0x8D) {
-+         if (code[2] == 0x74 && code[3] == 0x26 && code[4] == 0x00) {
-+            DIP("leal %%cs:0(%%esi,%%eiz,1),%%esi\n");
-+            delta += 5;
-+            goto decode_success;
-+         }
-+         if (code[2] == 0xB4 && code[3] == 0x26 && code[4] == 0x00
-+             && code[5] == 0x00 && code[6] == 0x00 && code[7] == 0x00) {
-+            DIP("leal %%cs:0(%%esi,%%eiz,1),%%esi\n");
-+            delta += 8;
-+            goto decode_success;
-+         }
-+      }
-+
-       // Intel CET requires the following opcodes to be treated as NOPs
-       // with any prefix and ModRM, SIB and disp combination:
-       // "0F 19", "0F 1C", "0F 1D", "0F 1E", "0F 1F"
-diff --git a/none/tests/x86/Makefile.am b/none/tests/x86/Makefile.am
-index 3ecd1ad3c..dbae86571 100644
---- a/none/tests/x86/Makefile.am
-+++ b/none/tests/x86/Makefile.am
-@@ -52,6 +52,7 @@ EXTRA_DIST = \
- 	fxtract.stdout.exp fxtract.stderr.exp fxtract.vgtest \
- 	fxtract.stdout.exp-older-glibc \
- 	getseg.stdout.exp getseg.stderr.exp getseg.vgtest \
-+	gnu_binutils_nop.stderr.exp gnu_binutils_nop.vgtest \
- 	incdec_alt.stdout.exp incdec_alt.stderr.exp incdec_alt.vgtest \
- 	int.stderr.exp int.stdout.exp int.disabled \
- 	$(addsuffix .stderr.exp,$(INSN_TESTS)) \
-@@ -100,6 +101,7 @@ check_PROGRAMS = \
- 	fpu_lazy_eflags \
- 	fxtract \
- 	getseg \
-+	gnu_binutils_nop \
- 	incdec_alt \
- 	$(INSN_TESTS) \
- 	int \
-diff --git a/none/tests/x86/gnu_binutils_nop.c b/none/tests/x86/gnu_binutils_nop.c
-new file mode 100644
-index 000000000..412a4c2cb
---- /dev/null
-+++ b/none/tests/x86/gnu_binutils_nop.c
-@@ -0,0 +1,34 @@
-+int main(void)
-+{
-+    // GNU binutils uses various opcodes as alternatives for nop
-+    // the idea is that it is faster to execute one large opcode
-+    // with no side-effects than multiple repetitions of the
-+    // single byte 'nop'. This gives more choice when code
-+    // needs to be padded.
-+   
-+   // the following is based on
-+   // https://sourceware.org/cgit/binutils-gdb/tree/gas/config/tc-i386.c#n1256
-+
-+    // one byte
-+    __asm__ __volatile__("nop");
-+    // two bytes
-+    __asm__ __volatile__("xchg %ax,%ax");
-+    // three bytes
-+    //__asm__ __volatile__("leal 0(%esi),%esi");
-+    __asm__ __volatile__(".byte 0x8d,0x76,0x00");
-+    // four bytes
-+    //__asm__ __volatile__("leal 0(%esi,%eiz),%esi");
-+    __asm__ __volatile__(".byte 0x8d,0x74,0x26,0x00");
-+    // five bytes
-+    //__asm__ __volatile__("leal %cs:0(%esi,%eiz),%esi");
-+    __asm__ __volatile__(".byte 0x2e,0x8d,0x74,0x26,0x00");
-+    // six bytes
-+    //__asm__ __volatile__("leal 0L(%esi),%esi");
-+    __asm__ __volatile__(".byte 0x8d,0xb6,0x00,0x00,0x00,0x00");
-+    // seven bytes
-+    //__asm__ __volatile__("leal 0L(%esi,%eiz),%esi");
-+    __asm__ __volatile__(".byte 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00");
-+    // eight bytes
-+    //__asm__ __volatile__("leal %cs:0L(%esi,%eiz),%esi");
-+    __asm__ __volatile__(".byte 0x2e,0x8d,0xb4,0x26,0x00,0x00,0x00,0x00");
-+}
-diff --git a/none/tests/x86/gnu_binutils_nop.stderr.exp b/none/tests/x86/gnu_binutils_nop.stderr.exp
-new file mode 100644
-index 000000000..e69de29bb
-diff --git a/none/tests/x86/gnu_binutils_nop.vgtest b/none/tests/x86/gnu_binutils_nop.vgtest
-new file mode 100644
-index 000000000..7f378dd53
---- /dev/null
-+++ b/none/tests/x86/gnu_binutils_nop.vgtest
-@@ -0,0 +1,2 @@
-+prog: gnu_binutils_nop
-+vgopts: -q
--- 
-2.44.0
-
diff --git a/main/valgrind/APKBUILD b/main/valgrind/APKBUILD
index 4ba0bcd62717c5ee2a624853b0ecea82642c90b4..626d6dcc51897df757aa6c66dd3168dd7be4ca6b 100644
--- a/main/valgrind/APKBUILD
+++ b/main/valgrind/APKBUILD
@@ -1,7 +1,7 @@
 # Maintainer: Natanael Copa <ncopa@alpinelinux.org>
 pkgname=valgrind
-pkgver=3.22.0
-pkgrel=1
+pkgver=3.23.0
+pkgrel=0
 pkgdesc="Tool to help find memory-management problems in programs"
 url="https://valgrind.org/"
 # armv6/riscv64 not supported upstream
@@ -17,18 +17,10 @@ makedepends="sed perl linux-headers"
 options="!strip"
 subpackages="$pkgname-scripts $pkgname-dev $pkgname-doc"
 source="https://sourceware.org/pub/valgrind/valgrind-$pkgver.tar.bz2
-	0001-Bug-478624-Valgrind-incompatibility-with-binutils-2..patch
+	fix-tests-musl-s390x.patch
+	fix-tests-musl-armv7.patch
 	"
 
-# Valgrind 3.19.0 added support for compiling the tests on musl.
-# However, it seems they haven't tested this on many architectures.
-# Disable check on architectures where it doesn't work for now.
-#
-# TODO: Report upstream.
-case "$CARCH" in
-aarch64|s390x|armv7|x86) options="$options !check"
-esac
-
 build() {
 	export CFLAGS="${CFLAGS/-fno-plt} -fno-stack-protector -no-pie -U_FORTIFY_SOURCE"
 	./configure \
@@ -72,6 +64,7 @@ scripts() {
 }
 
 sha512sums="
-2904c13f68245bbafcea70998c6bd20725271300a7e94b6751ca00916943595fc3fac8557da7ea8db31b54a43f092823a0a947bc142829da811d074e1fe49777  valgrind-3.22.0.tar.bz2
-250cac58cd1710d4d9a6a24b9acc596fa01e4d2255b98b46b8ed5c7af9e658489a69b51ca7e7d17ebf5b2a9023f561391e149311c20e99607d6b7e471110cbe5  0001-Bug-478624-Valgrind-incompatibility-with-binutils-2..patch
+27d038faaaf6154cace2df18c3573291393548ba0738dbb6aba58eab6324c5beaa95fc5f3c0271663ca071baf829b15d806f7e81074f7cf087bef20ea0ed3117  valgrind-3.23.0.tar.bz2
+a6c5a33d0d5c09cc65c6c62456e213006560b20f37db0a24bf218c5bd2eb3275541494866699d15bbbc2672292122cb6f6d67176b0f37ba1dec37211c584c480  fix-tests-musl-s390x.patch
+5e0f6b10081318fc5630a7500d490ff5e9b2832889158ecb40a4f310f8be6fcbd8a8744be96742341eba952a0994e407db091673a69d111fae3e132e0ea6ca72  fix-tests-musl-armv7.patch
 "
diff --git a/main/valgrind/fix-tests-musl-armv7.patch b/main/valgrind/fix-tests-musl-armv7.patch
new file mode 100644
index 0000000000000000000000000000000000000000..cf7a6a1437ee6abfc1b3c765d4e16422164abc79
--- /dev/null
+++ b/main/valgrind/fix-tests-musl-armv7.patch
@@ -0,0 +1,14 @@
+diff --git a/memcheck/tests/linux/timerfd-syscall.c b/memcheck/tests/linux/timerfd-syscall.c
+index 61d75b5..1721249 100644
+--- a/memcheck/tests/linux/timerfd-syscall.c
++++ b/memcheck/tests/linux/timerfd-syscall.c
+@@ -78,6 +78,9 @@
+ #elif defined(__s390x__)
+ #define __NR_timerfd_settime 320
+ #define __NR_timerfd_gettime 321
++#elif defined(__arm__) && defined(__NR_timerfd_settime64) && defined(__NR_timerfd_gettime64)
++#define __NR_timerfd_settime __NR_timerfd_settime64
++#define __NR_timerfd_gettime __NR_timerfd_gettime64
+ #else
+ #error Cannot detect your architecture!
+ #endif
diff --git a/main/valgrind/fix-tests-musl-s390x.patch b/main/valgrind/fix-tests-musl-s390x.patch
new file mode 100644
index 0000000000000000000000000000000000000000..73e57f54850830316f28b903b9e982228bec94cc
--- /dev/null
+++ b/main/valgrind/fix-tests-musl-s390x.patch
@@ -0,0 +1,57 @@
+diff --git a/none/tests/s390x/ex_sig.c b/none/tests/s390x/ex_sig.c
+index 9ff33fc..b5aaa7a 100644
+--- a/none/tests/s390x/ex_sig.c
++++ b/none/tests/s390x/ex_sig.c
+@@ -1,5 +1,7 @@
+ #include <features.h>
++#ifdef __GLIBC__
+ #include <fpu_control.h>
++#endif
+ #include <signal.h>
+ #include <sys/types.h>
+ #include <signal.h>
+diff --git a/none/tests/s390x/test_sig.c b/none/tests/s390x/test_sig.c
+index b24dbbe..b93088b 100644
+--- a/none/tests/s390x/test_sig.c
++++ b/none/tests/s390x/test_sig.c
+@@ -1,5 +1,7 @@
+ #include <features.h>
++#ifdef __GLIBC__
+ #include <fpu_control.h>
++#endif
+ #include <signal.h>
+ #include <sys/types.h>
+ #include <signal.h>
+diff --git a/none/tests/s390x/traps.c b/none/tests/s390x/traps.c
+index 86874c3..ce1fc74 100644
+--- a/none/tests/s390x/traps.c
++++ b/none/tests/s390x/traps.c
+@@ -1,5 +1,7 @@
+ #include <features.h>
++#ifdef __GLIBC__
+ #include <fpu_control.h>
++#endif
+ #include <signal.h>
+ #include <sys/types.h>
+ #include <signal.h>
+diff --git a/tests/s390x_features.c b/tests/s390x_features.c
+index 507f3ab..40774de 100644
+--- a/tests/s390x_features.c
++++ b/tests/s390x_features.c
+@@ -48,12 +48,16 @@ jmp_buf env;
+ // of the CPU facility list.  To read the HWCAP, use 'getauxval' if available --
+ // which should be the case with glibc versions >= 2.16.  A system with an older
+ // glibc is unlikely to support any of these features anyhow.
++#ifdef __GLIBC__
+ #if __GLIBC_PREREQ(2, 16)
+ #include <sys/auxv.h>
+ #define GET_HWCAP() getauxval(AT_HWCAP)
+ #else
+ #define GET_HWCAP() 0UL
+ #endif
++#else
++#define GET_HWCAP() 0UL
++#endif
+ 
+ /* Number of double words needed to store all facility bits. */
+ #define S390_NUM_FACILITY_DW 3