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