mcontext.h revision 1.10
1/*	$NetBSD: mcontext.h,v 1.10 2018/02/15 15:53:56 kamil Exp $	*/
2
3/*-
4 * Copyright (c) 2001 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Klaus Klein.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifndef _M68K_MCONTEXT_H_
33#define _M68K_MCONTEXT_H_
34
35#ifdef _KERNEL
36#include <m68k/cpuframe.h>
37#endif
38
39/*
40 * mcontext extensions to handle signal delivery.
41 */
42#define _UC_SETSTACK	0x00010000
43#define _UC_CLRSTACK	0x00020000
44
45/*
46 * General register state
47 */
48#define	_NGREG		18
49typedef int		__greg_t;
50typedef	__greg_t	__gregset_t[_NGREG];
51
52#define	_REG_D0	0
53#define	_REG_D1	1
54#define	_REG_D2	2
55#define	_REG_D3	3
56#define	_REG_D4	4
57#define	_REG_D5	5
58#define	_REG_D6	6
59#define	_REG_D7	7
60#define	_REG_A0	8
61#define	_REG_A1	9
62#define	_REG_A2	10
63#define	_REG_A3	11
64#define	_REG_A4	12
65#define	_REG_A5	13
66#define	_REG_A6	14
67#define	_REG_A7	15
68#define	_REG_PC	16
69#define	_REG_PS	17
70
71typedef struct {
72	int	__fp_pcr;
73	int	__fp_psr;
74	int	__fp_piaddr;
75	int	__fp_fpregs[8*3];
76} __fpregset_t;
77
78typedef struct {
79	__gregset_t	__gregs;	/* General Register set */
80	__fpregset_t	__fpregs;	/* Floating Point Register set */
81	union {
82		long	__mc_state[201];	/* Only need 308 bytes... */
83#if defined(_KERNEL) || defined(__M68K_MCONTEXT_PRIVATE)
84		struct {
85			/* Rest of the frame. */
86			unsigned int	__mcf_format;
87			unsigned int	__mcf_vector;
88			union F_u	__mcf_exframe;
89			/* Rest of the FPU frame. */
90			union FPF_u1	__mcf_fpf_u1;
91			union FPF_u2	__mcf_fpf_u2;
92		} __mc_frame;
93#endif /* _KERNEL || __M68K_MCONTEXT_PRIVATE */
94	}		__mc_pad;
95	__greg_t	_mc_tlsbase;
96} mcontext_t;
97
98/* Note: no additional padding is to be performed in ucontext_t. */
99
100/* Machine-specific uc_flags value */
101#define _UC_M68K_UC_USER 0x40000000
102#define	_UC_TLSBASE	0x00080000
103
104#define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_A7])
105#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_A6])
106#define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
107#define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_D0])
108
109#define	_UC_MACHINE_SET_PC(uc, pc)	_UC_MACHINE_PC(uc) = (pc)
110
111#define	__UCONTEXT_SIZE	1024
112
113#if defined(_LIBC_SOURCE) || defined(_RTLD_SOURCE) || defined(__LIBPTHREAD_SOURCE__)
114#define	TLS_TP_OFFSET	0x7000
115#define	TLS_DTV_OFFSET	0x8000
116
117#include <sys/tls.h>
118
119__CTASSERT(TLS_TP_OFFSET + sizeof(struct tls_tcb) < 0x8000);
120__CTASSERT(TLS_TP_OFFSET % sizeof(struct tls_tcb) == 0);
121
122void *_lwp_getprivate(void);
123void _lwp_setprivate(void *);
124
125static __inline struct tls_tcb *
126__lwp_gettcb_fast(void)
127{
128	unsigned int __tcb = (unsigned int)_lwp_getprivate();
129	return (void *)(__tcb - TLS_TP_OFFSET - sizeof(struct tls_tcb));
130}
131
132static inline void
133__lwp_settcb(struct tls_tcb *__tcb)
134{
135	__tcb += TLS_TP_OFFSET / sizeof(*__tcb) + 1;
136	_lwp_setprivate(__tcb);
137}
138#endif
139
140#endif	/* !_M68K_MCONTEXT_H_ */
141