Chameleon

Chameleon Svn Source Tree

Root/tags/2.3/i386/include/architecture/ppc/basic_regs.h

Source at commit 2862 created 7 years 1 month ago.
By ifabio, Tag 2.3 release, bump svn to 2.4
1/*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23/* Copyright (c) 1996 NeXT Software, Inc. All rights reserved.
24 *
25 *File:architecture/ppc/basic_regs.h
26 *Author:Doug Mitchell, NeXT Software, Inc.
27 *
28 *Basic ppc registers.
29 *
30 * HISTORY
31 * 22-May-97 Umesh Vaishampayan (umeshv@apple.com)
32 Updated to match MPCFPE32B/AD 1/97 REV. 1
33 * 29-Dec-96 Umesh Vaishampayan (umeshv@NeXT.com)
34 *Ported from m98k.
35 * 05-Nov-92 Doug Mitchell at NeXT
36 *Created.
37 */
38
39#ifndef _ARCH_PPC_BASIC_REGS_H_
40#define _ARCH_PPC_BASIC_REGS_H_
41
42#include <architecture/ppc/reg_help.h>
43#include <architecture/ppc/macro_help.h>
44
45#if !defined(__ASSEMBLER__)
46
47/*
48 * Number of General Purpose registers.
49 */
50#define PPC_NGP_REGS32
51
52/*
53 * Common half-word used in Machine State Register and in
54 * various exception frames. Defined as a macro because the compiler
55 * will align a struct to a word boundary when used inside another struct.
56 */
57#define MSR_BITS \
58unsignedee:BIT_WIDTH(15),/* external intr enable */ \
59pr:BIT_WIDTH(14),/* problem state */ \
60fp:BIT_WIDTH(13),/* floating point avail */ \
61me:BIT_WIDTH(12),/* machine check enable */ \
62fe0:BIT_WIDTH(11),/* fp exception mode 0 */ \
63se:BIT_WIDTH(10),/* single step enable */ \
64be:BIT_WIDTH(9),/* branch trace enable */ \
65fe1:BIT_WIDTH(8),/* fp exception mode 0 */ \
66rsvd1:BIT_WIDTH(7),/* reserved */ \
67ip:BIT_WIDTH(6),/* interrupt prefix */ \
68ir:BIT_WIDTH(5),/* instruction relocate */ \
69dr:BIT_WIDTH(4),/* data relocate */ \
70rsvd2:BITS_WIDTH(3,2),/* reserved */ \
71ri:BIT_WIDTH(1),/* recoverable exception */ \
72le:BIT_WIDTH(0)/* Little-endian mode */
73
74/*
75 * Machine state register.
76 * Read and written via get_msr() and set_msr() inlines, below.
77 */
78typedef struct {
79unsignedrsvd3:BITS_WIDTH(31,19),// reserved
80pow:BIT_WIDTH(18),// Power management enable
81rsvd0: BIT_WIDTH(17),// reserved
82ile: BIT_WIDTH(16);// exception little endian
83
84MSR_BITS;// see above
85} msr_t;
86
87/*
88 * Data Storage Interrupt Status Register (DSISR)
89 */
90typedef struct {
91unsigneddse:BIT_WIDTH(31);// direct-store error
92unsignedtnf:BIT_WIDTH(30);// translation not found
93unsigned:BITS_WIDTH(29,28);
94unsignedpe:BIT_WIDTH(27);// protection error
95unsigneddsr:BIT_WIDTH(26);// lwarx/stwcx to direct-store
96unsignedrw:BIT_WIDTH(25);// 1 => store, 0 => load
97unsigned:BITS_WIDTH(24,23);
98unsigneddab:BIT_WIDTH(22);// data address bkpt (601)
99unsignedssf:BIT_WIDTH(21);// seg table search failed
100unsigned:BITS_WIDTH(20,0);
101} dsisr_t;
102
103/*
104 * Instruction Storage Interrupt Status Register (really SRR1)
105 */
106typedef struct {
107unsigned:BIT_WIDTH(31);
108unsignedtnf:BIT_WIDTH(30);// translation not found
109unsigned:BIT_WIDTH(29);
110unsigneddse:BIT_WIDTH(28);// direct-store fetch error
111unsignedpe:BIT_WIDTH(27);// protection error
112unsigned:BITS_WIDTH(26,22);
113unsignedssf:BIT_WIDTH(21);// seg table search failed
114unsigned:BITS_WIDTH(20,16);
115MSR_BITS;
116} isisr_t;
117
118/*
119 * Alignment Interrupt Status Register (really DSISR)
120 * NOTE: bit numbers in field *names* are in IBM'ese (0 is MSB).
121 * FIXME: Yuck!!! Double Yuck!!!
122 */
123typedef struct {
124unsigned:BITS_WIDTH(31,20);
125unsignedds3031:BITS_WIDTH(19,18);// bits 30:31 if DS form
126unsigned:BIT_WIDTH(17);
127unsignedx2930:BITS_WIDTH(16,15); // bits 29:30 if X form
128unsignedx25:BIT_WIDTH(14); // bit 25 if X form or
129 // bit 5 if D or DS form
130unsignedx2124:BITS_WIDTH(13,10); // bits 21:24 if X form or
131 // bits 1:4 if D or DS form
132unsignedall615:BITS_WIDTH(9,0); // bits 6:15 of instr
133MSR_BITS;
134} aisr_t;
135
136/*
137 * Program Interrupt Status Register (really SRR1)
138 */
139typedef struct {
140unsigned:BITS_WIDTH(31,21);
141unsignedfpee:BIT_WIDTH(20);// floating pt enable exception
142unsignedill:BIT_WIDTH(19);// illegal instruction
143unsignedpriv:BIT_WIDTH(18);// privileged instruction
144unsignedtrap:BIT_WIDTH(17);// trap program interrupt
145unsignedsubseq:BIT_WIDTH(16);// 1 => SRR0 points to
146// subsequent instruction
147MSR_BITS;
148} pisr_t;
149
150/*
151 * Condition register. May not be useful in C, let's see...
152 */
153typedef struct {
154unsignedlt:BIT_WIDTH(31),// negative
155gt:BIT_WIDTH(30),// positive
156eq:BIT_WIDTH(29),// equal to zero
157so:BIT_WIDTH(28),// summary overflow
158fx:BIT_WIDTH(27),// floating point exception
159fex:BIT_WIDTH(26),// fp enabled exception
160vx:BIT_WIDTH(25),// fp invalid operation
161// exception
162ox:BIT_WIDTH(24),// fp overflow exception
163rsvd:BITS_WIDTH(23,0);// reserved
164} cr_t;
165
166/*
167 * Abstract values representing fe0:fe1.
168 * See get_fp_exc_mode(), below.
169 */
170typedef enum {
171FEM_IGNORE_EXCEP,// ignore exceptions
172FEM_IMPR_NONREC,// imprecise nonrecoverable
173FEM_IMPR_RECOV,// imprecise recoverable
174FEM_PRECISE
175} fp_exc_mode_t;
176
177
178/*
179 * Special purpose registers.
180 */
181
182/*
183 * Processor version register (special purpose register pvr).
184 */
185typedef struct {
186unsignedversion:BITS_WIDTH(31,16),
187revision:BITS_WIDTH(15,0);
188} pvr_t;
189
190/*
191 * Fixed point exception register (special purpose register xer)
192 */
193typedef struct {
194unsignedso:BIT_WIDTH(31),// summary overflow
195ov:BIT_WIDTH(30),// overflow
196ca:BIT_WIDTH(29),// carry
197rsvd1:BITS_WIDTH(28,7), // reserved
198byte_count:BITS_WIDTH(6,0);
199} xer_t;
200
201/*
202 * Inlines and macros to manipulate the above registers.
203 */
204
205/*
206 * Get/set machine state register.
207 */
208static __inline__ msr_t
209get_msr()
210{
211msr_t__msr_tmp;
212__asm__ volatile ("mfmsr %0 /* mfmsr */" : "=r" (__msr_tmp));
213return __msr_tmp;
214}
215
216static __inline__ void
217set_msr(msr_t msr)
218{
219__asm__ volatile ("mtmsr %0 /* mtmsr */ " : : "r" (msr));
220}
221
222/*
223 * Determine current fp_exc_mode_t given prog_mode.
224 */
225static __inline__ fp_exc_mode_t
226get_fp_exc_mode(pmr_t pmr)
227{
228if(pmr.fe0)
229return pmr.fe1 ? FEM_PRECISE : FEM_IMPR_RECOV;
230else
231return pmr.fe1 ? FEM_IMPR_NONREC : FEM_IGNORE_EXCEP;
232}
233
234/*
235 * Software definitions for special purpose registers.
236 * The same register is used as per_cpu data pointer and
237 * vector base register. This requires that the vector
238 * table be the first item in the per_cpu table.
239 */
240#define SR_EXCEPTION_TMP_LRsprg0
241#define SR_EXCEPTION_TMP_CRsprg1
242#define SR_EXCEPTION_TMP_ATsprg2
243#define SR_PER_CPU_DATAsprg3
244#define SR_VBRsprg3
245
246/*
247 * Get/set special purpose registers.
248 *
249 * GET_SPR - get SPR by name.
250 *
251 * Example usage:
252 *
253 * {
254 *xer_tsome_xer;
255 *
256 *some_xer = GET_SPR(xer_t, xer);
257 *...
258 * }
259 *
260 * This is a strange one. We're creating a list of C expressions within
261 * a set of curlies; the last expression ("__spr_tmp;") is the return value
262 * of the statement created by the curlies.
263 *
264 */
265
266#define GET_SPR(type, spr)\
267({\
268unsigned__spr_tmp;\
269__asm__ volatile ("mfspr %0, " STRINGIFY(spr) : "=r" (__spr_tmp));\
270*(type *)&__spr_tmp;\
271})
272
273/*
274 * Example usage of SET_SPR:
275 *
276 * {
277 *xer_t some_xer;
278 *
279 *...set up some_xer...
280 *SET_SPR(xer, some_xer);
281 * }
282 */
283#defineSET_SPR(spr, val)\
284MACRO_BEGIN\
285__typeof__ (val) __spr_tmp = (val);\
286__asm__ volatile ("mtspr "STRINGIFY(spr) ", %0" : : "r" (__spr_tmp));\
287MACRO_END
288
289/*
290 * Fully synchronize instruction stream.
291 */
292static __inline__ void
293ppc_sync()
294{
295__asm__ volatile ("sync /* sync */" : : );
296}
297
298#endif /* ! __ASSEMBLER__ */
299
300#endif /* _ARCH_PPC_BASIC_REGS_H_ */
301
302

Archive Download this file

Revision: 2862