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