From c4ac0953c151dfca6716332247f6aa716ed17b62 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Tue, 1 Dec 2020 18:47:38 +0100
Subject: [PATCH] ppc: Save registers below stack pointer, without modifying
 it.

---
 ChangeLog                     |  6 ++++--
 powerpc64/p7/chacha-4core.asm | 21 +++++++++++----------
 2 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index b0e9e199..1f2e2d40 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,9 @@
 2020-12-01  Niels Möller  <nisse@lysator.liu.se>
 
-	* powerpc64/p7/chacha-4core.asm (QR): Instruction level
-	interleaving in the main loop, written by Torbjörn Granlund.
+	* powerpc64/p7/chacha-4core.asm: Use protected zone below stack
+	pointer to save registers, without modifying the stack pointer.
+	(QR): Instruction level interleaving in the main loop, written by
+	Torbjörn Granlund.
 
 2020-11-30  Niels Möller  <nisse@lysator.liu.se>
 
diff --git a/powerpc64/p7/chacha-4core.asm b/powerpc64/p7/chacha-4core.asm
index 0cd5c877..b2330247 100644
--- a/powerpc64/p7/chacha-4core.asm
+++ b/powerpc64/p7/chacha-4core.asm
@@ -132,11 +132,13 @@ PROLOGUE(_nettle_chacha_4core)
 	li	r7, 0x20	C ...useful...
 	li	r8, 0x30	C ...offsets
 
-	addi	SP, SP, -0x40	C Save callee-save registers
-	stvx	v20, 0, SP
-	stvx	v21, r6, SP
-	stvx	v22, r7, SP
-	stvx	v23, r8, SP
+	C Save callee-save registers. Use the "protected zone", max
+	C 228 bytes, below the stack pointer, accessed via r10.
+	addi	r10, SP, -0x40
+	stvx	v20, 0, r10
+	stvx	v21, r6, r10
+	stvx	v22, r7, r10
+	stvx	v23, r8, r10
 
 	vspltisw ROT16, -16	C -16 instead of 16 actually works!
 	vspltisw ROT12, 12
@@ -257,11 +259,10 @@ IF_BE(`
 	stxvw4x	VSR(v15), r8, DST
 
 	C Restore callee-save registers
-	lvx	v20, 0, SP
-	lvx	v21, r6, SP
-	lvx	v22, r7, SP
-	lvx	v23, r8, SP
-	addi	SP, SP, 0x40
+	lvx	v20, 0, r10
+	lvx	v21, r6, r10
+	lvx	v22, r7, r10
+	lvx	v23, r8, r10
 
 	blr
 EPILOGUE(_nettle_chacha_4core)
-- 
GitLab