aboutsummaryrefslogtreecommitdiff
blob: 48b8a09629d2f54cf3158fad1497bd032f1b1b27 (plain)
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
/* Copyright (C) 1997-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library.  If not, see
   <http://www.gnu.org/licenses/>.  */

/* System V/m68k ABI compliant context switching support.  */

#ifndef _SYS_UCONTEXT_H
#define _SYS_UCONTEXT_H	1

#include <features.h>

#include <bits/types/sigset_t.h>
#include <bits/types/stack_t.h>


/* Type for general register.  */
typedef int greg_t;

/* Number of general registers.  */
#define __NGREG	18
#ifdef __USE_MISC
# define NGREG	__NGREG
#endif

/* Container for all general registers.  */
typedef greg_t gregset_t[__NGREG];

#ifdef __USE_MISC
/* Number of each register is the `gregset_t' array.  */
enum
{
  R_D0 = 0,
# define R_D0	R_D0
  R_D1 = 1,
# define R_D1	R_D1
  R_D2 = 2,
# define R_D2	R_D2
  R_D3 = 3,
# define R_D3	R_D3
  R_D4 = 4,
# define R_D4	R_D4
  R_D5 = 5,
# define R_D5	R_D5
  R_D6 = 6,
# define R_D6	R_D6
  R_D7 = 7,
# define R_D7	R_D7
  R_A0 = 8,
# define R_A0	R_A0
  R_A1 = 9,
# define R_A1	R_A1
  R_A2 = 10,
# define R_A2	R_A2
  R_A3 = 11,
# define R_A3	R_A3
  R_A4 = 12,
# define R_A4	R_A4
  R_A5 = 13,
# define R_A5	R_A5
  R_A6 = 14,
# define R_A6	R_A6
  R_A7 = 15,
# define R_A7	R_A7
  R_SP = 15,
# define R_SP	R_SP
  R_PC = 16,
# define R_PC	R_PC
  R_PS = 17
# define R_PS	R_PS
};
#endif

#ifdef __USE_MISC
# define __ctx(fld) fld
#else
# define __ctx(fld) __ ## fld
#endif

/* Structure to describe FPU registers.  */
typedef struct
{
  int __ctx(f_pcr);
  int __ctx(f_psr);
  int __ctx(f_fpiaddr);
#ifdef __mcoldfire__
  int __ctx(f_fpregs)[8][2];
#else
  int __ctx(f_fpregs)[8][3];
#endif
} fpregset_t;

/* Context to describe whole processor state.  */
typedef struct
{
  int __ctx(version);
  gregset_t __ctx(gregs);
  fpregset_t __ctx(fpregs);
} mcontext_t;

#ifdef __USE_MISC
# define MCONTEXT_VERSION 2
#endif

/* Userlevel context.  */
typedef struct ucontext_t
{
  unsigned long __ctx(uc_flags);
  struct ucontext_t *uc_link;
  stack_t uc_stack;
  mcontext_t uc_mcontext;
  unsigned long __glibc_reserved1[80];
  sigset_t uc_sigmask;
} ucontext_t;

#undef __ctx

#endif /* sys/ucontext.h */