https://bugs.gentoo.org/971054
From: Marcus Comstedt <marcus@mc.pp.se>
Date: Wed, 6 Jan 2021 13:51:28 +0100
Subject: [PATCH 1/3] Restrict range of random addresses on big endian PPC64

--- a/deps/v8/src/base/platform/platform-posix.cc
+++ b/deps/v8/src/base/platform/platform-posix.cc
@@ -372,6 +372,9 @@ void* OS::GetRandomMmapAddr() {
   raw_addr &= uint64_t{0x3FFFF000};
   // Use extra address space to isolate the mmap regions.
   raw_addr += uint64_t{0x400000000000};
+#elif V8_TARGET_BIG_ENDIAN
+  // Big-endian Linux: 42 bits of virtual addressing.
+  raw_addr &= uint64_t{0x03FFFFFF0000};
 #else
   // Little-endian Linux: 46 bits of virtual addressing.
   raw_addr &= uint64_t{0x3FFFFFFF0000};
-- 
2.52.0


From f1cd67ed2bb7ef682609cbc271b9fa87f65aa118 Mon Sep 17 00:00:00 2001
From: Marcus Comstedt <marcus@mc.pp.se>
Date: Tue, 4 Jul 2023 18:23:41 +0200
Subject: [PATCH 2/3] Use AIX calling conventions also for Linux with ELFv1

--- a/deps/v8/src/heap/base/asm/ppc/push_registers_asm.cc
+++ b/deps/v8/src/heap/base/asm/ppc/push_registers_asm.cc
@@ -16,9 +16,22 @@
 
 // AIX Runtime process stack:
 // https://www.ibm.com/support/knowledgecenter/ssw_aix_71/assembler/idalangref_runtime_process.html
+
+#include "src/codegen/ppc/constants-ppc.h"
+
 asm(
+#if ABI_USES_FUNCTION_DESCRIPTORS
 #if defined(_AIX)
     ".csect .text[PR]                                   \n"
+#else
+    /* Linux linker requires the function descriptor to be provided */
+    ".section	\".opd\",\"aw\"                         \n"
+    ".align 3                                           \n"
+    ".globl PushAllRegistersAndIterateStack, hidden     \n"
+    "PushAllRegistersAndIterateStack:                   \n"
+    ".quad .PushAllRegistersAndIterateStack,.TOC.@tocbase,0 \n"
+    ".text                                              \n"
+#endif
     ".align 2                                           \n"
     ".globl .PushAllRegistersAndIterateStack, hidden    \n"
     ".PushAllRegistersAndIterateStack:                  \n"
@@ -36,7 +49,7 @@ asm(
     // At anytime, SP (r1) needs to be multiple of 16 (i.e. 16-aligned).
     "  mflr 0                                          \n"
     "  std 0, 16(1)                                    \n"
-#if defined(_AIX)
+#if ABI_USES_FUNCTION_DESCRIPTORS
     "  std 2, 40(1)                                    \n"
 #else
     "  std 2, 24(1)                                    \n"
@@ -64,7 +77,7 @@ asm(
     // Pass 2nd parameter (r4) unchanged (StackVisitor*).
     // Save 3rd parameter (r5; IterateStackCallback).
     "  mr 6, 5                                         \n"
-#if defined(_AIX)
+#if ABI_USES_FUNCTION_DESCRIPTORS
     // Set up TOC for callee.
     "  ld 2,8(5)                                       \n"
     // AIX uses function descriptors, which means that
@@ -75,7 +88,7 @@ asm(
 #endif
     // Pass 3rd parameter as sp (stack pointer).
     "  mr 5, 1                                         \n"
-#if !defined(_AIX)
+#if !ABI_USES_FUNCTION_DESCRIPTORS
     // Set up r12 to be equal to the callee address (in order for TOC
     // relocation). Only needed on LE Linux.
     "  mr 12, 6                                        \n"
@@ -88,7 +101,7 @@ asm(
     // Restore lr.
     "  ld 0, 16(1)                                     \n"
     "  mtlr  0                                         \n"
-#if defined(_AIX)
+#if ABI_USES_FUNCTION_DESCRIPTORS
     // Restore TOC pointer.
     "  ld 2, 40(1)                                     \n"
 #else
-- 
2.52.0


From 06dfa8798dd4b6d42fb323b86a1a6581d5d9af07 Mon Sep 17 00:00:00 2001
From: Marcus Comstedt <marcus@mc.pp.se>
Date: Thu, 17 Jul 2025 22:32:38 +0200
Subject: [PATCH 3/3] Define V8_TARGET_BIG_ENDIAN for linux/ppc64

--- a/deps/v8/include/v8config.h
+++ b/deps/v8/include/v8config.h
@@ -976,7 +976,7 @@ V8 shared library set USING_V8_SHARED.
 #define V8_TARGET_LITTLE_ENDIAN 1
 #endif
 #elif V8_TARGET_ARCH_PPC64
-#if V8_OS_AIX
+#if defined(__BIG_ENDIAN__) || defined(V8_OS_AIX)
 #define V8_TARGET_BIG_ENDIAN 1
 #else
 #define V8_TARGET_LITTLE_ENDIAN 1
-- 
2.52.0
