]>
Commit | Line | Data |
---|---|---|
79aceca5 | 1 | /* |
3fc6c082 | 2 | * PowerPC emulation micro-operations for qemu. |
5fafdf24 | 3 | * |
76a66253 | 4 | * Copyright (c) 2003-2007 Jocelyn Mayer |
79aceca5 FB |
5 | * |
6 | * This library is free software; you can redistribute it and/or | |
7 | * modify it under the terms of the GNU Lesser General Public | |
8 | * License as published by the Free Software Foundation; either | |
9 | * version 2 of the License, or (at your option) any later version. | |
10 | * | |
11 | * This library is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | * Lesser General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU Lesser General Public | |
17 | * License along with this library; if not, write to the Free Software | |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 | */ | |
20 | ||
a541f297 FB |
21 | //#define DEBUG_OP |
22 | ||
79aceca5 FB |
23 | #include "config.h" |
24 | #include "exec.h" | |
603fccce | 25 | #include "host-utils.h" |
0411a972 | 26 | #include "helper_regs.h" |
76a66253 | 27 | #include "op_helper.h" |
79aceca5 | 28 | |
76a66253 | 29 | #if !defined(CONFIG_USER_ONLY) |
36081602 | 30 | void OPPROTO op_load_sdr1 (void) |
76a66253 | 31 | { |
36081602 | 32 | T0 = env->sdr1; |
76a66253 JM |
33 | RETURN(); |
34 | } | |
35 | ||
36081602 | 36 | void OPPROTO op_store_sdr1 (void) |
76a66253 JM |
37 | { |
38 | do_store_sdr1(env, T0); | |
79aceca5 FB |
39 | RETURN(); |
40 | } | |
41 | ||
d9bce9d9 JM |
42 | #if defined (TARGET_PPC64) |
43 | void OPPROTO op_load_asr (void) | |
44 | { | |
45 | T0 = env->asr; | |
46 | RETURN(); | |
47 | } | |
48 | ||
49 | void OPPROTO op_store_asr (void) | |
50 | { | |
51 | ppc_store_asr(env, T0); | |
52 | RETURN(); | |
53 | } | |
54 | #endif | |
d9bce9d9 | 55 | #endif |
9a64fbe4 FB |
56 | |
57 | /* SPR */ | |
a496775f JM |
58 | void OPPROTO op_load_spr (void) |
59 | { | |
60 | T0 = env->spr[PARAM1]; | |
61 | RETURN(); | |
62 | } | |
63 | ||
64 | void OPPROTO op_store_spr (void) | |
65 | { | |
66 | env->spr[PARAM1] = T0; | |
67 | RETURN(); | |
68 | } | |
69 | ||
70 | void OPPROTO op_load_dump_spr (void) | |
71 | { | |
72 | T0 = ppc_load_dump_spr(PARAM1); | |
73 | RETURN(); | |
74 | } | |
75 | ||
76 | void OPPROTO op_store_dump_spr (void) | |
9a64fbe4 | 77 | { |
a496775f | 78 | ppc_store_dump_spr(PARAM1, T0); |
9a64fbe4 FB |
79 | RETURN(); |
80 | } | |
81 | ||
a496775f | 82 | void OPPROTO op_mask_spr (void) |
9a64fbe4 | 83 | { |
a496775f | 84 | env->spr[PARAM1] &= ~T0; |
79aceca5 FB |
85 | RETURN(); |
86 | } | |
87 | ||
36081602 | 88 | void OPPROTO op_load_tbl (void) |
9a64fbe4 | 89 | { |
36081602 | 90 | T0 = cpu_ppc_load_tbl(env); |
9a64fbe4 FB |
91 | RETURN(); |
92 | } | |
93 | ||
36081602 | 94 | void OPPROTO op_load_tbu (void) |
9a64fbe4 | 95 | { |
36081602 | 96 | T0 = cpu_ppc_load_tbu(env); |
9a64fbe4 FB |
97 | RETURN(); |
98 | } | |
99 | ||
a062e36c JM |
100 | void OPPROTO op_load_atbl (void) |
101 | { | |
102 | T0 = cpu_ppc_load_atbl(env); | |
103 | RETURN(); | |
104 | } | |
105 | ||
106 | void OPPROTO op_load_atbu (void) | |
107 | { | |
108 | T0 = cpu_ppc_load_atbu(env); | |
109 | RETURN(); | |
110 | } | |
111 | ||
76a66253 | 112 | #if !defined(CONFIG_USER_ONLY) |
36081602 | 113 | void OPPROTO op_store_tbl (void) |
9a64fbe4 | 114 | { |
36081602 | 115 | cpu_ppc_store_tbl(env, T0); |
79aceca5 FB |
116 | RETURN(); |
117 | } | |
118 | ||
36081602 | 119 | void OPPROTO op_store_tbu (void) |
9a64fbe4 | 120 | { |
36081602 | 121 | cpu_ppc_store_tbu(env, T0); |
9a64fbe4 FB |
122 | RETURN(); |
123 | } | |
124 | ||
a062e36c JM |
125 | void OPPROTO op_store_atbl (void) |
126 | { | |
127 | cpu_ppc_store_atbl(env, T0); | |
128 | RETURN(); | |
129 | } | |
130 | ||
131 | void OPPROTO op_store_atbu (void) | |
132 | { | |
133 | cpu_ppc_store_atbu(env, T0); | |
134 | RETURN(); | |
135 | } | |
136 | ||
36081602 | 137 | void OPPROTO op_load_decr (void) |
9a64fbe4 | 138 | { |
36081602 | 139 | T0 = cpu_ppc_load_decr(env); |
76a66253 JM |
140 | RETURN(); |
141 | } | |
9fddaa0c | 142 | |
36081602 | 143 | void OPPROTO op_store_decr (void) |
9fddaa0c | 144 | { |
36081602 | 145 | cpu_ppc_store_decr(env, T0); |
9a64fbe4 FB |
146 | RETURN(); |
147 | } | |
148 | ||
36081602 | 149 | void OPPROTO op_load_ibat (void) |
9a64fbe4 | 150 | { |
36081602 | 151 | T0 = env->IBAT[PARAM1][PARAM2]; |
76a66253 | 152 | RETURN(); |
9a64fbe4 FB |
153 | } |
154 | ||
76a66253 | 155 | void OPPROTO op_store_ibatu (void) |
9a64fbe4 | 156 | { |
3fc6c082 FB |
157 | do_store_ibatu(env, PARAM1, T0); |
158 | RETURN(); | |
159 | } | |
160 | ||
76a66253 | 161 | void OPPROTO op_store_ibatl (void) |
3fc6c082 FB |
162 | { |
163 | #if 1 | |
164 | env->IBAT[1][PARAM1] = T0; | |
165 | #else | |
166 | do_store_ibatl(env, PARAM1, T0); | |
167 | #endif | |
168 | RETURN(); | |
9a64fbe4 FB |
169 | } |
170 | ||
36081602 | 171 | void OPPROTO op_load_dbat (void) |
9a64fbe4 | 172 | { |
36081602 | 173 | T0 = env->DBAT[PARAM1][PARAM2]; |
76a66253 | 174 | RETURN(); |
9a64fbe4 FB |
175 | } |
176 | ||
76a66253 | 177 | void OPPROTO op_store_dbatu (void) |
3fc6c082 FB |
178 | { |
179 | do_store_dbatu(env, PARAM1, T0); | |
180 | RETURN(); | |
181 | } | |
182 | ||
76a66253 | 183 | void OPPROTO op_store_dbatl (void) |
9a64fbe4 | 184 | { |
3fc6c082 FB |
185 | #if 1 |
186 | env->DBAT[1][PARAM1] = T0; | |
187 | #else | |
188 | do_store_dbatl(env, PARAM1, T0); | |
189 | #endif | |
190 | RETURN(); | |
9a64fbe4 | 191 | } |
76a66253 | 192 | #endif /* !defined(CONFIG_USER_ONLY) */ |
9a64fbe4 | 193 | |
9a64fbe4 | 194 | /* Return from interrupt */ |
76a66253 | 195 | #if !defined(CONFIG_USER_ONLY) |
6f5d427d JM |
196 | /* Exception vectors */ |
197 | void OPPROTO op_store_excp_prefix (void) | |
198 | { | |
199 | T0 &= env->ivpr_mask; | |
200 | env->excp_prefix = T0; | |
201 | RETURN(); | |
202 | } | |
203 | ||
204 | void OPPROTO op_store_excp_vector (void) | |
205 | { | |
206 | T0 &= env->ivor_mask; | |
207 | env->excp_vectors[PARAM1] = T0; | |
208 | RETURN(); | |
209 | } | |
76a66253 | 210 | #endif |
fb0eaffc | 211 | |
76a66253 | 212 | /* 601 specific */ |
76a66253 JM |
213 | void OPPROTO op_load_601_rtcl (void) |
214 | { | |
215 | T0 = cpu_ppc601_load_rtcl(env); | |
216 | RETURN(); | |
217 | } | |
218 | ||
76a66253 JM |
219 | void OPPROTO op_load_601_rtcu (void) |
220 | { | |
221 | T0 = cpu_ppc601_load_rtcu(env); | |
222 | RETURN(); | |
223 | } | |
224 | ||
225 | #if !defined(CONFIG_USER_ONLY) | |
76a66253 JM |
226 | void OPPROTO op_store_601_rtcl (void) |
227 | { | |
228 | cpu_ppc601_store_rtcl(env, T0); | |
229 | RETURN(); | |
230 | } | |
231 | ||
76a66253 JM |
232 | void OPPROTO op_store_601_rtcu (void) |
233 | { | |
234 | cpu_ppc601_store_rtcu(env, T0); | |
235 | RETURN(); | |
236 | } | |
237 | ||
056401ea JM |
238 | void OPPROTO op_store_hid0_601 (void) |
239 | { | |
240 | do_store_hid0_601(); | |
241 | RETURN(); | |
242 | } | |
243 | ||
76a66253 JM |
244 | void OPPROTO op_load_601_bat (void) |
245 | { | |
246 | T0 = env->IBAT[PARAM1][PARAM2]; | |
247 | RETURN(); | |
248 | } | |
76a66253 | 249 | |
76a66253 JM |
250 | void OPPROTO op_store_601_batl (void) |
251 | { | |
056401ea | 252 | do_store_ibatl_601(env, PARAM1, T0); |
76a66253 JM |
253 | RETURN(); |
254 | } | |
255 | ||
256 | void OPPROTO op_store_601_batu (void) | |
257 | { | |
056401ea | 258 | do_store_ibatu_601(env, PARAM1, T0); |
76a66253 JM |
259 | RETURN(); |
260 | } | |
261 | #endif /* !defined(CONFIG_USER_ONLY) */ | |
262 | ||
76a66253 JM |
263 | /* SPR micro-ops */ |
264 | /* 440 specific */ | |
76a66253 JM |
265 | #if !defined(CONFIG_USER_ONLY) |
266 | void OPPROTO op_store_pir (void) | |
3fc6c082 FB |
267 | { |
268 | env->spr[SPR_PIR] = T0 & 0x0000000FUL; | |
269 | RETURN(); | |
270 | } | |
76a66253 JM |
271 | |
272 | void OPPROTO op_load_403_pb (void) | |
273 | { | |
274 | do_load_403_pb(PARAM1); | |
275 | RETURN(); | |
276 | } | |
277 | ||
278 | void OPPROTO op_store_403_pb (void) | |
279 | { | |
280 | do_store_403_pb(PARAM1); | |
281 | RETURN(); | |
282 | } | |
283 | ||
76a66253 JM |
284 | void OPPROTO op_load_40x_pit (void) |
285 | { | |
286 | T0 = load_40x_pit(env); | |
287 | RETURN(); | |
288 | } | |
289 | ||
76a66253 JM |
290 | void OPPROTO op_store_40x_pit (void) |
291 | { | |
292 | store_40x_pit(env, T0); | |
293 | RETURN(); | |
294 | } | |
295 | ||
8ecc7913 JM |
296 | void OPPROTO op_store_40x_dbcr0 (void) |
297 | { | |
298 | store_40x_dbcr0(env, T0); | |
be147d08 | 299 | RETURN(); |
8ecc7913 JM |
300 | } |
301 | ||
c294fc58 JM |
302 | void OPPROTO op_store_40x_sler (void) |
303 | { | |
304 | store_40x_sler(env, T0); | |
305 | RETURN(); | |
306 | } | |
307 | ||
76a66253 JM |
308 | void OPPROTO op_store_booke_tcr (void) |
309 | { | |
310 | store_booke_tcr(env, T0); | |
311 | RETURN(); | |
312 | } | |
313 | ||
76a66253 JM |
314 | void OPPROTO op_store_booke_tsr (void) |
315 | { | |
316 | store_booke_tsr(env, T0); | |
317 | RETURN(); | |
318 | } | |
319 | #endif /* !defined(CONFIG_USER_ONLY) */ | |
0487d6a8 | 320 |