aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/include/generic-netbsd/powerpc/psl.h
blob: 0458d55705ed88c47d837380c6d23dcc49274908 (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
131
/*	$NetBSD: psl.h,v 1.22 2021/03/06 08:08:19 rin Exp $	*/

/*
 * Copyright (C) 1995, 1996 Wolfgang Solfrank.
 * Copyright (C) 1995, 1996 TooLs GmbH.
 * All rights reserved.
 *
 * 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 TooLs GmbH.
 * 4. The name of TooLs GmbH may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``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 TOOLS GMBH 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	_POWERPC_PSL_H_
#define	_POWERPC_PSL_H_

/*
 * Machine State Register (MSR)
 *
 * The PowerPC 601 does not implement the following bits:
 *
 *	VEC, POW, ILE, BE, RI, LE[*]
 *
 * [*] Little-endian mode on the 601 is implemented in the HID0 register.
 */
#define	PSL_VEC		0x02000000	/* ..6. AltiVec vector unit available */
#define	PSL_SPV		0x02000000	/* B... (e500) SPE enable */
#define	PSL_UCLE	0x00400000	/* B... user-mode cache lock enable */
#define	PSL_POW		0x00040000	/* ..6. power management */
#define	PSL_WE		PSL_POW		/* B4.. wait state enable */
#define	PSL_TGPR	0x00020000	/* ..6. temp. gpr remapping (mpc603e) */
#define	PSL_CE		PSL_TGPR	/* B4.. critical interrupt enable */
#define	PSL_ILE		0x00010000	/* ..6. interrupt endian mode (1 == le) */
#define	PSL_EE		0x00008000	/* B468 external interrupt enable */
#define	PSL_PR		0x00004000	/* B468 privilege mode (1 == user) */
#define	PSL_FP		0x00002000	/* B.6. floating point enable */
#define	PSL_ME		0x00001000	/* B468 machine check enable */
#define	PSL_FE0		0x00000800	/* B.6. floating point mode 0 */
#define	PSL_SE		0x00000400	/* ..6. single-step trace enable */
#define	PSL_DWE		PSL_SE		/* .4.. debug wait enable */
#define	PSL_UBLE	PSL_SE		/* B... user BTB lock enable */
#define	PSL_BE		0x00000200	/* ..6. branch trace enable */
#define	PSL_DE		PSL_BE		/* B4.. debug interrupt enable */
#define	PSL_FE1		0x00000100	/* B.6. floating point mode 1 */
#define	PSL_IP		0x00000040	/* ..6. interrupt prefix */
#define	PSL_IR		0x00000020	/* .468 instruction address relocation */
#define	PSL_IS		PSL_IR		/* B... instruction address space */
#define	PSL_DR		0x00000010	/* .468 data address relocation */
#define	PSL_DS		PSL_DR		/* B... data address space */
#define	PSL_PM		0x00000008	/* ..6. Performance monitor */
#define	PSL_PMM		PSL_PM		/* B... Performance monitor */
#define	PSL_RI		0x00000002	/* ..6. recoverable interrupt */
#define	PSL_LE		0x00000001	/* ..6. endian mode (1 == le) */

#define	PSL_601_MASK	~(PSL_VEC|PSL_POW|PSL_ILE|PSL_BE|PSL_RI|PSL_LE)

/* The IBM 970 series does not implemnt LE mode */
#define PSL_970_MASK	~(PSL_ILE|PSL_LE)

/*
 * Floating-point exception modes:
 */
#define	PSL_FE_DIS	0		/* none */
#define	PSL_FE_NONREC	PSL_FE1		/* imprecise non-recoverable */
#define	PSL_FE_REC	PSL_FE0		/* imprecise recoverable */
#define	PSL_FE_PREC	(PSL_FE0 | PSL_FE1) /* precise */
#define	PSL_FE_DFLT	PSL_FE_DIS	/* default == none */

/*
 * Note that PSL_POW and PSL_ILE are not in the saved copy of the MSR
 */
#define	PSL_MBO		0
#define	PSL_MBZ		0

/*
 * A user is not allowed to change any MSR bits except the following:
 * We restrict the test to the low 16 bits of the MSR since those are the
 * only ones preserved in the trap.  Note that this means PSL_VEC needs to
 * be restored to SRR1 in userret.
 */
#if defined(_KERNEL) && !defined(_LOCORE)
#ifdef _KERNEL_OPT
#include "opt_ppcarch.h"
#endif /* _KERNEL_OPT */

#if defined(PPC_OEA) || defined (PPC_OEA64_BRIDGE) || defined (PPC_OEA64) \
    || defined(_MODULE)
extern register_t cpu_psluserset, cpu_pslusermod, cpu_pslusermask;

#define	PSL_USERSET		cpu_psluserset
#define	PSL_USERMOD		cpu_pslusermod
#define	PSL_USERMASK		cpu_pslusermask
#elif defined(PPC_BOOKE)
#define	PSL_USERSET		(PSL_EE | PSL_PR | PSL_IS | PSL_DS | PSL_ME | PSL_CE)
#define	PSL_USERMASK		(PSL_SPV | PSL_CE | 0xFFFF)
#define	PSL_USERMOD		(0)
#else /* PPC_IBM4XX */
#ifdef PPC_IBM403
#define	PSL_USERSET		(PSL_EE | PSL_PR | PSL_IR | PSL_DR | PSL_ME)
#else /* Apparently we get unexplained machine checks, so disable them. */
#define	PSL_USERSET		(PSL_EE | PSL_PR | PSL_IR | PSL_DR)
#endif
#define	PSL_USERMASK		0xFFFF
#define	PSL_USERMOD		(0)
#endif

#define	PSL_USERSRR1		((PSL_USERSET|PSL_USERMOD) & PSL_USERMASK)
#define	PSL_USEROK_P(psl)	(((psl) & ~PSL_USERMOD) == PSL_USERSET)
#endif /* !_LOCORE */

#endif	/* _POWERPC_PSL_H_ */