mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-31 14:01:18 +08:00
aarch64: Add GCS support to longjmp
This implementations ensures that longjmp across different stacks works: it scans for GCS cap token and switches GCS if necessary then the target GCSPR is restored with a GCSPOPM loop once the current GCSPR is on the same GCS. This makes longjmp linear time in the number of jumped over stack frames when GCS is enabled. Reviewed-by: Carlos O'Donell <carlos@redhat.com> Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
This commit is contained in:
parent
13cbbb0cb2
commit
5ff5e7836e
@ -91,6 +91,36 @@ ENTRY (__longjmp)
|
||||
ldp d12, d13, [x0, #JB_D12<<3]
|
||||
ldp d14, d15, [x0, #JB_D14<<3]
|
||||
|
||||
/* GCS support. */
|
||||
mov x16, 1
|
||||
CHKFEAT_X16
|
||||
tbnz x16, 0, L(gcs_done)
|
||||
MRS_GCSPR (x2)
|
||||
ldr x3, [x0, #JB_GCSPR]
|
||||
mov x4, x3
|
||||
/* x2: GCSPR now. x3, x4: target GCSPR. x5, x6: tmp regs. */
|
||||
L(gcs_scan):
|
||||
cmp x2, x4
|
||||
b.eq L(gcs_pop)
|
||||
sub x4, x4, 8
|
||||
/* Check for a cap token. */
|
||||
ldr x5, [x4]
|
||||
and x6, x4, 0xfffffffffffff000
|
||||
orr x6, x6, 1
|
||||
cmp x5, x6
|
||||
b.ne L(gcs_scan)
|
||||
L(gcs_switch):
|
||||
add x2, x4, 8
|
||||
GCSSS1 (x4)
|
||||
GCSSS2 (xzr)
|
||||
L(gcs_pop):
|
||||
cmp x2, x3
|
||||
b.eq L(gcs_done)
|
||||
GCSPOPM (xzr)
|
||||
add x2, x2, 8
|
||||
b L(gcs_pop)
|
||||
L(gcs_done):
|
||||
|
||||
/* Originally this was implemented with a series of
|
||||
.cfi_restore() directives.
|
||||
|
||||
|
@ -57,6 +57,16 @@ ENTRY (__sigsetjmp)
|
||||
stp d10, d11, [x0, #JB_D10<<3]
|
||||
stp d12, d13, [x0, #JB_D12<<3]
|
||||
stp d14, d15, [x0, #JB_D14<<3]
|
||||
|
||||
/* GCS support. */
|
||||
mov x16, 1
|
||||
CHKFEAT_X16
|
||||
tbnz x16, 0, L(gcs_done)
|
||||
MRS_GCSPR (x2)
|
||||
add x2, x2, 8 /* GCS state right after setjmp returns. */
|
||||
str x2, [x0, #JB_GCSPR]
|
||||
L(gcs_done):
|
||||
|
||||
#ifdef PTR_MANGLE
|
||||
mov x4, sp
|
||||
PTR_MANGLE (5, 4, 3, 2)
|
||||
|
Loading…
x
Reference in New Issue
Block a user