mcontext.h revision 1.6
11.6Sskrll/* $NetBSD: mcontext.h,v 1.6 2020/03/14 16:12:16 skrll Exp $ */ 21.1Smatt 31.1Smatt/*- 41.1Smatt * Copyright (c) 2014 The NetBSD Foundation, Inc. 51.1Smatt * All rights reserved. 61.1Smatt * 71.1Smatt * This code is derived from software contributed to The NetBSD Foundation 81.1Smatt * by Matt Thomas of 3am Software Foundry. 91.1Smatt * 101.1Smatt * Redistribution and use in source and binary forms, with or without 111.1Smatt * modification, are permitted provided that the following conditions 121.1Smatt * are met: 131.1Smatt * 1. Redistributions of source code must retain the above copyright 141.1Smatt * notice, this list of conditions and the following disclaimer. 151.1Smatt * 2. Redistributions in binary form must reproduce the above copyright 161.1Smatt * notice, this list of conditions and the following disclaimer in the 171.1Smatt * documentation and/or other materials provided with the distribution. 181.1Smatt * 191.1Smatt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 201.1Smatt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 211.1Smatt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 221.1Smatt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 231.1Smatt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 241.1Smatt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 251.1Smatt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 261.1Smatt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 271.1Smatt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 281.1Smatt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 291.1Smatt * POSSIBILITY OF SUCH DAMAGE. 301.1Smatt */ 311.1Smatt#ifndef _RISCV_MCONTEXT_H_ 321.1Smatt#define _RISCV_MCONTEXT_H_ 331.1Smatt 341.1Smatt/* 351.1Smatt */ 361.1Smatt 371.1Smatt#define _NGREG 32 /* GR1-31 */ 381.1Smatt#define _NFREG 33 /* F0-31, FCSR */ 391.1Smatt 401.1Smatt/* 411.6Sskrll * This fragment is common to <riscv/mcontext.h> and <riscv/reg.h> 421.1Smatt */ 431.1Smatt#ifndef _BSD_FPREG_T_ 441.1Smattunion __fpreg { 451.1Smatt __uint64_t u_u64; 461.1Smatt double u_d; 471.1Smatt}; 481.1Smatt#define _BSD_FPREG_T_ union __fpreg 491.1Smatt#endif 501.1Smatt 511.1Smatttypedef __uint64_t __greg_t; 521.1Smatttypedef __greg_t __gregset_t[_NGREG]; 531.1Smatttypedef __uint32_t __greg32_t; 541.1Smatttypedef __greg32_t __gregset32_t[_NGREG]; 551.1Smatttypedef _BSD_FPREG_T_ __fregset_t[_NFREG]; 561.1Smatt 571.1Smatt#define _REG_X1 0 581.1Smatt#define _REG_X2 1 591.1Smatt#define _REG_X3 2 601.1Smatt#define _REG_X4 3 611.1Smatt#define _REG_X5 4 621.1Smatt#define _REG_X6 5 631.1Smatt#define _REG_X7 6 641.1Smatt#define _REG_X8 7 651.1Smatt#define _REG_X9 8 661.1Smatt#define _REG_X10 9 671.1Smatt#define _REG_X11 10 681.1Smatt#define _REG_X12 11 691.1Smatt#define _REG_X13 12 701.1Smatt#define _REG_X14 13 711.1Smatt#define _REG_X15 14 721.1Smatt#define _REG_X16 15 731.1Smatt#define _REG_X17 16 741.1Smatt#define _REG_X18 17 751.1Smatt#define _REG_X19 18 761.1Smatt#define _REG_X20 19 771.1Smatt#define _REG_X21 20 781.1Smatt#define _REG_X22 21 791.1Smatt#define _REG_X23 22 801.1Smatt#define _REG_X24 23 811.1Smatt#define _REG_X25 24 821.1Smatt#define _REG_X26 25 831.1Smatt#define _REG_X27 26 841.1Smatt#define _REG_X28 27 851.1Smatt#define _REG_X29 28 861.1Smatt#define _REG_X30 29 871.1Smatt#define _REG_X31 30 881.1Smatt#define _REG_PC 31 891.1Smatt 901.1Smatt#define _REG_RA _REG_X1 911.3Smatt#define _REG_SP _REG_X2 921.3Smatt#define _REG_GP _REG_X3 931.3Smatt#define _REG_TP _REG_X4 941.4Smatt#define _REG_S0 _REG_X8 951.3Smatt#define _REG_RV _REG_X10 961.3Smatt#define _REG_A0 _REG_X10 971.1Smatt 981.1Smatt#define _REG_F0 0 991.1Smatt#define _REG_FPCSR 32 1001.1Smatt 1011.1Smatttypedef struct { 1021.1Smatt __gregset_t __gregs; /* General Purpose Register set */ 1031.1Smatt __fregset_t __fregs; /* Floating Point Register set */ 1041.1Smatt __greg_t __private; /* copy of l_private */ 1051.1Smatt __greg_t __spare[8]; /* future proof */ 1061.1Smatt} mcontext_t; 1071.1Smatt 1081.1Smatttypedef struct { 1091.1Smatt __gregset32_t __gregs; /* General Purpose Register set */ 1101.1Smatt __fregset_t __fregs; /* Floating Point Register set */ 1111.1Smatt __greg32_t __private; /* copy of l_private */ 1121.1Smatt __greg32_t __spare[8]; /* future proof */ 1131.1Smatt} mcontext32_t; 1141.1Smatt 1151.1Smatt/* Machine-dependent uc_flags */ 1161.1Smatt#define _UC_SETSTACK 0x00010000 /* see <sys/ucontext.h> */ 1171.1Smatt#define _UC_CLRSTACK 0x00020000 /* see <sys/ucontext.h> */ 1181.1Smatt#define _UC_TLSBASE 0x00080000 /* see <sys/ucontext.h> */ 1191.1Smatt 1201.1Smatt#define _UC_MACHINE_SP(uc) ((uc)->uc_mcontext.__gregs[_REG_SP]) 1211.5Skamil#define _UC_MACHINE_FP(uc) ((uc)->uc_mcontext.__gregs[_REG_S0]) 1221.2Sdennis#define _UC_MACHINE_PC(uc) ((uc)->uc_mcontext.__gregs[_REG_PC]) 1231.1Smatt#define _UC_MACHINE_INTRV(uc) ((uc)->uc_mcontext.__gregs[_REG_RV]) 1241.1Smatt 1251.1Smatt#define _UC_MACHINE_SET_PC(uc, pc) _UC_MACHINE_PC(uc) = (pc) 1261.1Smatt 1271.1Smatt#if defined(_RTLD_SOURCE) || defined(_LIBC_SOURCE) || defined(__LIBPTHREAD_SOURCE__) 1281.1Smatt#include <sys/tls.h> 1291.1Smatt 1301.1Smatt/* 1311.1Smatt * On RISCV, since displacements are signed 12-bit values, the TCB pointer is 1321.1Smatt * not and points to the first static entry. 1331.1Smatt */ 1341.1Smatt#define TLS_TP_OFFSET 0x0 1351.1Smatt#define TLS_DTV_OFFSET 0x800 1361.1Smatt__CTASSERT(TLS_TP_OFFSET + sizeof(struct tls_tcb) < 0x800); 1371.1Smatt 1381.1Smattstatic __inline void * 1391.1Smatt__lwp_getprivate_fast(void) 1401.1Smatt{ 1411.1Smatt void *__tp; 1421.1Smatt __asm("move %0,tp" : "=r"(__tp)); 1431.1Smatt return __tp; 1441.1Smatt} 1451.1Smatt 1461.1Smattstatic __inline void * 1471.1Smatt__lwp_gettcb_fast(void) 1481.1Smatt{ 1491.1Smatt void *__tcb; 1501.1Smatt 1511.1Smatt __asm __volatile( 1521.1Smatt "addi %[__tcb],tp,%[__offset]" 1531.1Smatt : [__tcb] "=r" (__tcb) 1541.1Smatt : [__offset] "n" (-(TLS_TP_OFFSET + sizeof(struct tls_tcb)))); 1551.1Smatt 1561.1Smatt return __tcb; 1571.1Smatt} 1581.1Smatt 1591.1Smattstatic __inline void 1601.1Smatt__lwp_settcb(void *__tcb) 1611.1Smatt{ 1621.1Smatt __asm __volatile( 1631.1Smatt "addi tp,%[__tcb],%[__offset]" 1641.1Smatt : 1651.1Smatt : [__tcb] "r" (__tcb), 1661.1Smatt [__offset] "n" (TLS_TP_OFFSET + sizeof(struct tls_tcb))); 1671.1Smatt} 1681.1Smatt#endif /* _RTLD_SOURCE || _LIBC_SOURCE || __LIBPTHREAD_SOURCE__ */ 1691.1Smatt 1701.1Smatt#endif /* !_RISCV_MCONTEXT_H_ */ 171