1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
/* $NetBSD: linux_machdep.h,v 1.7 2008/04/28 20:23:42 martin Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by ITOH Yasufumi.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _M68K_LINUX_MACHDEP_H
#define _M68K_LINUX_MACHDEP_H
#include <m68k/frame.h>
#include <compat/linux/common/linux_types.h>
#include <compat/linux/common/linux_signal.h>
#include <compat/linux/common/linux_siginfo.h>
/*
* Signal stack definitions for old signal interface.
*/
struct linux_sigcontext {
linux_old_sigset_t sc_mask; /* signal mask to restore */
u_int sc_sp; /* usp to restore */
u_int sc_d0;
u_int sc_d1;
u_int sc_a0;
u_int sc_a1;
u_short sc_ps; /* processor status (sr reg) */
u_int sc_pc;
/*
* The Linux sigstate (state of hardware).
*/
struct linux_sigstate {
u_short ss_format:4, /* frame # */
ss_vector:12; /* vector offset */
struct linux_fpframe {
u_int fpf_regs[2][3]; /* only fp0 and fp1 */
u_int fpf_fpcr;
u_int fpf_fpsr;
u_int fpf_fpiar;
union FPF_u1 FPF_u1;
union FPF_u2 FPF_u2;
} ss_fpstate; /* 68881/68882 state info */
union F_u ss_frame; /* original exception frame */
} sc_ss;
};
/*
* The Linux compatible signal frame
* On Linux, the sigtramp code is on the frame structure.
*/
struct linux_sigframe {
void *sf_psigtramp;
int sf_signum; /* signo for handler */
int sf_code; /* Linux stores vector offset here */
struct linux_sigcontext *sf_scp; /* context ptr for handler */
int sf_sigtramp[2];
struct linux_sigc2 {
#if LINUX__NSIG_WORDS > 1
/* This breaks backward compatibility, but Linux 2.1 has.... */
u_long c_extrasigmask[LINUX__NSIG_WORDS - 1];
#endif
struct linux_sigcontext c_sc; /* actual context */
} sf_c;
};
#define LINUX_SF_SIGTRAMP0 0xDEFC0014 /* addaw #20,sp */
#define LINUX_SF_SIGTRAMP1 (0x70004E40 | (LINUX_SYS_sigreturn << 16))
/* moveq #LINUX_SYS_sigreturn,d0; trap #0 */
/*
* Signal stack definitions for new RT signal interface.
*/
typedef struct linux_gregset {
u_int gr_regs[16]; /* d0-d7/a0-a6/usp */
u_int gr_pc;
u_int gr_sr;
} linux_gregset_t;
typedef struct linux_fpregset {
u_int fpr_fpcr;
u_int fpr_fpsr;
u_int fpr_fpiar;
u_int fpr_regs[8][3]; /* fp0-fp7 */
} linux_fpregset_t;
struct linux_mcontext {
int mc_version;
linux_gregset_t mc_gregs;
linux_fpregset_t mc_fpregs;
};
#define LINUX_MCONTEXT_VERSION 2
struct linux_ucontext {
u_long uc_flags; /* 0 */
struct linux_ucontext *uc_link; /* 0 */
linux_stack_t uc_stack;
struct linux_mcontext uc_mc;
struct linux_rt_sigstate {
struct linux_rt_fpframe {
union FPF_u1 FPF_u1;
union FPF_u2 FPF_u2;
} ss_fpstate;
unsigned int ss_unused1:16,
ss_format:4,
ss_vector:12;
union F_u ss_frame; /* original exception frame */
int ss_unused2[4];
} uc_ss;
linux_sigset_t uc_sigmask;
};
/*
* The Linux compatible RT signal frame
* On Linux, the sigtramp code is on the frame structure.
*/
struct linux_rt_sigframe {
void *sf_psigtramp;
int sf_signum;
struct linux_siginfo *sf_pinfo;
void *sf_puc;
struct linux_siginfo sf_info;
struct linux_ucontext sf_uc;
int sf_sigtramp[2];
};
#define LINUX_RT_SF_SIGTRAMP0 (0x203C0000 | (LINUX_SYS_rt_sigreturn >> 16))
#define LINUX_RT_SF_SIGTRAMP1 (0x00004E40 | (LINUX_SYS_rt_sigreturn << 16))
/* movel #LINUX_SYS_rt_sigreturn,#d0; trap #0 */
#ifdef _KERNEL
__BEGIN_DECLS
void linux_syscall_intern(struct proc *);
__END_DECLS
#endif /* !_KERNEL */
#endif /* _M68K_LINUX_MACHDEP_H */
|