summaryrefslogtreecommitdiff
path: root/usr/src/uts/sparc/sys/simulate.h
blob: c2ce9377b4640cbe5a47e234fb84befa42746383 (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
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
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_SIMULATE_H
#define	_SYS_SIMULATE_H

#ifdef __cplusplus
extern "C" {
#endif

/* SPARC instruction simulator return codes.  */

#define	SIMU_SUCCESS	1	/* simulation worked */
#define	SIMU_ILLEGAL	2	/* tried to simulate an illegal instuction */
#define	SIMU_FAULT	3	/* simulation generated an illegal access */
#define	SIMU_DZERO	4	/* simulation generated divide by zero */
#define	SIMU_UNALIGN	5	/* simulation generated an unaligned access */
#define	SIMU_RETRY	6	/* fixed up instruction, now retry it */


/*
 * Opcode types.
 */
#define	OP_V8_BRANCH	0
#define	OP_V8_CALL	1
#define	OP_V8_ARITH	2	/* includes control xfer (e.g. JMPL) */
#define	OP_V8_LDSTR	3

/*
 * Relevant instruction opcodes.
 */

/* OP_V8_LDSTR  */
#define	IOP_V8_LD	0x00
#define	IOP_V8_LDA	0x10
#define	IOP_V8_LDUBA	0x11
#define	IOP_V8_LDUHA	0x12
#define	IOP_V8_LDDA	0x13
#define	IOP_V8_STA	0x14
#define	IOP_V8_STBA	0x15
#define	IOP_V8_STHA	0x16
#define	IOP_V8_STDA	0x17
#define	IOP_V8_LDSBA	0x19
#define	IOP_V8_LDSHA	0x1a
#define	IOP_V8_LDSTUBA	0x1d
#define	IOP_V8_SWAPA	0x1f
#define	IOP_V8_LDFSR	0x21
#define	IOP_V8_LDQF	0x22
#define	IOP_V8_STFSR	0x25
#define	IOP_V8_STQF	0x26
#define	IOP_V8_LDQFA	0x32
#define	IOP_V8_LDDFA	0x33
#define	IOP_V8_STQFA	0x36
#define	IOP_V8_STDFA	0x37

/* OP_V8_ARITH */
#define	IOP_V8_ADD	0x00
#define	IOP_V8_AND	0x01
#define	IOP_V8_OR	0x02
#define	IOP_V8_XOR	0x03
#define	IOP_V8_SUB	0x04
#define	IOP_V8_ANDN	0x05
#define	IOP_V8_ORN	0x06
#define	IOP_V8_XNOR	0x07
#define	IOP_V8_ADDC	0x08
#define	IOP_V8_UMUL	0x0a
#define	IOP_V8_SMUL	0x0b
#define	IOP_V8_SUBC	0x0c
#define	IOP_V8_UDIV	0x0e
#define	IOP_V8_SDIV	0x0f
#define	IOP_V8_ADDcc	0x10
#define	IOP_V8_ANDcc	0x11
#define	IOP_V8_ORcc	0x12
#define	IOP_V8_XORcc	0x13
#define	IOP_V8_SUBcc	0x14
#define	IOP_V8_ANDNcc	0x15
#define	IOP_V8_ORNcc	0x16
#define	IOP_V8_XNORcc	0x17
#define	IOP_V8_ADDCcc	0x18
#define	IOP_V8_UMULcc	0x1a
#define	IOP_V8_SMULcc	0x1b
#define	IOP_V8_SUBCcc	0x1c
#define	IOP_V8_UDIVcc	0x1e
#define	IOP_V8_SDIVcc	0x1f
#define	IOP_V8_TADDcc	0x20
#define	IOP_V8_TSUBcc	0x21
#define	IOP_V8_TADDccTV	0x22
#define	IOP_V8_TSUBccTV	0x23
#define	IOP_V8_MULScc	0x24
#define	IOP_V8_SLL	0x25
#define	IOP_V8_SRL	0x26
#define	IOP_V8_SRA	0x27
#define	IOP_V8_RDASR	0x28
#define	IOP_V8_POPC	0x2e
#define	IOP_V8_WRASR	0x30
#define	IOP_V8_FCMP	0x35
#define	IOP_V8_JMPL	0x38
#define	IOP_V8_RETT	0x39
#define	IOP_V8_TCC	0x3a
#define	IOP_V8_FLUSH	0x3b
#define	IOP_V8_SAVE	0x3c
#define	IOP_V8_RESTORE	0x3d

/*
 * Check for a load/store to alternate space. All other ld/st
 * instructions should have bits 12-5 clear, if the i-bit is 0.
 */
#define	IS_LDST_ALT(x) \
	(((x) == IOP_V8_LDA || (x) == IOP_V8_LDDA || \
	    (x) == IOP_V8_LDSBA || (x) == IOP_V8_LDSHA || \
	    (x) == IOP_V8_LDSTUBA || (x) == IOP_V8_LDUBA || \
	    (x) == IOP_V8_LDUHA || (x) == IOP_V8_STA || \
	    (x) == IOP_V8_STBA || (x) == IOP_V8_STDA || \
	    (x) == IOP_V8_STHA || (x) == IOP_V8_SWAPA) ? 1 : 0)


#ifndef _ASM

#include <vm/seg_enum.h>

extern int32_t fetch_user_instr(caddr_t);
extern int simulate_unimp(struct regs *, caddr_t *);
extern int simulate_lddstd(struct regs *, caddr_t *);
extern int simulate_rdtick(struct regs *);
extern int do_unaligned(struct regs *, caddr_t *);
extern int calc_memaddr(struct regs *, caddr_t *);
extern int is_atomic(struct regs *);
extern int instr_size(struct regs *, caddr_t *, enum seg_rw);
extern int getreg(struct regs *, uint_t, uint64_t *, caddr_t *);
extern int putreg(uint64_t *, struct regs *, uint_t, caddr_t *);
extern int extended_asi_size(int asi);

#endif /* _ASM */

#ifdef __cplusplus
}
#endif

#endif /* _SYS_SIMULATE_H */