1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 /* 3 * Copyright (C) 2012 ARM Ltd. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 #ifndef _UAPI__ASM_SIGCONTEXT_H 18 #define _UAPI__ASM_SIGCONTEXT_H 19 20 #include <linux/types.h> 21 22 /* 23 * Signal context structure - contains all info to do with the state 24 * before the signal handler was invoked. 25 */ 26 struct sigcontext { 27 __u64 fault_address; 28 /* AArch64 registers */ 29 __u64 regs[31]; 30 __u64 sp; 31 __u64 pc; 32 __u64 pstate; 33 /* 4K reserved for FP/SIMD state and future expansion */ 34 __u8 __reserved[4096] __attribute__((__aligned__(16))); 35 }; 36 37 /* 38 * Allocation of __reserved[]: 39 * (Note: records do not necessarily occur in the order shown here.) 40 * 41 * size description 42 * 43 * 0x210 fpsimd_context 44 * 0x10 esr_context 45 * 0x20 extra_context (optional) 46 * 0x10 terminator (null _aarch64_ctx) 47 * 48 * 0xdb0 (reserved for future allocation) 49 * 50 * New records that can exceed this space need to be opt-in for userspace, so 51 * that an expanded signal frame is not generated unexpectedly. The mechanism 52 * for opting in will depend on the extension that generates each new record. 53 * The above table documents the maximum set and sizes of records than can be 54 * generated when userspace does not opt in for any such extension. 55 */ 56 57 /* 58 * Header to be used at the beginning of structures extending the user 59 * context. Such structures must be placed after the rt_sigframe on the stack 60 * and be 16-byte aligned. The last structure must be a dummy one with the 61 * magic and size set to 0. 62 */ 63 struct _aarch64_ctx { 64 __u32 magic; 65 __u32 size; 66 }; 67 68 #define FPSIMD_MAGIC 0x46508001 69 70 struct fpsimd_context { 71 struct _aarch64_ctx head; 72 __u32 fpsr; 73 __u32 fpcr; 74 __uint128_t vregs[32]; 75 }; 76 77 /* ESR_EL1 context */ 78 #define ESR_MAGIC 0x45535201 79 80 struct esr_context { 81 struct _aarch64_ctx head; 82 __u64 esr; 83 }; 84 85 /* 86 * extra_context: describes extra space in the signal frame for 87 * additional structures that don't fit in sigcontext.__reserved[]. 88 * 89 * Note: 90 * 91 * 1) fpsimd_context, esr_context and extra_context must be placed in 92 * sigcontext.__reserved[] if present. They cannot be placed in the 93 * extra space. Any other record can be placed either in the extra 94 * space or in sigcontext.__reserved[], unless otherwise specified in 95 * this file. 96 * 97 * 2) There must not be more than one extra_context. 98 * 99 * 3) If extra_context is present, it must be followed immediately in 100 * sigcontext.__reserved[] by the terminating null _aarch64_ctx. 101 * 102 * 4) The extra space to which datap points must start at the first 103 * 16-byte aligned address immediately after the terminating null 104 * _aarch64_ctx that follows the extra_context structure in 105 * __reserved[]. The extra space may overrun the end of __reserved[], 106 * as indicated by a sufficiently large value for the size field. 107 * 108 * 5) The extra space must itself be terminated with a null 109 * _aarch64_ctx. 110 */ 111 #define EXTRA_MAGIC 0x45585401 112 113 struct extra_context { 114 struct _aarch64_ctx head; 115 __u64 datap; /* 16-byte aligned pointer to extra space cast to __u64 */ 116 __u32 size; /* size in bytes of the extra space */ 117 __u32 __reserved[3]; 118 }; 119 120 #endif /* _UAPI__ASM_SIGCONTEXT_H */ 121