Statistics
| Branch: | Revision:

root / target-alpha / helper.c @ 0b5c1ce8

History | View | Annotate | Download (11.1 kB)

1 4c9649a9 j_mayer
/*
2 4c9649a9 j_mayer
 *  Alpha emulation cpu helpers for qemu.
3 5fafdf24 ths
 *
4 4c9649a9 j_mayer
 *  Copyright (c) 2007 Jocelyn Mayer
5 4c9649a9 j_mayer
 *
6 4c9649a9 j_mayer
 * This library is free software; you can redistribute it and/or
7 4c9649a9 j_mayer
 * modify it under the terms of the GNU Lesser General Public
8 4c9649a9 j_mayer
 * License as published by the Free Software Foundation; either
9 4c9649a9 j_mayer
 * version 2 of the License, or (at your option) any later version.
10 4c9649a9 j_mayer
 *
11 4c9649a9 j_mayer
 * This library is distributed in the hope that it will be useful,
12 4c9649a9 j_mayer
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 4c9649a9 j_mayer
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 4c9649a9 j_mayer
 * Lesser General Public License for more details.
15 4c9649a9 j_mayer
 *
16 4c9649a9 j_mayer
 * You should have received a copy of the GNU Lesser General Public
17 8167ee88 Blue Swirl
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 4c9649a9 j_mayer
 */
19 4c9649a9 j_mayer
20 4c9649a9 j_mayer
#include <stdint.h>
21 4c9649a9 j_mayer
#include <stdlib.h>
22 4c9649a9 j_mayer
#include <stdio.h>
23 4c9649a9 j_mayer
24 4c9649a9 j_mayer
#include "cpu.h"
25 4c9649a9 j_mayer
#include "exec-all.h"
26 4c9649a9 j_mayer
27 5fafdf24 ths
#if defined(CONFIG_USER_ONLY)
28 4c9649a9 j_mayer
29 4c9649a9 j_mayer
int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
30 6ebbf390 j_mayer
                                int mmu_idx, int is_softmmu)
31 4c9649a9 j_mayer
{
32 4c9649a9 j_mayer
    if (rw == 2)
33 4c9649a9 j_mayer
        env->exception_index = EXCP_ITB_MISS;
34 4c9649a9 j_mayer
    else
35 4c9649a9 j_mayer
        env->exception_index = EXCP_DFAULT;
36 4c9649a9 j_mayer
    env->ipr[IPR_EXC_ADDR] = address;
37 3b46e624 ths
38 4c9649a9 j_mayer
    return 1;
39 4c9649a9 j_mayer
}
40 4c9649a9 j_mayer
41 9b3c35e0 j_mayer
target_phys_addr_t cpu_get_phys_page_debug (CPUState *env, target_ulong addr)
42 4c9649a9 j_mayer
{
43 4c9649a9 j_mayer
    return addr;
44 4c9649a9 j_mayer
}
45 4c9649a9 j_mayer
46 4c9649a9 j_mayer
void do_interrupt (CPUState *env)
47 4c9649a9 j_mayer
{
48 4c9649a9 j_mayer
    env->exception_index = -1;
49 4c9649a9 j_mayer
}
50 4c9649a9 j_mayer
51 4c9649a9 j_mayer
#else
52 4c9649a9 j_mayer
53 9b3c35e0 j_mayer
target_phys_addr_t cpu_get_phys_page_debug (CPUState *env, target_ulong addr)
54 4c9649a9 j_mayer
{
55 4c9649a9 j_mayer
    return -1;
56 4c9649a9 j_mayer
}
57 4c9649a9 j_mayer
58 4c9649a9 j_mayer
int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
59 6ebbf390 j_mayer
                                int mmu_idx, int is_softmmu)
60 4c9649a9 j_mayer
{
61 4c9649a9 j_mayer
    uint32_t opc;
62 4c9649a9 j_mayer
63 4c9649a9 j_mayer
    if (rw == 2) {
64 4c9649a9 j_mayer
        /* Instruction translation buffer miss */
65 4c9649a9 j_mayer
        env->exception_index = EXCP_ITB_MISS;
66 4c9649a9 j_mayer
    } else {
67 4c9649a9 j_mayer
        if (env->ipr[IPR_EXC_ADDR] & 1)
68 4c9649a9 j_mayer
            env->exception_index = EXCP_DTB_MISS_PAL;
69 4c9649a9 j_mayer
        else
70 4c9649a9 j_mayer
            env->exception_index = EXCP_DTB_MISS_NATIVE;
71 4c9649a9 j_mayer
        opc = (ldl_code(env->pc) >> 21) << 4;
72 4c9649a9 j_mayer
        if (rw) {
73 4c9649a9 j_mayer
            opc |= 0x9;
74 4c9649a9 j_mayer
        } else {
75 4c9649a9 j_mayer
            opc |= 0x4;
76 4c9649a9 j_mayer
        }
77 4c9649a9 j_mayer
        env->ipr[IPR_MM_STAT] = opc;
78 4c9649a9 j_mayer
    }
79 4c9649a9 j_mayer
80 4c9649a9 j_mayer
    return 1;
81 4c9649a9 j_mayer
}
82 4c9649a9 j_mayer
83 4c9649a9 j_mayer
int cpu_alpha_mfpr (CPUState *env, int iprn, uint64_t *valp)
84 4c9649a9 j_mayer
{
85 4c9649a9 j_mayer
    uint64_t hwpcb;
86 4c9649a9 j_mayer
    int ret = 0;
87 4c9649a9 j_mayer
88 4c9649a9 j_mayer
    hwpcb = env->ipr[IPR_PCBB];
89 4c9649a9 j_mayer
    switch (iprn) {
90 4c9649a9 j_mayer
    case IPR_ASN:
91 4c9649a9 j_mayer
        if (env->features & FEATURE_ASN)
92 4c9649a9 j_mayer
            *valp = env->ipr[IPR_ASN];
93 4c9649a9 j_mayer
        else
94 4c9649a9 j_mayer
            *valp = 0;
95 4c9649a9 j_mayer
        break;
96 4c9649a9 j_mayer
    case IPR_ASTEN:
97 4c9649a9 j_mayer
        *valp = ((int64_t)(env->ipr[IPR_ASTEN] << 60)) >> 60;
98 4c9649a9 j_mayer
        break;
99 4c9649a9 j_mayer
    case IPR_ASTSR:
100 4c9649a9 j_mayer
        *valp = ((int64_t)(env->ipr[IPR_ASTSR] << 60)) >> 60;
101 4c9649a9 j_mayer
        break;
102 4c9649a9 j_mayer
    case IPR_DATFX:
103 4c9649a9 j_mayer
        /* Write only */
104 4c9649a9 j_mayer
        ret = -1;
105 4c9649a9 j_mayer
        break;
106 4c9649a9 j_mayer
    case IPR_ESP:
107 4c9649a9 j_mayer
        if (env->features & FEATURE_SPS)
108 4c9649a9 j_mayer
            *valp = env->ipr[IPR_ESP];
109 4c9649a9 j_mayer
        else
110 4c9649a9 j_mayer
            *valp = ldq_raw(hwpcb + 8);
111 4c9649a9 j_mayer
        break;
112 4c9649a9 j_mayer
    case IPR_FEN:
113 4c9649a9 j_mayer
        *valp = ((int64_t)(env->ipr[IPR_FEN] << 63)) >> 63;
114 4c9649a9 j_mayer
        break;
115 4c9649a9 j_mayer
    case IPR_IPIR:
116 4c9649a9 j_mayer
        /* Write-only */
117 4c9649a9 j_mayer
        ret = -1;
118 4c9649a9 j_mayer
        break;
119 4c9649a9 j_mayer
    case IPR_IPL:
120 4c9649a9 j_mayer
        *valp = ((int64_t)(env->ipr[IPR_IPL] << 59)) >> 59;
121 4c9649a9 j_mayer
        break;
122 4c9649a9 j_mayer
    case IPR_KSP:
123 4c9649a9 j_mayer
        if (!(env->ipr[IPR_EXC_ADDR] & 1)) {
124 4c9649a9 j_mayer
            ret = -1;
125 4c9649a9 j_mayer
        } else {
126 4c9649a9 j_mayer
            if (env->features & FEATURE_SPS)
127 4c9649a9 j_mayer
                *valp = env->ipr[IPR_KSP];
128 4c9649a9 j_mayer
            else
129 4c9649a9 j_mayer
                *valp = ldq_raw(hwpcb + 0);
130 4c9649a9 j_mayer
        }
131 4c9649a9 j_mayer
        break;
132 4c9649a9 j_mayer
    case IPR_MCES:
133 4c9649a9 j_mayer
        *valp = ((int64_t)(env->ipr[IPR_MCES] << 59)) >> 59;
134 4c9649a9 j_mayer
        break;
135 4c9649a9 j_mayer
    case IPR_PERFMON:
136 4c9649a9 j_mayer
        /* Implementation specific */
137 4c9649a9 j_mayer
        *valp = 0;
138 4c9649a9 j_mayer
        break;
139 4c9649a9 j_mayer
    case IPR_PCBB:
140 4c9649a9 j_mayer
        *valp = ((int64_t)env->ipr[IPR_PCBB] << 16) >> 16;
141 4c9649a9 j_mayer
        break;
142 4c9649a9 j_mayer
    case IPR_PRBR:
143 4c9649a9 j_mayer
        *valp = env->ipr[IPR_PRBR];
144 4c9649a9 j_mayer
        break;
145 4c9649a9 j_mayer
    case IPR_PTBR:
146 4c9649a9 j_mayer
        *valp = env->ipr[IPR_PTBR];
147 4c9649a9 j_mayer
        break;
148 4c9649a9 j_mayer
    case IPR_SCBB:
149 4c9649a9 j_mayer
        *valp = (int64_t)((int32_t)env->ipr[IPR_SCBB]);
150 4c9649a9 j_mayer
        break;
151 4c9649a9 j_mayer
    case IPR_SIRR:
152 4c9649a9 j_mayer
        /* Write-only */
153 4c9649a9 j_mayer
        ret = -1;
154 4c9649a9 j_mayer
        break;
155 4c9649a9 j_mayer
    case IPR_SISR:
156 4c9649a9 j_mayer
        *valp = (int64_t)((int16_t)env->ipr[IPR_SISR]);
157 4c9649a9 j_mayer
    case IPR_SSP:
158 4c9649a9 j_mayer
        if (env->features & FEATURE_SPS)
159 4c9649a9 j_mayer
            *valp = env->ipr[IPR_SSP];
160 4c9649a9 j_mayer
        else
161 4c9649a9 j_mayer
            *valp = ldq_raw(hwpcb + 16);
162 4c9649a9 j_mayer
        break;
163 4c9649a9 j_mayer
    case IPR_SYSPTBR:
164 4c9649a9 j_mayer
        if (env->features & FEATURE_VIRBND)
165 4c9649a9 j_mayer
            *valp = env->ipr[IPR_SYSPTBR];
166 4c9649a9 j_mayer
        else
167 4c9649a9 j_mayer
            ret = -1;
168 4c9649a9 j_mayer
        break;
169 4c9649a9 j_mayer
    case IPR_TBCHK:
170 4c9649a9 j_mayer
        if ((env->features & FEATURE_TBCHK)) {
171 4c9649a9 j_mayer
            /* XXX: TODO */
172 4c9649a9 j_mayer
            *valp = 0;
173 4c9649a9 j_mayer
            ret = -1;
174 4c9649a9 j_mayer
        } else {
175 4c9649a9 j_mayer
            ret = -1;
176 4c9649a9 j_mayer
        }
177 4c9649a9 j_mayer
        break;
178 4c9649a9 j_mayer
    case IPR_TBIA:
179 4c9649a9 j_mayer
        /* Write-only */
180 4c9649a9 j_mayer
        ret = -1;
181 4c9649a9 j_mayer
        break;
182 4c9649a9 j_mayer
    case IPR_TBIAP:
183 4c9649a9 j_mayer
        /* Write-only */
184 4c9649a9 j_mayer
        ret = -1;
185 4c9649a9 j_mayer
        break;
186 4c9649a9 j_mayer
    case IPR_TBIS:
187 4c9649a9 j_mayer
        /* Write-only */
188 4c9649a9 j_mayer
        ret = -1;
189 4c9649a9 j_mayer
        break;
190 4c9649a9 j_mayer
    case IPR_TBISD:
191 4c9649a9 j_mayer
        /* Write-only */
192 4c9649a9 j_mayer
        ret = -1;
193 4c9649a9 j_mayer
        break;
194 4c9649a9 j_mayer
    case IPR_TBISI:
195 4c9649a9 j_mayer
        /* Write-only */
196 4c9649a9 j_mayer
        ret = -1;
197 4c9649a9 j_mayer
        break;
198 4c9649a9 j_mayer
    case IPR_USP:
199 4c9649a9 j_mayer
        if (env->features & FEATURE_SPS)
200 4c9649a9 j_mayer
            *valp = env->ipr[IPR_USP];
201 4c9649a9 j_mayer
        else
202 4c9649a9 j_mayer
            *valp = ldq_raw(hwpcb + 24);
203 4c9649a9 j_mayer
        break;
204 4c9649a9 j_mayer
    case IPR_VIRBND:
205 4c9649a9 j_mayer
        if (env->features & FEATURE_VIRBND)
206 4c9649a9 j_mayer
            *valp = env->ipr[IPR_VIRBND];
207 4c9649a9 j_mayer
        else
208 4c9649a9 j_mayer
            ret = -1;
209 4c9649a9 j_mayer
        break;
210 4c9649a9 j_mayer
    case IPR_VPTB:
211 4c9649a9 j_mayer
        *valp = env->ipr[IPR_VPTB];
212 4c9649a9 j_mayer
        break;
213 4c9649a9 j_mayer
    case IPR_WHAMI:
214 4c9649a9 j_mayer
        *valp = env->ipr[IPR_WHAMI];
215 4c9649a9 j_mayer
        break;
216 4c9649a9 j_mayer
    default:
217 4c9649a9 j_mayer
        /* Invalid */
218 4c9649a9 j_mayer
        ret = -1;
219 4c9649a9 j_mayer
        break;
220 4c9649a9 j_mayer
    }
221 4c9649a9 j_mayer
222 4c9649a9 j_mayer
    return ret;
223 4c9649a9 j_mayer
}
224 4c9649a9 j_mayer
225 4c9649a9 j_mayer
int cpu_alpha_mtpr (CPUState *env, int iprn, uint64_t val, uint64_t *oldvalp)
226 4c9649a9 j_mayer
{
227 4c9649a9 j_mayer
    uint64_t hwpcb, tmp64;
228 4c9649a9 j_mayer
    uint8_t tmp8;
229 4c9649a9 j_mayer
    int ret = 0;
230 4c9649a9 j_mayer
231 4c9649a9 j_mayer
    hwpcb = env->ipr[IPR_PCBB];
232 4c9649a9 j_mayer
    switch (iprn) {
233 4c9649a9 j_mayer
    case IPR_ASN:
234 4c9649a9 j_mayer
        /* Read-only */
235 4c9649a9 j_mayer
        ret = -1;
236 4c9649a9 j_mayer
        break;
237 4c9649a9 j_mayer
    case IPR_ASTEN:
238 4c9649a9 j_mayer
        tmp8 = ((int8_t)(env->ipr[IPR_ASTEN] << 4)) >> 4;
239 4c9649a9 j_mayer
        *oldvalp = tmp8;
240 4c9649a9 j_mayer
        tmp8 &= val & 0xF;
241 4c9649a9 j_mayer
        tmp8 |= (val >> 4) & 0xF;
242 4c9649a9 j_mayer
        env->ipr[IPR_ASTEN] &= ~0xF;
243 4c9649a9 j_mayer
        env->ipr[IPR_ASTEN] |= tmp8;
244 4c9649a9 j_mayer
        ret = 1;
245 4c9649a9 j_mayer
        break;
246 4c9649a9 j_mayer
    case IPR_ASTSR:
247 4c9649a9 j_mayer
        tmp8 = ((int8_t)(env->ipr[IPR_ASTSR] << 4)) >> 4;
248 4c9649a9 j_mayer
        *oldvalp = tmp8;
249 4c9649a9 j_mayer
        tmp8 &= val & 0xF;
250 4c9649a9 j_mayer
        tmp8 |= (val >> 4) & 0xF;
251 4c9649a9 j_mayer
        env->ipr[IPR_ASTSR] &= ~0xF;
252 4c9649a9 j_mayer
        env->ipr[IPR_ASTSR] |= tmp8;
253 4c9649a9 j_mayer
        ret = 1;
254 4c9649a9 j_mayer
    case IPR_DATFX:
255 4c9649a9 j_mayer
        env->ipr[IPR_DATFX] &= ~0x1;
256 4c9649a9 j_mayer
        env->ipr[IPR_DATFX] |= val & 1;
257 4c9649a9 j_mayer
        tmp64 = ldq_raw(hwpcb + 56);
258 4c9649a9 j_mayer
        tmp64 &= ~0x8000000000000000ULL;
259 4c9649a9 j_mayer
        tmp64 |= (val & 1) << 63;
260 4c9649a9 j_mayer
        stq_raw(hwpcb + 56, tmp64);
261 4c9649a9 j_mayer
        break;
262 4c9649a9 j_mayer
    case IPR_ESP:
263 4c9649a9 j_mayer
        if (env->features & FEATURE_SPS)
264 4c9649a9 j_mayer
            env->ipr[IPR_ESP] = val;
265 4c9649a9 j_mayer
        else
266 4c9649a9 j_mayer
            stq_raw(hwpcb + 8, val);
267 4c9649a9 j_mayer
        break;
268 4c9649a9 j_mayer
    case IPR_FEN:
269 4c9649a9 j_mayer
        env->ipr[IPR_FEN] = val & 1;
270 4c9649a9 j_mayer
        tmp64 = ldq_raw(hwpcb + 56);
271 4c9649a9 j_mayer
        tmp64 &= ~1;
272 4c9649a9 j_mayer
        tmp64 |= val & 1;
273 4c9649a9 j_mayer
        stq_raw(hwpcb + 56, tmp64);
274 4c9649a9 j_mayer
        break;
275 4c9649a9 j_mayer
    case IPR_IPIR:
276 4c9649a9 j_mayer
        /* XXX: TODO: Send IRQ to CPU #ir[16] */
277 4c9649a9 j_mayer
        break;
278 4c9649a9 j_mayer
    case IPR_IPL:
279 4c9649a9 j_mayer
        *oldvalp = ((int64_t)(env->ipr[IPR_IPL] << 59)) >> 59;
280 4c9649a9 j_mayer
        env->ipr[IPR_IPL] &= ~0x1F;
281 4c9649a9 j_mayer
        env->ipr[IPR_IPL] |= val & 0x1F;
282 4c9649a9 j_mayer
        /* XXX: may issue an interrupt or ASR _now_ */
283 4c9649a9 j_mayer
        ret = 1;
284 4c9649a9 j_mayer
        break;
285 4c9649a9 j_mayer
    case IPR_KSP:
286 4c9649a9 j_mayer
        if (!(env->ipr[IPR_EXC_ADDR] & 1)) {
287 4c9649a9 j_mayer
            ret = -1;
288 4c9649a9 j_mayer
        } else {
289 4c9649a9 j_mayer
            if (env->features & FEATURE_SPS)
290 4c9649a9 j_mayer
                env->ipr[IPR_KSP] = val;
291 4c9649a9 j_mayer
            else
292 4c9649a9 j_mayer
                stq_raw(hwpcb + 0, val);
293 4c9649a9 j_mayer
        }
294 4c9649a9 j_mayer
        break;
295 4c9649a9 j_mayer
    case IPR_MCES:
296 4c9649a9 j_mayer
        env->ipr[IPR_MCES] &= ~((val & 0x7) | 0x18);
297 4c9649a9 j_mayer
        env->ipr[IPR_MCES] |= val & 0x18;
298 4c9649a9 j_mayer
        break;
299 4c9649a9 j_mayer
    case IPR_PERFMON:
300 4c9649a9 j_mayer
        /* Implementation specific */
301 4c9649a9 j_mayer
        *oldvalp = 0;
302 4c9649a9 j_mayer
        ret = 1;
303 4c9649a9 j_mayer
        break;
304 4c9649a9 j_mayer
    case IPR_PCBB:
305 4c9649a9 j_mayer
        /* Read-only */
306 4c9649a9 j_mayer
        ret = -1;
307 4c9649a9 j_mayer
        break;
308 4c9649a9 j_mayer
    case IPR_PRBR:
309 4c9649a9 j_mayer
        env->ipr[IPR_PRBR] = val;
310 4c9649a9 j_mayer
        break;
311 4c9649a9 j_mayer
    case IPR_PTBR:
312 4c9649a9 j_mayer
        /* Read-only */
313 4c9649a9 j_mayer
        ret = -1;
314 4c9649a9 j_mayer
        break;
315 4c9649a9 j_mayer
    case IPR_SCBB:
316 4c9649a9 j_mayer
        env->ipr[IPR_SCBB] = (uint32_t)val;
317 4c9649a9 j_mayer
        break;
318 4c9649a9 j_mayer
    case IPR_SIRR:
319 4c9649a9 j_mayer
        if (val & 0xF) {
320 4c9649a9 j_mayer
            env->ipr[IPR_SISR] |= 1 << (val & 0xF);
321 4c9649a9 j_mayer
            /* XXX: request a software interrupt _now_ */
322 4c9649a9 j_mayer
        }
323 4c9649a9 j_mayer
        break;
324 4c9649a9 j_mayer
    case IPR_SISR:
325 4c9649a9 j_mayer
        /* Read-only */
326 4c9649a9 j_mayer
        ret = -1;
327 4c9649a9 j_mayer
        break;
328 4c9649a9 j_mayer
    case IPR_SSP:
329 4c9649a9 j_mayer
        if (env->features & FEATURE_SPS)
330 4c9649a9 j_mayer
            env->ipr[IPR_SSP] = val;
331 4c9649a9 j_mayer
        else
332 4c9649a9 j_mayer
            stq_raw(hwpcb + 16, val);
333 4c9649a9 j_mayer
        break;
334 4c9649a9 j_mayer
    case IPR_SYSPTBR:
335 4c9649a9 j_mayer
        if (env->features & FEATURE_VIRBND)
336 4c9649a9 j_mayer
            env->ipr[IPR_SYSPTBR] = val;
337 4c9649a9 j_mayer
        else
338 4c9649a9 j_mayer
            ret = -1;
339 4c9649a9 j_mayer
    case IPR_TBCHK:
340 4c9649a9 j_mayer
        /* Read-only */
341 4c9649a9 j_mayer
        ret = -1;
342 4c9649a9 j_mayer
        break;
343 4c9649a9 j_mayer
    case IPR_TBIA:
344 4c9649a9 j_mayer
        tlb_flush(env, 1);
345 4c9649a9 j_mayer
        break;
346 4c9649a9 j_mayer
    case IPR_TBIAP:
347 4c9649a9 j_mayer
        tlb_flush(env, 1);
348 4c9649a9 j_mayer
        break;
349 4c9649a9 j_mayer
    case IPR_TBIS:
350 4c9649a9 j_mayer
        tlb_flush_page(env, val);
351 4c9649a9 j_mayer
        break;
352 4c9649a9 j_mayer
    case IPR_TBISD:
353 4c9649a9 j_mayer
        tlb_flush_page(env, val);
354 4c9649a9 j_mayer
        break;
355 4c9649a9 j_mayer
    case IPR_TBISI:
356 4c9649a9 j_mayer
        tlb_flush_page(env, val);
357 4c9649a9 j_mayer
        break;
358 4c9649a9 j_mayer
    case IPR_USP:
359 4c9649a9 j_mayer
        if (env->features & FEATURE_SPS)
360 4c9649a9 j_mayer
            env->ipr[IPR_USP] = val;
361 4c9649a9 j_mayer
        else
362 4c9649a9 j_mayer
            stq_raw(hwpcb + 24, val);
363 4c9649a9 j_mayer
        break;
364 4c9649a9 j_mayer
    case IPR_VIRBND:
365 4c9649a9 j_mayer
        if (env->features & FEATURE_VIRBND)
366 4c9649a9 j_mayer
            env->ipr[IPR_VIRBND] = val;
367 4c9649a9 j_mayer
        else
368 4c9649a9 j_mayer
            ret = -1;
369 4c9649a9 j_mayer
        break;
370 4c9649a9 j_mayer
    case IPR_VPTB:
371 4c9649a9 j_mayer
        env->ipr[IPR_VPTB] = val;
372 4c9649a9 j_mayer
        break;
373 4c9649a9 j_mayer
    case IPR_WHAMI:
374 4c9649a9 j_mayer
        /* Read-only */
375 4c9649a9 j_mayer
        ret = -1;
376 4c9649a9 j_mayer
        break;
377 4c9649a9 j_mayer
    default:
378 4c9649a9 j_mayer
        /* Invalid */
379 4c9649a9 j_mayer
        ret = -1;
380 4c9649a9 j_mayer
        break;
381 4c9649a9 j_mayer
    }
382 4c9649a9 j_mayer
383 4c9649a9 j_mayer
    return ret;
384 4c9649a9 j_mayer
}
385 4c9649a9 j_mayer
386 4c9649a9 j_mayer
void do_interrupt (CPUState *env)
387 4c9649a9 j_mayer
{
388 4c9649a9 j_mayer
    int excp;
389 4c9649a9 j_mayer
390 4c9649a9 j_mayer
    env->ipr[IPR_EXC_ADDR] = env->pc | 1;
391 4c9649a9 j_mayer
    excp = env->exception_index;
392 4c9649a9 j_mayer
    env->exception_index = 0;
393 4c9649a9 j_mayer
    env->error_code = 0;
394 4c9649a9 j_mayer
    /* XXX: disable interrupts and memory mapping */
395 4c9649a9 j_mayer
    if (env->ipr[IPR_PAL_BASE] != -1ULL) {
396 4c9649a9 j_mayer
        /* We use native PALcode */
397 4c9649a9 j_mayer
        env->pc = env->ipr[IPR_PAL_BASE] + excp;
398 4c9649a9 j_mayer
    } else {
399 4c9649a9 j_mayer
        /* We use emulated PALcode */
400 4c9649a9 j_mayer
        call_pal(env);
401 4c9649a9 j_mayer
        /* Emulate REI */
402 4c9649a9 j_mayer
        env->pc = env->ipr[IPR_EXC_ADDR] & ~7;
403 4c9649a9 j_mayer
        env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1;
404 4c9649a9 j_mayer
        /* XXX: re-enable interrupts and memory mapping */
405 4c9649a9 j_mayer
    }
406 4c9649a9 j_mayer
}
407 4c9649a9 j_mayer
#endif
408 4c9649a9 j_mayer
409 5fafdf24 ths
void cpu_dump_state (CPUState *env, FILE *f,
410 4c9649a9 j_mayer
                     int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
411 4c9649a9 j_mayer
                     int flags)
412 4c9649a9 j_mayer
{
413 b55266b5 blueswir1
    static const char *linux_reg_names[] = {
414 4c9649a9 j_mayer
        "v0 ", "t0 ", "t1 ", "t2 ", "t3 ", "t4 ", "t5 ", "t6 ",
415 4c9649a9 j_mayer
        "t7 ", "s0 ", "s1 ", "s2 ", "s3 ", "s4 ", "s5 ", "fp ",
416 4c9649a9 j_mayer
        "a0 ", "a1 ", "a2 ", "a3 ", "a4 ", "a5 ", "t8 ", "t9 ",
417 4c9649a9 j_mayer
        "t10", "t11", "ra ", "t12", "at ", "gp ", "sp ", "zero",
418 4c9649a9 j_mayer
    };
419 4c9649a9 j_mayer
    int i;
420 4c9649a9 j_mayer
421 4c9649a9 j_mayer
    cpu_fprintf(f, "     PC  " TARGET_FMT_lx "      PS  " TARGET_FMT_lx "\n",
422 4c9649a9 j_mayer
                env->pc, env->ps);
423 4c9649a9 j_mayer
    for (i = 0; i < 31; i++) {
424 4c9649a9 j_mayer
        cpu_fprintf(f, "IR%02d %s " TARGET_FMT_lx " ", i,
425 4c9649a9 j_mayer
                    linux_reg_names[i], env->ir[i]);
426 4c9649a9 j_mayer
        if ((i % 3) == 2)
427 4c9649a9 j_mayer
            cpu_fprintf(f, "\n");
428 4c9649a9 j_mayer
    }
429 4c9649a9 j_mayer
    cpu_fprintf(f, "\n");
430 4c9649a9 j_mayer
    for (i = 0; i < 31; i++) {
431 4c9649a9 j_mayer
        cpu_fprintf(f, "FIR%02d    " TARGET_FMT_lx " ", i,
432 4c9649a9 j_mayer
                    *((uint64_t *)(&env->fir[i])));
433 4c9649a9 j_mayer
        if ((i % 3) == 2)
434 4c9649a9 j_mayer
            cpu_fprintf(f, "\n");
435 4c9649a9 j_mayer
    }
436 57a92c8e aurel32
    cpu_fprintf(f, "\nlock     " TARGET_FMT_lx "\n", env->lock);
437 4c9649a9 j_mayer
}