| 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | /* Copyright (C) 2019 ARM Limited */ |
| 3 | |
| 4 | #include <asm/unistd.h> |
| 5 | |
| 6 | .section .rodata, "a" |
| 7 | call_fmt: |
| 8 | .asciz "Calling sigreturn with fake sigframe sized:%zd at SP @%08lX\n" |
| 9 | |
| 10 | .text |
| 11 | |
| 12 | .globl fake_sigreturn |
| 13 | |
| 14 | /* fake_sigreturn x0:&sigframe, x1:sigframe_size, x2:misalign_bytes */ |
| 15 | fake_sigreturn: |
| 16 | stp x29, x30, [sp, #-16]! |
| 17 | mov x29, sp |
| 18 | |
| 19 | mov x20, x0 |
| 20 | mov x21, x1 |
| 21 | mov x22, x2 |
| 22 | |
| 23 | /* create space on the stack for fake sigframe 16 bytes-aligned */ |
| 24 | add x0, x21, x22 |
| 25 | add x0, x0, #15 |
| 26 | bic x0, x0, #15 /* round_up(sigframe_size + misalign_bytes, 16) */ |
| 27 | sub sp, sp, x0 |
| 28 | add x23, sp, x22 /* new sigframe base with misaligment if any */ |
| 29 | |
| 30 | ldr x0, =call_fmt |
| 31 | mov x1, x21 |
| 32 | mov x2, x23 |
| 33 | bl printf |
| 34 | |
| 35 | /* memcpy the provided content, while still keeping SP aligned */ |
| 36 | mov x0, x23 |
| 37 | mov x1, x20 |
| 38 | mov x2, x21 |
| 39 | bl memcpy |
| 40 | |
| 41 | /* |
| 42 | * Here saving a last minute SP to current->token acts as a marker: |
| 43 | * if we got here, we are successfully faking a sigreturn; in other |
| 44 | * words we are sure no bad fatal signal has been raised till now |
| 45 | * for unrelated reasons, so we should consider the possibly observed |
| 46 | * fatal signal like SEGV coming from Kernel restore_sigframe() and |
| 47 | * triggered as expected from our test-case. |
| 48 | * For simplicity this assumes that current field 'token' is laid out |
| 49 | * as first in struct tdescr |
| 50 | */ |
| 51 | ldr x0, current |
| 52 | str x23, [x0] |
| 53 | /* finally move SP to misaligned address...if any requested */ |
| 54 | mov sp, x23 |
| 55 | |
| 56 | mov x8, #__NR_rt_sigreturn |
| 57 | svc #0 |
| 58 | |
| 59 | /* |
| 60 | * Above sigreturn should not return...looping here leads to a timeout |
| 61 | * and ensure proper and clean test failure, instead of jumping around |
| 62 | * on a potentially corrupted stack. |
| 63 | */ |
| 64 | b . |
| 65 | |