1*053f45beSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ 2*053f45beSAndroid Build Coastguard Worker #ifndef _RSEQ_ABI_H 3*053f45beSAndroid Build Coastguard Worker #define _RSEQ_ABI_H 4*053f45beSAndroid Build Coastguard Worker 5*053f45beSAndroid Build Coastguard Worker /* 6*053f45beSAndroid Build Coastguard Worker * rseq-abi.h 7*053f45beSAndroid Build Coastguard Worker * 8*053f45beSAndroid Build Coastguard Worker * Restartable sequences system call API 9*053f45beSAndroid Build Coastguard Worker * 10*053f45beSAndroid Build Coastguard Worker * Copyright (c) 2015-2022 Mathieu Desnoyers <[email protected]> 11*053f45beSAndroid Build Coastguard Worker */ 12*053f45beSAndroid Build Coastguard Worker 13*053f45beSAndroid Build Coastguard Worker #include <linux/types.h> 14*053f45beSAndroid Build Coastguard Worker #include <asm/byteorder.h> 15*053f45beSAndroid Build Coastguard Worker 16*053f45beSAndroid Build Coastguard Worker enum rseq_abi_cpu_id_state { 17*053f45beSAndroid Build Coastguard Worker RSEQ_ABI_CPU_ID_UNINITIALIZED = -1, 18*053f45beSAndroid Build Coastguard Worker RSEQ_ABI_CPU_ID_REGISTRATION_FAILED = -2, 19*053f45beSAndroid Build Coastguard Worker }; 20*053f45beSAndroid Build Coastguard Worker 21*053f45beSAndroid Build Coastguard Worker enum rseq_abi_flags { 22*053f45beSAndroid Build Coastguard Worker RSEQ_ABI_FLAG_UNREGISTER = (1 << 0), 23*053f45beSAndroid Build Coastguard Worker }; 24*053f45beSAndroid Build Coastguard Worker 25*053f45beSAndroid Build Coastguard Worker enum rseq_abi_cs_flags_bit { 26*053f45beSAndroid Build Coastguard Worker RSEQ_ABI_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT = 0, 27*053f45beSAndroid Build Coastguard Worker RSEQ_ABI_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT = 1, 28*053f45beSAndroid Build Coastguard Worker RSEQ_ABI_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT = 2, 29*053f45beSAndroid Build Coastguard Worker }; 30*053f45beSAndroid Build Coastguard Worker 31*053f45beSAndroid Build Coastguard Worker enum rseq_abi_cs_flags { 32*053f45beSAndroid Build Coastguard Worker RSEQ_ABI_CS_FLAG_NO_RESTART_ON_PREEMPT = 33*053f45beSAndroid Build Coastguard Worker (1U << RSEQ_ABI_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT), 34*053f45beSAndroid Build Coastguard Worker RSEQ_ABI_CS_FLAG_NO_RESTART_ON_SIGNAL = 35*053f45beSAndroid Build Coastguard Worker (1U << RSEQ_ABI_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT), 36*053f45beSAndroid Build Coastguard Worker RSEQ_ABI_CS_FLAG_NO_RESTART_ON_MIGRATE = 37*053f45beSAndroid Build Coastguard Worker (1U << RSEQ_ABI_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT), 38*053f45beSAndroid Build Coastguard Worker }; 39*053f45beSAndroid Build Coastguard Worker 40*053f45beSAndroid Build Coastguard Worker /* 41*053f45beSAndroid Build Coastguard Worker * struct rseq_abi_cs is aligned on 4 * 8 bytes to ensure it is always 42*053f45beSAndroid Build Coastguard Worker * contained within a single cache-line. It is usually declared as 43*053f45beSAndroid Build Coastguard Worker * link-time constant data. 44*053f45beSAndroid Build Coastguard Worker */ 45*053f45beSAndroid Build Coastguard Worker struct rseq_abi_cs { 46*053f45beSAndroid Build Coastguard Worker /* Version of this structure. */ 47*053f45beSAndroid Build Coastguard Worker __u32 version; 48*053f45beSAndroid Build Coastguard Worker /* enum rseq_abi_cs_flags */ 49*053f45beSAndroid Build Coastguard Worker __u32 flags; 50*053f45beSAndroid Build Coastguard Worker __u64 start_ip; 51*053f45beSAndroid Build Coastguard Worker /* Offset from start_ip. */ 52*053f45beSAndroid Build Coastguard Worker __u64 post_commit_offset; 53*053f45beSAndroid Build Coastguard Worker __u64 abort_ip; 54*053f45beSAndroid Build Coastguard Worker } __attribute__((aligned(4 * sizeof(__u64)))); 55*053f45beSAndroid Build Coastguard Worker 56*053f45beSAndroid Build Coastguard Worker /* 57*053f45beSAndroid Build Coastguard Worker * struct rseq_abi is aligned on 4 * 8 bytes to ensure it is always 58*053f45beSAndroid Build Coastguard Worker * contained within a single cache-line. 59*053f45beSAndroid Build Coastguard Worker * 60*053f45beSAndroid Build Coastguard Worker * A single struct rseq_abi per thread is allowed. 61*053f45beSAndroid Build Coastguard Worker */ 62*053f45beSAndroid Build Coastguard Worker struct rseq_abi { 63*053f45beSAndroid Build Coastguard Worker /* 64*053f45beSAndroid Build Coastguard Worker * Restartable sequences cpu_id_start field. Updated by the 65*053f45beSAndroid Build Coastguard Worker * kernel. Read by user-space with single-copy atomicity 66*053f45beSAndroid Build Coastguard Worker * semantics. This field should only be read by the thread which 67*053f45beSAndroid Build Coastguard Worker * registered this data structure. Aligned on 32-bit. Always 68*053f45beSAndroid Build Coastguard Worker * contains a value in the range of possible CPUs, although the 69*053f45beSAndroid Build Coastguard Worker * value may not be the actual current CPU (e.g. if rseq is not 70*053f45beSAndroid Build Coastguard Worker * initialized). This CPU number value should always be compared 71*053f45beSAndroid Build Coastguard Worker * against the value of the cpu_id field before performing a rseq 72*053f45beSAndroid Build Coastguard Worker * commit or returning a value read from a data structure indexed 73*053f45beSAndroid Build Coastguard Worker * using the cpu_id_start value. 74*053f45beSAndroid Build Coastguard Worker */ 75*053f45beSAndroid Build Coastguard Worker __u32 cpu_id_start; 76*053f45beSAndroid Build Coastguard Worker /* 77*053f45beSAndroid Build Coastguard Worker * Restartable sequences cpu_id field. Updated by the kernel. 78*053f45beSAndroid Build Coastguard Worker * Read by user-space with single-copy atomicity semantics. This 79*053f45beSAndroid Build Coastguard Worker * field should only be read by the thread which registered this 80*053f45beSAndroid Build Coastguard Worker * data structure. Aligned on 32-bit. Values 81*053f45beSAndroid Build Coastguard Worker * RSEQ_CPU_ID_UNINITIALIZED and RSEQ_CPU_ID_REGISTRATION_FAILED 82*053f45beSAndroid Build Coastguard Worker * have a special semantic: the former means "rseq uninitialized", 83*053f45beSAndroid Build Coastguard Worker * and latter means "rseq initialization failed". This value is 84*053f45beSAndroid Build Coastguard Worker * meant to be read within rseq critical sections and compared 85*053f45beSAndroid Build Coastguard Worker * with the cpu_id_start value previously read, before performing 86*053f45beSAndroid Build Coastguard Worker * the commit instruction, or read and compared with the 87*053f45beSAndroid Build Coastguard Worker * cpu_id_start value before returning a value loaded from a data 88*053f45beSAndroid Build Coastguard Worker * structure indexed using the cpu_id_start value. 89*053f45beSAndroid Build Coastguard Worker */ 90*053f45beSAndroid Build Coastguard Worker __u32 cpu_id; 91*053f45beSAndroid Build Coastguard Worker /* 92*053f45beSAndroid Build Coastguard Worker * Restartable sequences rseq_cs field. 93*053f45beSAndroid Build Coastguard Worker * 94*053f45beSAndroid Build Coastguard Worker * Contains NULL when no critical section is active for the current 95*053f45beSAndroid Build Coastguard Worker * thread, or holds a pointer to the currently active struct rseq_cs. 96*053f45beSAndroid Build Coastguard Worker * 97*053f45beSAndroid Build Coastguard Worker * Updated by user-space, which sets the address of the currently 98*053f45beSAndroid Build Coastguard Worker * active rseq_cs at the beginning of assembly instruction sequence 99*053f45beSAndroid Build Coastguard Worker * block, and set to NULL by the kernel when it restarts an assembly 100*053f45beSAndroid Build Coastguard Worker * instruction sequence block, as well as when the kernel detects that 101*053f45beSAndroid Build Coastguard Worker * it is preempting or delivering a signal outside of the range 102*053f45beSAndroid Build Coastguard Worker * targeted by the rseq_cs. Also needs to be set to NULL by user-space 103*053f45beSAndroid Build Coastguard Worker * before reclaiming memory that contains the targeted struct rseq_cs. 104*053f45beSAndroid Build Coastguard Worker * 105*053f45beSAndroid Build Coastguard Worker * Read and set by the kernel. Set by user-space with single-copy 106*053f45beSAndroid Build Coastguard Worker * atomicity semantics. This field should only be updated by the 107*053f45beSAndroid Build Coastguard Worker * thread which registered this data structure. Aligned on 64-bit. 108*053f45beSAndroid Build Coastguard Worker */ 109*053f45beSAndroid Build Coastguard Worker union { 110*053f45beSAndroid Build Coastguard Worker __u64 ptr64; 111*053f45beSAndroid Build Coastguard Worker 112*053f45beSAndroid Build Coastguard Worker /* 113*053f45beSAndroid Build Coastguard Worker * The "arch" field provides architecture accessor for 114*053f45beSAndroid Build Coastguard Worker * the ptr field based on architecture pointer size and 115*053f45beSAndroid Build Coastguard Worker * endianness. 116*053f45beSAndroid Build Coastguard Worker */ 117*053f45beSAndroid Build Coastguard Worker struct { 118*053f45beSAndroid Build Coastguard Worker #ifdef __LP64__ 119*053f45beSAndroid Build Coastguard Worker __u64 ptr; 120*053f45beSAndroid Build Coastguard Worker #elif defined(__BYTE_ORDER) ? (__BYTE_ORDER == __BIG_ENDIAN) : defined(__BIG_ENDIAN) 121*053f45beSAndroid Build Coastguard Worker __u32 padding; /* Initialized to zero. */ 122*053f45beSAndroid Build Coastguard Worker __u32 ptr; 123*053f45beSAndroid Build Coastguard Worker #else 124*053f45beSAndroid Build Coastguard Worker __u32 ptr; 125*053f45beSAndroid Build Coastguard Worker __u32 padding; /* Initialized to zero. */ 126*053f45beSAndroid Build Coastguard Worker #endif 127*053f45beSAndroid Build Coastguard Worker } arch; 128*053f45beSAndroid Build Coastguard Worker } rseq_cs; 129*053f45beSAndroid Build Coastguard Worker 130*053f45beSAndroid Build Coastguard Worker /* 131*053f45beSAndroid Build Coastguard Worker * Restartable sequences flags field. 132*053f45beSAndroid Build Coastguard Worker * 133*053f45beSAndroid Build Coastguard Worker * This field should only be updated by the thread which 134*053f45beSAndroid Build Coastguard Worker * registered this data structure. Read by the kernel. 135*053f45beSAndroid Build Coastguard Worker * Mainly used for single-stepping through rseq critical sections 136*053f45beSAndroid Build Coastguard Worker * with debuggers. 137*053f45beSAndroid Build Coastguard Worker * 138*053f45beSAndroid Build Coastguard Worker * - RSEQ_ABI_CS_FLAG_NO_RESTART_ON_PREEMPT 139*053f45beSAndroid Build Coastguard Worker * Inhibit instruction sequence block restart on preemption 140*053f45beSAndroid Build Coastguard Worker * for this thread. 141*053f45beSAndroid Build Coastguard Worker * - RSEQ_ABI_CS_FLAG_NO_RESTART_ON_SIGNAL 142*053f45beSAndroid Build Coastguard Worker * Inhibit instruction sequence block restart on signal 143*053f45beSAndroid Build Coastguard Worker * delivery for this thread. 144*053f45beSAndroid Build Coastguard Worker * - RSEQ_ABI_CS_FLAG_NO_RESTART_ON_MIGRATE 145*053f45beSAndroid Build Coastguard Worker * Inhibit instruction sequence block restart on migration for 146*053f45beSAndroid Build Coastguard Worker * this thread. 147*053f45beSAndroid Build Coastguard Worker */ 148*053f45beSAndroid Build Coastguard Worker __u32 flags; 149*053f45beSAndroid Build Coastguard Worker } __attribute__((aligned(4 * sizeof(__u64)))); 150*053f45beSAndroid Build Coastguard Worker 151*053f45beSAndroid Build Coastguard Worker #endif /* _RSEQ_ABI_H */ 152