aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSachin Monga <smonga@linux.ibm.com>2024-11-20 16:50:00 -0500
committerPeter Bergner <bergner@linux.ibm.com>2024-11-20 16:50:34 -0500
commit3051f3495cad507afebe2f654d32b51629554e3e (patch)
treef1e43cba5a37cb6f22cbc167a4df585bdaf07e7e
parentc0365d3791666c67ad410007efb52fc9b16d4287 (diff)
downloadglibc-3051f3495cad507afebe2f654d32b51629554e3e.zip
glibc-3051f3495cad507afebe2f654d32b51629554e3e.tar.gz
glibc-3051f3495cad507afebe2f654d32b51629554e3e.tar.bz2
powerpc64le: _init/_fini file changes for ROPHEADmaster
The ROP instructions were added in ISA 3.1 (ie, Power10), however they were defined so that if executed on older cpus, they would behave as nops. This allows us to emit them on older cpus and they'd just be ignored, but if run on a Power10, then the binary would be ROP protected. Hash instructions use negative offsets so the default position of ROP pointer is FRAME_ROP_SAVE from caller's SP. Modified FRAME_MIN_SIZE_PARM to 112 for ELFv2 to reserve additional 16 bytes for ROP save slot and padding. Signed-off-by: Sachin Monga <smonga@linux.ibm.com> Reviewed-by: Peter Bergner <bergner@linux.ibm.com>
-rw-r--r--sysdeps/powerpc/powerpc64/crti.S6
-rw-r--r--sysdeps/powerpc/powerpc64/crtn.S6
-rw-r--r--sysdeps/powerpc/powerpc64/sysdep.h3
3 files changed, 14 insertions, 1 deletions
diff --git a/sysdeps/powerpc/powerpc64/crti.S b/sysdeps/powerpc/powerpc64/crti.S
index 71bdddf..e977bc4 100644
--- a/sysdeps/powerpc/powerpc64/crti.S
+++ b/sysdeps/powerpc/powerpc64/crti.S
@@ -68,6 +68,9 @@ BODY_LABEL (_init):
LOCALENTRY(_init)
mflr 0
std 0, FRAME_LR_SAVE(r1)
+#ifdef __ROP_PROTECT__
+ hashst 0, FRAME_ROP_SAVE(r1)
+#endif
stdu r1, -FRAME_MIN_SIZE_PARM(r1)
#if PREINIT_FUNCTION_WEAK
addis r9, r2, .LC0@toc@ha
@@ -87,4 +90,7 @@ BODY_LABEL (_fini):
LOCALENTRY(_fini)
mflr 0
std 0, FRAME_LR_SAVE(r1)
+#ifdef __ROP_PROTECT__
+ hashst 0, FRAME_ROP_SAVE(r1)
+#endif
stdu r1, -FRAME_MIN_SIZE_PARM(r1)
diff --git a/sysdeps/powerpc/powerpc64/crtn.S b/sysdeps/powerpc/powerpc64/crtn.S
index 4e91231..a37e159 100644
--- a/sysdeps/powerpc/powerpc64/crtn.S
+++ b/sysdeps/powerpc/powerpc64/crtn.S
@@ -42,10 +42,16 @@
addi r1, r1, FRAME_MIN_SIZE_PARM
ld r0, FRAME_LR_SAVE(r1)
mtlr r0
+#ifdef __ROP_PROTECT__
+ hashchk 0, FRAME_ROP_SAVE(r1)
+#endif
blr
.section .fini,"ax",@progbits
addi r1, r1, FRAME_MIN_SIZE_PARM
ld r0, FRAME_LR_SAVE(r1)
mtlr r0
+#ifdef __ROP_PROTECT__
+ hashchk 0, FRAME_ROP_SAVE(r1)
+#endif
blr
diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h
index c439b06..b5c70e5 100644
--- a/sysdeps/powerpc/powerpc64/sysdep.h
+++ b/sysdeps/powerpc/powerpc64/sysdep.h
@@ -31,8 +31,9 @@
#define FRAME_TOC_SAVE 40
#define FRAME_PARM_SAVE 48
#else
+#define FRAME_ROP_SAVE -8
#define FRAME_MIN_SIZE 32
-#define FRAME_MIN_SIZE_PARM 96
+#define FRAME_MIN_SIZE_PARM 112 /* Includes space for the ROP save slot */
#define FRAME_TOC_SAVE 24
#define FRAME_PARM_SAVE 32
#endif