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
|
/* $OpenBSD: pcb.h,v 1.4 2002/02/20 22:28:21 deraadt Exp $ */
/* $NetBSD: pcb.h,v 1.4 1995/03/28 18:19:56 jtc Exp $ */
/*
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
*
* This software was developed by the Computer Systems Engineering group
* at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
* contributed to Berkeley.
*
* All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Lawrence Berkeley Laboratory.
*
* 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
*
* @(#)pcb.h 8.1 (Berkeley) 6/11/93
*/
#ifndef _SPARC_PCB_H_
#define _SPARC_PCB_H_
#include <machine/reg.h>
#ifdef notyet
#define PCB_MAXWIN 32 /* architectural limit */
#else
#define PCB_MAXWIN 8 /* worried about u area sizes ... */
#endif
/*
* SPARC Process Control Block.
*
* pcb_uw is positive if there are any user windows that are
* are currently in the CPU windows rather than on the user
* stack. Whenever we are running in the kernel with traps
* enabled, we decrement pcb_uw for each ``push'' of a CPU
* register window into the stack, and we increment it for
* each ``pull'' from the stack into the CPU. (If traps are
* disabled, or if we are in user mode, pcb_uw is junk.)
*
* To ease computing pcb_uw on traps from user mode, we keep track
* of the log base 2 of the single bit that is set in %wim.
*
* If an overflow occurs while the associated user stack pages
* are invalid (paged out), we have to store the registers
* in a page that is locked in core while the process runs,
* i.e., right here in the pcb. We also need the stack pointer
* for the last such window (but only the last, as the others
* are in each window) and the count of windows saved. We
* cheat by having a whole window structure for that one %sp.
* Thus, to save window pcb_rw[i] to memory, we write it at
* pcb_rw[i + 1].rw_in[6].
*
* pcb_nsaved has three `kinds' of values. If 0, it means no
* registers are in the PCB (though if pcb_uw is positive,
* there may be the next time you look). If positive, it means
* there are no user registers in the CPU, but there are some
* saved in pcb_rw[]. As a special case, traps that needed
* assistance to pull user registers from the stack also store
* the registers in pcb_rw[], and set pcb_nsaved to -1. This
* special state is normally short-term: it can only last until the
* trap returns, and it can never persist across entry to user code.
*/
struct pcb {
int pcb_sp; /* sp (%o6) when switch() was called */
int pcb_pc; /* pc (%o7) when switch() was called */
int pcb_psr; /* %psr when switch() was called */
caddr_t pcb_onfault; /* for copyin/out */
int pcb_uw; /* user windows inside CPU */
int pcb_wim; /* log2(%wim) */
int pcb_nsaved; /* number of windows saved in pcb */
#ifdef notdef
int pcb_winof; /* number of window overflow traps */
int pcb_winuf; /* number of window underflow traps */
#endif
u_int32_t pcb_wcookie; /* StackGhost cookie (must be unsigned) */
/* the following MUST be aligned on a doubleword boundary */
struct rwindow pcb_rw[PCB_MAXWIN]; /* saved windows */
};
/*
* The pcb is augmented with machine-dependent additional data for
* core dumps. Note that the trapframe here is a copy of the one
* from the top of the kernel stack (included here so that the kernel
* stack itself need not be dumped).
*/
struct md_coredump {
struct trapframe md_tf;
struct fpstate md_fpstate;
u_int32_t md_wcookie;
};
#ifdef _KERNEL
extern struct pcb *cpcb;
#endif /* _KERNEL */
#endif
|