From 5a5af21b14fbbacf4a1b14d75a3059db1cd5cc15 Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Thu, 29 Aug 2024 12:08:16 +0200 Subject: [PATCH] Don't use r12 to pass size to caml_call_realloc_stack The temporary r12 can be destroyed by a PLT shim. Instead, use r27 (a non-temporary register, not used at OCaml function entry). Origin: https://github.com/ocaml/ocaml/pull/13410 Gbp-Pq: Name 0011-Don-t-use-r12-to-pass-size-to-caml_call_realloc_stac.patch --- asmcomp/power/emit.mlp | 3 ++- runtime/power.S | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp index 47f5419a..70a6a0f7 100644 --- a/asmcomp/power/emit.mlp +++ b/asmcomp/power/emit.mlp @@ -996,8 +996,9 @@ let fundecl fundecl = || max_frame_size >= stack_threshold_size then begin let overflow = new_label () and ret = new_label () in (* The return address is saved in a register not used for param passing *) + (* The size is passed in a register normally not used for param passing *) `{emit_label overflow}: mflr 28\n`; - ` li 12, {emit_int (Config.stack_threshold + max_frame_size / 8)}\n`; + ` li 27, {emit_int (Config.stack_threshold + max_frame_size / 8)}\n`; emit_call "caml_call_realloc_stack"; emit_call_nop (); ` mtlr 28\n`; diff --git a/runtime/power.S b/runtime/power.S index bfb37fa9..9e5b243a 100644 --- a/runtime/power.S +++ b/runtime/power.S @@ -358,16 +358,16 @@ caml_system__code_begin: /* Reallocate the stack when it is too small. */ -/* Desired size is passed in register TMP2. */ +/* Desired size is passed in register r27. */ FUNCTION caml_call_realloc_stack /* Save return address in caller's frame. */ mflr 0 std 0, LR_SAVE(SP) /* Save all registers, as well as ALLOC_PTR and TRAP_PTR */ - SAVE_ALL_REGS /* TMP2 is preserved */ + SAVE_ALL_REGS /* r27 is preserved */ /* Recover desired size, to be passed in r3 */ - mr 3, TMP2 + mr 3, 27 /* Switch stacks and call caml_try_realloc_stack */ SWITCH_OCAML_TO_C Far_call(caml_try_realloc_stack) -- 2.30.2