Statistics
| Branch: | Revision:

root / target-sparc / helper.c @ 2ca1d92b

History | View | Annotate | Download (45 kB)

1 e8af50a3 bellard
/*
2 e8af50a3 bellard
 *  sparc helpers
3 5fafdf24 ths
 *
4 83469015 bellard
 *  Copyright (c) 2003-2005 Fabrice Bellard
5 e8af50a3 bellard
 *
6 e8af50a3 bellard
 * This library is free software; you can redistribute it and/or
7 e8af50a3 bellard
 * modify it under the terms of the GNU Lesser General Public
8 e8af50a3 bellard
 * License as published by the Free Software Foundation; either
9 e8af50a3 bellard
 * version 2 of the License, or (at your option) any later version.
10 e8af50a3 bellard
 *
11 e8af50a3 bellard
 * This library is distributed in the hope that it will be useful,
12 e8af50a3 bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 e8af50a3 bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 e8af50a3 bellard
 * Lesser General Public License for more details.
15 e8af50a3 bellard
 *
16 e8af50a3 bellard
 * You should have received a copy of the GNU Lesser General Public
17 e8af50a3 bellard
 * License along with this library; if not, write to the Free Software
18 fad6cb1a aurel32
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA
19 e8af50a3 bellard
 */
20 ee5bbe38 bellard
#include <stdarg.h>
21 ee5bbe38 bellard
#include <stdlib.h>
22 ee5bbe38 bellard
#include <stdio.h>
23 ee5bbe38 bellard
#include <string.h>
24 ee5bbe38 bellard
#include <inttypes.h>
25 ee5bbe38 bellard
#include <signal.h>
26 ee5bbe38 bellard
#include <assert.h>
27 ee5bbe38 bellard
28 ee5bbe38 bellard
#include "cpu.h"
29 ee5bbe38 bellard
#include "exec-all.h"
30 ca10f867 aurel32
#include "qemu-common.h"
31 e8af50a3 bellard
32 e80cfcfc bellard
//#define DEBUG_MMU
33 64a88d5d blueswir1
//#define DEBUG_FEATURES
34 e8af50a3 bellard
35 22548760 blueswir1
static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *cpu_model);
36 c48fcb47 blueswir1
37 e8af50a3 bellard
/* Sparc MMU emulation */
38 e8af50a3 bellard
39 e8af50a3 bellard
/* thread support */
40 e8af50a3 bellard
41 797d5db0 blueswir1
static spinlock_t global_cpu_lock = SPIN_LOCK_UNLOCKED;
42 e8af50a3 bellard
43 e8af50a3 bellard
void cpu_lock(void)
44 e8af50a3 bellard
{
45 e8af50a3 bellard
    spin_lock(&global_cpu_lock);
46 e8af50a3 bellard
}
47 e8af50a3 bellard
48 e8af50a3 bellard
void cpu_unlock(void)
49 e8af50a3 bellard
{
50 e8af50a3 bellard
    spin_unlock(&global_cpu_lock);
51 e8af50a3 bellard
}
52 e8af50a3 bellard
53 5fafdf24 ths
#if defined(CONFIG_USER_ONLY)
54 9d893301 bellard
55 22548760 blueswir1
int cpu_sparc_handle_mmu_fault(CPUState *env1, target_ulong address, int rw,
56 6ebbf390 j_mayer
                               int mmu_idx, int is_softmmu)
57 9d893301 bellard
{
58 878d3096 bellard
    if (rw & 2)
59 22548760 blueswir1
        env1->exception_index = TT_TFAULT;
60 878d3096 bellard
    else
61 22548760 blueswir1
        env1->exception_index = TT_DFAULT;
62 9d893301 bellard
    return 1;
63 9d893301 bellard
}
64 9d893301 bellard
65 9d893301 bellard
#else
66 e8af50a3 bellard
67 3475187d bellard
#ifndef TARGET_SPARC64
68 83469015 bellard
/*
69 83469015 bellard
 * Sparc V8 Reference MMU (SRMMU)
70 83469015 bellard
 */
71 e8af50a3 bellard
static const int access_table[8][8] = {
72 a764a566 blueswir1
    { 0, 0, 0, 0, 8, 0, 12, 12 },
73 a764a566 blueswir1
    { 0, 0, 0, 0, 8, 0, 0, 0 },
74 a764a566 blueswir1
    { 8, 8, 0, 0, 0, 8, 12, 12 },
75 a764a566 blueswir1
    { 8, 8, 0, 0, 0, 8, 0, 0 },
76 a764a566 blueswir1
    { 8, 0, 8, 0, 8, 8, 12, 12 },
77 a764a566 blueswir1
    { 8, 0, 8, 0, 8, 0, 8, 0 },
78 a764a566 blueswir1
    { 8, 8, 8, 0, 8, 8, 12, 12 },
79 a764a566 blueswir1
    { 8, 8, 8, 0, 8, 8, 8, 0 }
80 e8af50a3 bellard
};
81 e8af50a3 bellard
82 227671c9 bellard
static const int perm_table[2][8] = {
83 227671c9 bellard
    {
84 227671c9 bellard
        PAGE_READ,
85 227671c9 bellard
        PAGE_READ | PAGE_WRITE,
86 227671c9 bellard
        PAGE_READ | PAGE_EXEC,
87 227671c9 bellard
        PAGE_READ | PAGE_WRITE | PAGE_EXEC,
88 227671c9 bellard
        PAGE_EXEC,
89 227671c9 bellard
        PAGE_READ | PAGE_WRITE,
90 227671c9 bellard
        PAGE_READ | PAGE_EXEC,
91 227671c9 bellard
        PAGE_READ | PAGE_WRITE | PAGE_EXEC
92 227671c9 bellard
    },
93 227671c9 bellard
    {
94 227671c9 bellard
        PAGE_READ,
95 227671c9 bellard
        PAGE_READ | PAGE_WRITE,
96 227671c9 bellard
        PAGE_READ | PAGE_EXEC,
97 227671c9 bellard
        PAGE_READ | PAGE_WRITE | PAGE_EXEC,
98 227671c9 bellard
        PAGE_EXEC,
99 227671c9 bellard
        PAGE_READ,
100 227671c9 bellard
        0,
101 227671c9 bellard
        0,
102 227671c9 bellard
    }
103 e8af50a3 bellard
};
104 e8af50a3 bellard
105 c48fcb47 blueswir1
static int get_physical_address(CPUState *env, target_phys_addr_t *physical,
106 c48fcb47 blueswir1
                                int *prot, int *access_index,
107 c48fcb47 blueswir1
                                target_ulong address, int rw, int mmu_idx)
108 e8af50a3 bellard
{
109 e80cfcfc bellard
    int access_perms = 0;
110 e80cfcfc bellard
    target_phys_addr_t pde_ptr;
111 af7bf89b bellard
    uint32_t pde;
112 af7bf89b bellard
    target_ulong virt_addr;
113 6ebbf390 j_mayer
    int error_code = 0, is_dirty, is_user;
114 e80cfcfc bellard
    unsigned long page_offset;
115 e8af50a3 bellard
116 6ebbf390 j_mayer
    is_user = mmu_idx == MMU_USER_IDX;
117 e8af50a3 bellard
    virt_addr = address & TARGET_PAGE_MASK;
118 40ce0a9a blueswir1
119 e8af50a3 bellard
    if ((env->mmuregs[0] & MMU_E) == 0) { /* MMU disabled */
120 40ce0a9a blueswir1
        // Boot mode: instruction fetches are taken from PROM
121 5578ceab blueswir1
        if (rw == 2 && (env->mmuregs[0] & env->def->mmu_bm)) {
122 58a770f3 blueswir1
            *physical = env->prom_addr | (address & 0x7ffffULL);
123 40ce0a9a blueswir1
            *prot = PAGE_READ | PAGE_EXEC;
124 40ce0a9a blueswir1
            return 0;
125 40ce0a9a blueswir1
        }
126 0f8a249a blueswir1
        *physical = address;
127 227671c9 bellard
        *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
128 e80cfcfc bellard
        return 0;
129 e8af50a3 bellard
    }
130 e8af50a3 bellard
131 7483750d bellard
    *access_index = ((rw & 1) << 2) | (rw & 2) | (is_user? 0 : 1);
132 5dcb6b91 blueswir1
    *physical = 0xffffffffffff0000ULL;
133 7483750d bellard
134 e8af50a3 bellard
    /* SPARC reference MMU table walk: Context table->L1->L2->PTE */
135 e8af50a3 bellard
    /* Context base + context number */
136 3deaeab7 blueswir1
    pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 2);
137 49be8030 bellard
    pde = ldl_phys(pde_ptr);
138 e8af50a3 bellard
139 e8af50a3 bellard
    /* Ctx pde */
140 e8af50a3 bellard
    switch (pde & PTE_ENTRYTYPE_MASK) {
141 e80cfcfc bellard
    default:
142 e8af50a3 bellard
    case 0: /* Invalid */
143 0f8a249a blueswir1
        return 1 << 2;
144 e80cfcfc bellard
    case 2: /* L0 PTE, maybe should not happen? */
145 e8af50a3 bellard
    case 3: /* Reserved */
146 7483750d bellard
        return 4 << 2;
147 e80cfcfc bellard
    case 1: /* L0 PDE */
148 0f8a249a blueswir1
        pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4);
149 49be8030 bellard
        pde = ldl_phys(pde_ptr);
150 e8af50a3 bellard
151 0f8a249a blueswir1
        switch (pde & PTE_ENTRYTYPE_MASK) {
152 0f8a249a blueswir1
        default:
153 0f8a249a blueswir1
        case 0: /* Invalid */
154 0f8a249a blueswir1
            return (1 << 8) | (1 << 2);
155 0f8a249a blueswir1
        case 3: /* Reserved */
156 0f8a249a blueswir1
            return (1 << 8) | (4 << 2);
157 0f8a249a blueswir1
        case 1: /* L1 PDE */
158 0f8a249a blueswir1
            pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4);
159 49be8030 bellard
            pde = ldl_phys(pde_ptr);
160 e8af50a3 bellard
161 0f8a249a blueswir1
            switch (pde & PTE_ENTRYTYPE_MASK) {
162 0f8a249a blueswir1
            default:
163 0f8a249a blueswir1
            case 0: /* Invalid */
164 0f8a249a blueswir1
                return (2 << 8) | (1 << 2);
165 0f8a249a blueswir1
            case 3: /* Reserved */
166 0f8a249a blueswir1
                return (2 << 8) | (4 << 2);
167 0f8a249a blueswir1
            case 1: /* L2 PDE */
168 0f8a249a blueswir1
                pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4);
169 49be8030 bellard
                pde = ldl_phys(pde_ptr);
170 e8af50a3 bellard
171 0f8a249a blueswir1
                switch (pde & PTE_ENTRYTYPE_MASK) {
172 0f8a249a blueswir1
                default:
173 0f8a249a blueswir1
                case 0: /* Invalid */
174 0f8a249a blueswir1
                    return (3 << 8) | (1 << 2);
175 0f8a249a blueswir1
                case 1: /* PDE, should not happen */
176 0f8a249a blueswir1
                case 3: /* Reserved */
177 0f8a249a blueswir1
                    return (3 << 8) | (4 << 2);
178 0f8a249a blueswir1
                case 2: /* L3 PTE */
179 0f8a249a blueswir1
                    virt_addr = address & TARGET_PAGE_MASK;
180 77f193da blueswir1
                    page_offset = (address & TARGET_PAGE_MASK) &
181 77f193da blueswir1
                        (TARGET_PAGE_SIZE - 1);
182 0f8a249a blueswir1
                }
183 0f8a249a blueswir1
                break;
184 0f8a249a blueswir1
            case 2: /* L2 PTE */
185 0f8a249a blueswir1
                virt_addr = address & ~0x3ffff;
186 0f8a249a blueswir1
                page_offset = address & 0x3ffff;
187 0f8a249a blueswir1
            }
188 0f8a249a blueswir1
            break;
189 0f8a249a blueswir1
        case 2: /* L1 PTE */
190 0f8a249a blueswir1
            virt_addr = address & ~0xffffff;
191 0f8a249a blueswir1
            page_offset = address & 0xffffff;
192 0f8a249a blueswir1
        }
193 e8af50a3 bellard
    }
194 e8af50a3 bellard
195 e8af50a3 bellard
    /* update page modified and dirty bits */
196 b769d8fe bellard
    is_dirty = (rw & 1) && !(pde & PG_MODIFIED_MASK);
197 e8af50a3 bellard
    if (!(pde & PG_ACCESSED_MASK) || is_dirty) {
198 0f8a249a blueswir1
        pde |= PG_ACCESSED_MASK;
199 0f8a249a blueswir1
        if (is_dirty)
200 0f8a249a blueswir1
            pde |= PG_MODIFIED_MASK;
201 49be8030 bellard
        stl_phys_notdirty(pde_ptr, pde);
202 e8af50a3 bellard
    }
203 e8af50a3 bellard
    /* check access */
204 e8af50a3 bellard
    access_perms = (pde & PTE_ACCESS_MASK) >> PTE_ACCESS_SHIFT;
205 e80cfcfc bellard
    error_code = access_table[*access_index][access_perms];
206 d8e3326c bellard
    if (error_code && !((env->mmuregs[0] & MMU_NF) && is_user))
207 0f8a249a blueswir1
        return error_code;
208 e8af50a3 bellard
209 e8af50a3 bellard
    /* the page can be put in the TLB */
210 227671c9 bellard
    *prot = perm_table[is_user][access_perms];
211 227671c9 bellard
    if (!(pde & PG_MODIFIED_MASK)) {
212 e8af50a3 bellard
        /* only set write access if already dirty... otherwise wait
213 e8af50a3 bellard
           for dirty access */
214 227671c9 bellard
        *prot &= ~PAGE_WRITE;
215 e8af50a3 bellard
    }
216 e8af50a3 bellard
217 e8af50a3 bellard
    /* Even if large ptes, we map only one 4KB page in the cache to
218 e8af50a3 bellard
       avoid filling it too fast */
219 5dcb6b91 blueswir1
    *physical = ((target_phys_addr_t)(pde & PTE_ADDR_MASK) << 4) + page_offset;
220 6f7e9aec bellard
    return error_code;
221 e80cfcfc bellard
}
222 e80cfcfc bellard
223 e80cfcfc bellard
/* Perform address translation */
224 af7bf89b bellard
int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
225 6ebbf390 j_mayer
                              int mmu_idx, int is_softmmu)
226 e80cfcfc bellard
{
227 af7bf89b bellard
    target_phys_addr_t paddr;
228 5dcb6b91 blueswir1
    target_ulong vaddr;
229 e80cfcfc bellard
    int error_code = 0, prot, ret = 0, access_index;
230 e8af50a3 bellard
231 77f193da blueswir1
    error_code = get_physical_address(env, &paddr, &prot, &access_index,
232 77f193da blueswir1
                                      address, rw, mmu_idx);
233 e80cfcfc bellard
    if (error_code == 0) {
234 0f8a249a blueswir1
        vaddr = address & TARGET_PAGE_MASK;
235 0f8a249a blueswir1
        paddr &= TARGET_PAGE_MASK;
236 9e61bde5 bellard
#ifdef DEBUG_MMU
237 0f8a249a blueswir1
        printf("Translate at " TARGET_FMT_lx " -> " TARGET_FMT_plx ", vaddr "
238 5dcb6b91 blueswir1
               TARGET_FMT_lx "\n", address, paddr, vaddr);
239 9e61bde5 bellard
#endif
240 6ebbf390 j_mayer
        ret = tlb_set_page_exec(env, vaddr, paddr, prot, mmu_idx, is_softmmu);
241 0f8a249a blueswir1
        return ret;
242 e80cfcfc bellard
    }
243 e8af50a3 bellard
244 e8af50a3 bellard
    if (env->mmuregs[3]) /* Fault status register */
245 0f8a249a blueswir1
        env->mmuregs[3] = 1; /* overflow (not read before another fault) */
246 7483750d bellard
    env->mmuregs[3] |= (access_index << 5) | error_code | 2;
247 e8af50a3 bellard
    env->mmuregs[4] = address; /* Fault address register */
248 e8af50a3 bellard
249 878d3096 bellard
    if ((env->mmuregs[0] & MMU_NF) || env->psret == 0)  {
250 6f7e9aec bellard
        // No fault mode: if a mapping is available, just override
251 6f7e9aec bellard
        // permissions. If no mapping is available, redirect accesses to
252 6f7e9aec bellard
        // neverland. Fake/overridden mappings will be flushed when
253 6f7e9aec bellard
        // switching to normal mode.
254 0f8a249a blueswir1
        vaddr = address & TARGET_PAGE_MASK;
255 227671c9 bellard
        prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
256 6ebbf390 j_mayer
        ret = tlb_set_page_exec(env, vaddr, paddr, prot, mmu_idx, is_softmmu);
257 0f8a249a blueswir1
        return ret;
258 7483750d bellard
    } else {
259 7483750d bellard
        if (rw & 2)
260 7483750d bellard
            env->exception_index = TT_TFAULT;
261 7483750d bellard
        else
262 7483750d bellard
            env->exception_index = TT_DFAULT;
263 7483750d bellard
        return 1;
264 878d3096 bellard
    }
265 e8af50a3 bellard
}
266 24741ef3 bellard
267 24741ef3 bellard
target_ulong mmu_probe(CPUState *env, target_ulong address, int mmulev)
268 24741ef3 bellard
{
269 24741ef3 bellard
    target_phys_addr_t pde_ptr;
270 24741ef3 bellard
    uint32_t pde;
271 24741ef3 bellard
272 24741ef3 bellard
    /* Context base + context number */
273 5dcb6b91 blueswir1
    pde_ptr = (target_phys_addr_t)(env->mmuregs[1] << 4) +
274 5dcb6b91 blueswir1
        (env->mmuregs[2] << 2);
275 24741ef3 bellard
    pde = ldl_phys(pde_ptr);
276 24741ef3 bellard
277 24741ef3 bellard
    switch (pde & PTE_ENTRYTYPE_MASK) {
278 24741ef3 bellard
    default:
279 24741ef3 bellard
    case 0: /* Invalid */
280 24741ef3 bellard
    case 2: /* PTE, maybe should not happen? */
281 24741ef3 bellard
    case 3: /* Reserved */
282 0f8a249a blueswir1
        return 0;
283 24741ef3 bellard
    case 1: /* L1 PDE */
284 0f8a249a blueswir1
        if (mmulev == 3)
285 0f8a249a blueswir1
            return pde;
286 0f8a249a blueswir1
        pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4);
287 24741ef3 bellard
        pde = ldl_phys(pde_ptr);
288 24741ef3 bellard
289 0f8a249a blueswir1
        switch (pde & PTE_ENTRYTYPE_MASK) {
290 0f8a249a blueswir1
        default:
291 0f8a249a blueswir1
        case 0: /* Invalid */
292 0f8a249a blueswir1
        case 3: /* Reserved */
293 0f8a249a blueswir1
            return 0;
294 0f8a249a blueswir1
        case 2: /* L1 PTE */
295 0f8a249a blueswir1
            return pde;
296 0f8a249a blueswir1
        case 1: /* L2 PDE */
297 0f8a249a blueswir1
            if (mmulev == 2)
298 0f8a249a blueswir1
                return pde;
299 0f8a249a blueswir1
            pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4);
300 24741ef3 bellard
            pde = ldl_phys(pde_ptr);
301 24741ef3 bellard
302 0f8a249a blueswir1
            switch (pde & PTE_ENTRYTYPE_MASK) {
303 0f8a249a blueswir1
            default:
304 0f8a249a blueswir1
            case 0: /* Invalid */
305 0f8a249a blueswir1
            case 3: /* Reserved */
306 0f8a249a blueswir1
                return 0;
307 0f8a249a blueswir1
            case 2: /* L2 PTE */
308 0f8a249a blueswir1
                return pde;
309 0f8a249a blueswir1
            case 1: /* L3 PDE */
310 0f8a249a blueswir1
                if (mmulev == 1)
311 0f8a249a blueswir1
                    return pde;
312 0f8a249a blueswir1
                pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4);
313 24741ef3 bellard
                pde = ldl_phys(pde_ptr);
314 24741ef3 bellard
315 0f8a249a blueswir1
                switch (pde & PTE_ENTRYTYPE_MASK) {
316 0f8a249a blueswir1
                default:
317 0f8a249a blueswir1
                case 0: /* Invalid */
318 0f8a249a blueswir1
                case 1: /* PDE, should not happen */
319 0f8a249a blueswir1
                case 3: /* Reserved */
320 0f8a249a blueswir1
                    return 0;
321 0f8a249a blueswir1
                case 2: /* L3 PTE */
322 0f8a249a blueswir1
                    return pde;
323 0f8a249a blueswir1
                }
324 0f8a249a blueswir1
            }
325 0f8a249a blueswir1
        }
326 24741ef3 bellard
    }
327 24741ef3 bellard
    return 0;
328 24741ef3 bellard
}
329 24741ef3 bellard
330 24741ef3 bellard
#ifdef DEBUG_MMU
331 24741ef3 bellard
void dump_mmu(CPUState *env)
332 24741ef3 bellard
{
333 5dcb6b91 blueswir1
    target_ulong va, va1, va2;
334 5dcb6b91 blueswir1
    unsigned int n, m, o;
335 5dcb6b91 blueswir1
    target_phys_addr_t pde_ptr, pa;
336 24741ef3 bellard
    uint32_t pde;
337 24741ef3 bellard
338 24741ef3 bellard
    printf("MMU dump:\n");
339 24741ef3 bellard
    pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 2);
340 24741ef3 bellard
    pde = ldl_phys(pde_ptr);
341 5dcb6b91 blueswir1
    printf("Root ptr: " TARGET_FMT_plx ", ctx: %d\n",
342 5dcb6b91 blueswir1
           (target_phys_addr_t)env->mmuregs[1] << 4, env->mmuregs[2]);
343 24741ef3 bellard
    for (n = 0, va = 0; n < 256; n++, va += 16 * 1024 * 1024) {
344 0f8a249a blueswir1
        pde = mmu_probe(env, va, 2);
345 0f8a249a blueswir1
        if (pde) {
346 0f8a249a blueswir1
            pa = cpu_get_phys_page_debug(env, va);
347 0f8a249a blueswir1
            printf("VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_plx
348 5dcb6b91 blueswir1
                   " PDE: " TARGET_FMT_lx "\n", va, pa, pde);
349 0f8a249a blueswir1
            for (m = 0, va1 = va; m < 64; m++, va1 += 256 * 1024) {
350 0f8a249a blueswir1
                pde = mmu_probe(env, va1, 1);
351 0f8a249a blueswir1
                if (pde) {
352 0f8a249a blueswir1
                    pa = cpu_get_phys_page_debug(env, va1);
353 0f8a249a blueswir1
                    printf(" VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_plx
354 5dcb6b91 blueswir1
                           " PDE: " TARGET_FMT_lx "\n", va1, pa, pde);
355 0f8a249a blueswir1
                    for (o = 0, va2 = va1; o < 64; o++, va2 += 4 * 1024) {
356 0f8a249a blueswir1
                        pde = mmu_probe(env, va2, 0);
357 0f8a249a blueswir1
                        if (pde) {
358 0f8a249a blueswir1
                            pa = cpu_get_phys_page_debug(env, va2);
359 0f8a249a blueswir1
                            printf("  VA: " TARGET_FMT_lx ", PA: "
360 5dcb6b91 blueswir1
                                   TARGET_FMT_plx " PTE: " TARGET_FMT_lx "\n",
361 5dcb6b91 blueswir1
                                   va2, pa, pde);
362 0f8a249a blueswir1
                        }
363 0f8a249a blueswir1
                    }
364 0f8a249a blueswir1
                }
365 0f8a249a blueswir1
            }
366 0f8a249a blueswir1
        }
367 24741ef3 bellard
    }
368 24741ef3 bellard
    printf("MMU dump ends\n");
369 24741ef3 bellard
}
370 24741ef3 bellard
#endif /* DEBUG_MMU */
371 24741ef3 bellard
372 24741ef3 bellard
#else /* !TARGET_SPARC64 */
373 83469015 bellard
/*
374 83469015 bellard
 * UltraSparc IIi I/DMMUs
375 83469015 bellard
 */
376 77f193da blueswir1
static int get_physical_address_data(CPUState *env,
377 77f193da blueswir1
                                     target_phys_addr_t *physical, int *prot,
378 22548760 blueswir1
                                     target_ulong address, int rw, int is_user)
379 3475187d bellard
{
380 3475187d bellard
    target_ulong mask;
381 3475187d bellard
    unsigned int i;
382 3475187d bellard
383 3475187d bellard
    if ((env->lsu & DMMU_E) == 0) { /* DMMU disabled */
384 0f8a249a blueswir1
        *physical = address;
385 0f8a249a blueswir1
        *prot = PAGE_READ | PAGE_WRITE;
386 3475187d bellard
        return 0;
387 3475187d bellard
    }
388 3475187d bellard
389 3475187d bellard
    for (i = 0; i < 64; i++) {
390 0f8a249a blueswir1
        switch ((env->dtlb_tte[i] >> 61) & 3) {
391 0f8a249a blueswir1
        default:
392 0f8a249a blueswir1
        case 0x0: // 8k
393 0f8a249a blueswir1
            mask = 0xffffffffffffe000ULL;
394 0f8a249a blueswir1
            break;
395 0f8a249a blueswir1
        case 0x1: // 64k
396 0f8a249a blueswir1
            mask = 0xffffffffffff0000ULL;
397 0f8a249a blueswir1
            break;
398 0f8a249a blueswir1
        case 0x2: // 512k
399 0f8a249a blueswir1
            mask = 0xfffffffffff80000ULL;
400 0f8a249a blueswir1
            break;
401 0f8a249a blueswir1
        case 0x3: // 4M
402 0f8a249a blueswir1
            mask = 0xffffffffffc00000ULL;
403 0f8a249a blueswir1
            break;
404 0f8a249a blueswir1
        }
405 afdf8109 blueswir1
        // ctx match, vaddr match, valid?
406 0f8a249a blueswir1
        if (env->dmmuregs[1] == (env->dtlb_tag[i] & 0x1fff) &&
407 82f2cfc3 Igor Kovalenko
            (address & mask) == (env->dtlb_tag[i] & mask) &&
408 afdf8109 blueswir1
            (env->dtlb_tte[i] & 0x8000000000000000ULL)) {
409 afdf8109 blueswir1
            // access ok?
410 afdf8109 blueswir1
            if (((env->dtlb_tte[i] & 0x4) && is_user) ||
411 0f8a249a blueswir1
                (!(env->dtlb_tte[i] & 0x2) && (rw == 1))) {
412 0f8a249a blueswir1
                if (env->dmmuregs[3]) /* Fault status register */
413 77f193da blueswir1
                    env->dmmuregs[3] = 2; /* overflow (not read before
414 77f193da blueswir1
                                             another fault) */
415 0f8a249a blueswir1
                env->dmmuregs[3] |= (is_user << 3) | ((rw == 1) << 2) | 1;
416 0f8a249a blueswir1
                env->dmmuregs[4] = address; /* Fault address register */
417 0f8a249a blueswir1
                env->exception_index = TT_DFAULT;
418 83469015 bellard
#ifdef DEBUG_MMU
419 0f8a249a blueswir1
                printf("DFAULT at 0x%" PRIx64 "\n", address);
420 83469015 bellard
#endif
421 0f8a249a blueswir1
                return 1;
422 0f8a249a blueswir1
            }
423 82f2cfc3 Igor Kovalenko
            *physical = ((env->dtlb_tte[i] & mask) | (address & ~mask)) &
424 82f2cfc3 Igor Kovalenko
                        0x1ffffffe000ULL;
425 0f8a249a blueswir1
            *prot = PAGE_READ;
426 0f8a249a blueswir1
            if (env->dtlb_tte[i] & 0x2)
427 0f8a249a blueswir1
                *prot |= PAGE_WRITE;
428 0f8a249a blueswir1
            return 0;
429 0f8a249a blueswir1
        }
430 3475187d bellard
    }
431 83469015 bellard
#ifdef DEBUG_MMU
432 26a76461 bellard
    printf("DMISS at 0x%" PRIx64 "\n", address);
433 83469015 bellard
#endif
434 f617a9a6 blueswir1
    env->dmmuregs[6] = (address & ~0x1fffULL) | (env->dmmuregs[1] & 0x1fff);
435 83469015 bellard
    env->exception_index = TT_DMISS;
436 3475187d bellard
    return 1;
437 3475187d bellard
}
438 3475187d bellard
439 77f193da blueswir1
static int get_physical_address_code(CPUState *env,
440 77f193da blueswir1
                                     target_phys_addr_t *physical, int *prot,
441 22548760 blueswir1
                                     target_ulong address, int is_user)
442 3475187d bellard
{
443 3475187d bellard
    target_ulong mask;
444 3475187d bellard
    unsigned int i;
445 3475187d bellard
446 3475187d bellard
    if ((env->lsu & IMMU_E) == 0) { /* IMMU disabled */
447 0f8a249a blueswir1
        *physical = address;
448 0f8a249a blueswir1
        *prot = PAGE_EXEC;
449 3475187d bellard
        return 0;
450 3475187d bellard
    }
451 83469015 bellard
452 3475187d bellard
    for (i = 0; i < 64; i++) {
453 0f8a249a blueswir1
        switch ((env->itlb_tte[i] >> 61) & 3) {
454 0f8a249a blueswir1
        default:
455 0f8a249a blueswir1
        case 0x0: // 8k
456 0f8a249a blueswir1
            mask = 0xffffffffffffe000ULL;
457 0f8a249a blueswir1
            break;
458 0f8a249a blueswir1
        case 0x1: // 64k
459 0f8a249a blueswir1
            mask = 0xffffffffffff0000ULL;
460 0f8a249a blueswir1
            break;
461 0f8a249a blueswir1
        case 0x2: // 512k
462 0f8a249a blueswir1
            mask = 0xfffffffffff80000ULL;
463 0f8a249a blueswir1
            break;
464 0f8a249a blueswir1
        case 0x3: // 4M
465 0f8a249a blueswir1
            mask = 0xffffffffffc00000ULL;
466 0f8a249a blueswir1
                break;
467 0f8a249a blueswir1
        }
468 afdf8109 blueswir1
        // ctx match, vaddr match, valid?
469 0f8a249a blueswir1
        if (env->dmmuregs[1] == (env->itlb_tag[i] & 0x1fff) &&
470 82f2cfc3 Igor Kovalenko
            (address & mask) == (env->itlb_tag[i] & mask) &&
471 afdf8109 blueswir1
            (env->itlb_tte[i] & 0x8000000000000000ULL)) {
472 afdf8109 blueswir1
            // access ok?
473 afdf8109 blueswir1
            if ((env->itlb_tte[i] & 0x4) && is_user) {
474 0f8a249a blueswir1
                if (env->immuregs[3]) /* Fault status register */
475 77f193da blueswir1
                    env->immuregs[3] = 2; /* overflow (not read before
476 77f193da blueswir1
                                             another fault) */
477 0f8a249a blueswir1
                env->immuregs[3] |= (is_user << 3) | 1;
478 0f8a249a blueswir1
                env->exception_index = TT_TFAULT;
479 83469015 bellard
#ifdef DEBUG_MMU
480 0f8a249a blueswir1
                printf("TFAULT at 0x%" PRIx64 "\n", address);
481 83469015 bellard
#endif
482 0f8a249a blueswir1
                return 1;
483 0f8a249a blueswir1
            }
484 82f2cfc3 Igor Kovalenko
            *physical = ((env->itlb_tte[i] & mask) | (address & ~mask)) &
485 82f2cfc3 Igor Kovalenko
                        0x1ffffffe000ULL;
486 0f8a249a blueswir1
            *prot = PAGE_EXEC;
487 0f8a249a blueswir1
            return 0;
488 0f8a249a blueswir1
        }
489 3475187d bellard
    }
490 83469015 bellard
#ifdef DEBUG_MMU
491 26a76461 bellard
    printf("TMISS at 0x%" PRIx64 "\n", address);
492 83469015 bellard
#endif
493 7ab463cb Blue Swirl
    /* Context is stored in DMMU (dmmuregs[1]) also for IMMU */
494 417728d8 Igor Kovalenko
    env->immuregs[6] = (address & ~0x1fffULL) | (env->dmmuregs[1] & 0x1fff);
495 83469015 bellard
    env->exception_index = TT_TMISS;
496 3475187d bellard
    return 1;
497 3475187d bellard
}
498 3475187d bellard
499 c48fcb47 blueswir1
static int get_physical_address(CPUState *env, target_phys_addr_t *physical,
500 c48fcb47 blueswir1
                                int *prot, int *access_index,
501 c48fcb47 blueswir1
                                target_ulong address, int rw, int mmu_idx)
502 3475187d bellard
{
503 6ebbf390 j_mayer
    int is_user = mmu_idx == MMU_USER_IDX;
504 6ebbf390 j_mayer
505 3475187d bellard
    if (rw == 2)
506 22548760 blueswir1
        return get_physical_address_code(env, physical, prot, address,
507 22548760 blueswir1
                                         is_user);
508 3475187d bellard
    else
509 22548760 blueswir1
        return get_physical_address_data(env, physical, prot, address, rw,
510 22548760 blueswir1
                                         is_user);
511 3475187d bellard
}
512 3475187d bellard
513 3475187d bellard
/* Perform address translation */
514 3475187d bellard
int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
515 6ebbf390 j_mayer
                              int mmu_idx, int is_softmmu)
516 3475187d bellard
{
517 83469015 bellard
    target_ulong virt_addr, vaddr;
518 3475187d bellard
    target_phys_addr_t paddr;
519 3475187d bellard
    int error_code = 0, prot, ret = 0, access_index;
520 3475187d bellard
521 77f193da blueswir1
    error_code = get_physical_address(env, &paddr, &prot, &access_index,
522 77f193da blueswir1
                                      address, rw, mmu_idx);
523 3475187d bellard
    if (error_code == 0) {
524 0f8a249a blueswir1
        virt_addr = address & TARGET_PAGE_MASK;
525 77f193da blueswir1
        vaddr = virt_addr + ((address & TARGET_PAGE_MASK) &
526 77f193da blueswir1
                             (TARGET_PAGE_SIZE - 1));
527 83469015 bellard
#ifdef DEBUG_MMU
528 77f193da blueswir1
        printf("Translate at 0x%" PRIx64 " -> 0x%" PRIx64 ", vaddr 0x%" PRIx64
529 77f193da blueswir1
               "\n", address, paddr, vaddr);
530 83469015 bellard
#endif
531 6ebbf390 j_mayer
        ret = tlb_set_page_exec(env, vaddr, paddr, prot, mmu_idx, is_softmmu);
532 0f8a249a blueswir1
        return ret;
533 3475187d bellard
    }
534 3475187d bellard
    // XXX
535 3475187d bellard
    return 1;
536 3475187d bellard
}
537 3475187d bellard
538 83469015 bellard
#ifdef DEBUG_MMU
539 83469015 bellard
void dump_mmu(CPUState *env)
540 83469015 bellard
{
541 83469015 bellard
    unsigned int i;
542 83469015 bellard
    const char *mask;
543 83469015 bellard
544 77f193da blueswir1
    printf("MMU contexts: Primary: %" PRId64 ", Secondary: %" PRId64 "\n",
545 77f193da blueswir1
           env->dmmuregs[1], env->dmmuregs[2]);
546 83469015 bellard
    if ((env->lsu & DMMU_E) == 0) {
547 0f8a249a blueswir1
        printf("DMMU disabled\n");
548 83469015 bellard
    } else {
549 0f8a249a blueswir1
        printf("DMMU dump:\n");
550 0f8a249a blueswir1
        for (i = 0; i < 64; i++) {
551 0f8a249a blueswir1
            switch ((env->dtlb_tte[i] >> 61) & 3) {
552 0f8a249a blueswir1
            default:
553 0f8a249a blueswir1
            case 0x0:
554 0f8a249a blueswir1
                mask = "  8k";
555 0f8a249a blueswir1
                break;
556 0f8a249a blueswir1
            case 0x1:
557 0f8a249a blueswir1
                mask = " 64k";
558 0f8a249a blueswir1
                break;
559 0f8a249a blueswir1
            case 0x2:
560 0f8a249a blueswir1
                mask = "512k";
561 0f8a249a blueswir1
                break;
562 0f8a249a blueswir1
            case 0x3:
563 0f8a249a blueswir1
                mask = "  4M";
564 0f8a249a blueswir1
                break;
565 0f8a249a blueswir1
            }
566 0f8a249a blueswir1
            if ((env->dtlb_tte[i] & 0x8000000000000000ULL) != 0) {
567 77f193da blueswir1
                printf("VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx
568 77f193da blueswir1
                       ", %s, %s, %s, %s, ctx %" PRId64 "\n",
569 0f8a249a blueswir1
                       env->dtlb_tag[i] & ~0x1fffULL,
570 0f8a249a blueswir1
                       env->dtlb_tte[i] & 0x1ffffffe000ULL,
571 0f8a249a blueswir1
                       mask,
572 0f8a249a blueswir1
                       env->dtlb_tte[i] & 0x4? "priv": "user",
573 0f8a249a blueswir1
                       env->dtlb_tte[i] & 0x2? "RW": "RO",
574 0f8a249a blueswir1
                       env->dtlb_tte[i] & 0x40? "locked": "unlocked",
575 0f8a249a blueswir1
                       env->dtlb_tag[i] & 0x1fffULL);
576 0f8a249a blueswir1
            }
577 0f8a249a blueswir1
        }
578 83469015 bellard
    }
579 83469015 bellard
    if ((env->lsu & IMMU_E) == 0) {
580 0f8a249a blueswir1
        printf("IMMU disabled\n");
581 83469015 bellard
    } else {
582 0f8a249a blueswir1
        printf("IMMU dump:\n");
583 0f8a249a blueswir1
        for (i = 0; i < 64; i++) {
584 0f8a249a blueswir1
            switch ((env->itlb_tte[i] >> 61) & 3) {
585 0f8a249a blueswir1
            default:
586 0f8a249a blueswir1
            case 0x0:
587 0f8a249a blueswir1
                mask = "  8k";
588 0f8a249a blueswir1
                break;
589 0f8a249a blueswir1
            case 0x1:
590 0f8a249a blueswir1
                mask = " 64k";
591 0f8a249a blueswir1
                break;
592 0f8a249a blueswir1
            case 0x2:
593 0f8a249a blueswir1
                mask = "512k";
594 0f8a249a blueswir1
                break;
595 0f8a249a blueswir1
            case 0x3:
596 0f8a249a blueswir1
                mask = "  4M";
597 0f8a249a blueswir1
                break;
598 0f8a249a blueswir1
            }
599 0f8a249a blueswir1
            if ((env->itlb_tte[i] & 0x8000000000000000ULL) != 0) {
600 77f193da blueswir1
                printf("VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx
601 77f193da blueswir1
                       ", %s, %s, %s, ctx %" PRId64 "\n",
602 0f8a249a blueswir1
                       env->itlb_tag[i] & ~0x1fffULL,
603 0f8a249a blueswir1
                       env->itlb_tte[i] & 0x1ffffffe000ULL,
604 0f8a249a blueswir1
                       mask,
605 0f8a249a blueswir1
                       env->itlb_tte[i] & 0x4? "priv": "user",
606 0f8a249a blueswir1
                       env->itlb_tte[i] & 0x40? "locked": "unlocked",
607 0f8a249a blueswir1
                       env->itlb_tag[i] & 0x1fffULL);
608 0f8a249a blueswir1
            }
609 0f8a249a blueswir1
        }
610 83469015 bellard
    }
611 83469015 bellard
}
612 24741ef3 bellard
#endif /* DEBUG_MMU */
613 24741ef3 bellard
614 24741ef3 bellard
#endif /* TARGET_SPARC64 */
615 24741ef3 bellard
#endif /* !CONFIG_USER_ONLY */
616 24741ef3 bellard
617 c48fcb47 blueswir1
618 c48fcb47 blueswir1
#if defined(CONFIG_USER_ONLY)
619 c48fcb47 blueswir1
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
620 c48fcb47 blueswir1
{
621 c48fcb47 blueswir1
    return addr;
622 c48fcb47 blueswir1
}
623 c48fcb47 blueswir1
624 c48fcb47 blueswir1
#else
625 c48fcb47 blueswir1
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
626 c48fcb47 blueswir1
{
627 c48fcb47 blueswir1
    target_phys_addr_t phys_addr;
628 c48fcb47 blueswir1
    int prot, access_index;
629 c48fcb47 blueswir1
630 c48fcb47 blueswir1
    if (get_physical_address(env, &phys_addr, &prot, &access_index, addr, 2,
631 c48fcb47 blueswir1
                             MMU_KERNEL_IDX) != 0)
632 c48fcb47 blueswir1
        if (get_physical_address(env, &phys_addr, &prot, &access_index, addr,
633 c48fcb47 blueswir1
                                 0, MMU_KERNEL_IDX) != 0)
634 c48fcb47 blueswir1
            return -1;
635 c48fcb47 blueswir1
    if (cpu_get_physical_page_desc(phys_addr) == IO_MEM_UNASSIGNED)
636 c48fcb47 blueswir1
        return -1;
637 c48fcb47 blueswir1
    return phys_addr;
638 c48fcb47 blueswir1
}
639 c48fcb47 blueswir1
#endif
640 c48fcb47 blueswir1
641 c48fcb47 blueswir1
void cpu_reset(CPUSPARCState *env)
642 c48fcb47 blueswir1
{
643 eca1bdf4 aliguori
    if (qemu_loglevel_mask(CPU_LOG_RESET)) {
644 eca1bdf4 aliguori
        qemu_log("CPU Reset (CPU %d)\n", env->cpu_index);
645 eca1bdf4 aliguori
        log_cpu_state(env, 0);
646 eca1bdf4 aliguori
    }
647 eca1bdf4 aliguori
648 c48fcb47 blueswir1
    tlb_flush(env, 1);
649 c48fcb47 blueswir1
    env->cwp = 0;
650 c48fcb47 blueswir1
    env->wim = 1;
651 c48fcb47 blueswir1
    env->regwptr = env->regbase + (env->cwp * 16);
652 c48fcb47 blueswir1
#if defined(CONFIG_USER_ONLY)
653 c48fcb47 blueswir1
#ifdef TARGET_SPARC64
654 1a14026e blueswir1
    env->cleanwin = env->nwindows - 2;
655 1a14026e blueswir1
    env->cansave = env->nwindows - 2;
656 c48fcb47 blueswir1
    env->pstate = PS_RMO | PS_PEF | PS_IE;
657 c48fcb47 blueswir1
    env->asi = 0x82; // Primary no-fault
658 c48fcb47 blueswir1
#endif
659 c48fcb47 blueswir1
#else
660 c48fcb47 blueswir1
    env->psret = 0;
661 c48fcb47 blueswir1
    env->psrs = 1;
662 c48fcb47 blueswir1
    env->psrps = 1;
663 8393617c Blue Swirl
    CC_OP = CC_OP_FLAGS;
664 c48fcb47 blueswir1
#ifdef TARGET_SPARC64
665 c48fcb47 blueswir1
    env->pstate = PS_PRIV;
666 c48fcb47 blueswir1
    env->hpstate = HS_PRIV;
667 c19148bd blueswir1
    env->tsptr = &env->ts[env->tl & MAXTL_MASK];
668 415fc906 blueswir1
    env->lsu = 0;
669 c48fcb47 blueswir1
#else
670 c48fcb47 blueswir1
    env->mmuregs[0] &= ~(MMU_E | MMU_NF);
671 5578ceab blueswir1
    env->mmuregs[0] |= env->def->mmu_bm;
672 c48fcb47 blueswir1
#endif
673 e87231d4 blueswir1
    env->pc = 0;
674 c48fcb47 blueswir1
    env->npc = env->pc + 4;
675 c48fcb47 blueswir1
#endif
676 c48fcb47 blueswir1
}
677 c48fcb47 blueswir1
678 64a88d5d blueswir1
static int cpu_sparc_register(CPUSPARCState *env, const char *cpu_model)
679 c48fcb47 blueswir1
{
680 64a88d5d blueswir1
    sparc_def_t def1, *def = &def1;
681 c48fcb47 blueswir1
682 64a88d5d blueswir1
    if (cpu_sparc_find_by_name(def, cpu_model) < 0)
683 64a88d5d blueswir1
        return -1;
684 c48fcb47 blueswir1
685 5578ceab blueswir1
    env->def = qemu_mallocz(sizeof(*def));
686 5578ceab blueswir1
    memcpy(env->def, def, sizeof(*def));
687 5578ceab blueswir1
#if defined(CONFIG_USER_ONLY)
688 5578ceab blueswir1
    if ((env->def->features & CPU_FEATURE_FLOAT))
689 5578ceab blueswir1
        env->def->features |= CPU_FEATURE_FLOAT128;
690 5578ceab blueswir1
#endif
691 c48fcb47 blueswir1
    env->cpu_model_str = cpu_model;
692 c48fcb47 blueswir1
    env->version = def->iu_version;
693 c48fcb47 blueswir1
    env->fsr = def->fpu_version;
694 1a14026e blueswir1
    env->nwindows = def->nwindows;
695 c48fcb47 blueswir1
#if !defined(TARGET_SPARC64)
696 c48fcb47 blueswir1
    env->mmuregs[0] |= def->mmu_version;
697 c48fcb47 blueswir1
    cpu_sparc_set_id(env, 0);
698 963262de blueswir1
    env->mxccregs[7] |= def->mxcc_version;
699 1a14026e blueswir1
#else
700 fb79ceb9 blueswir1
    env->mmu_version = def->mmu_version;
701 c19148bd blueswir1
    env->maxtl = def->maxtl;
702 c19148bd blueswir1
    env->version |= def->maxtl << 8;
703 1a14026e blueswir1
    env->version |= def->nwindows - 1;
704 c48fcb47 blueswir1
#endif
705 64a88d5d blueswir1
    return 0;
706 64a88d5d blueswir1
}
707 64a88d5d blueswir1
708 64a88d5d blueswir1
static void cpu_sparc_close(CPUSPARCState *env)
709 64a88d5d blueswir1
{
710 5578ceab blueswir1
    free(env->def);
711 64a88d5d blueswir1
    free(env);
712 64a88d5d blueswir1
}
713 64a88d5d blueswir1
714 64a88d5d blueswir1
CPUSPARCState *cpu_sparc_init(const char *cpu_model)
715 64a88d5d blueswir1
{
716 64a88d5d blueswir1
    CPUSPARCState *env;
717 64a88d5d blueswir1
718 64a88d5d blueswir1
    env = qemu_mallocz(sizeof(CPUSPARCState));
719 64a88d5d blueswir1
    cpu_exec_init(env);
720 c48fcb47 blueswir1
721 c48fcb47 blueswir1
    gen_intermediate_code_init(env);
722 c48fcb47 blueswir1
723 64a88d5d blueswir1
    if (cpu_sparc_register(env, cpu_model) < 0) {
724 64a88d5d blueswir1
        cpu_sparc_close(env);
725 64a88d5d blueswir1
        return NULL;
726 64a88d5d blueswir1
    }
727 c48fcb47 blueswir1
    cpu_reset(env);
728 0bf46a40 aliguori
    qemu_init_vcpu(env);
729 c48fcb47 blueswir1
730 c48fcb47 blueswir1
    return env;
731 c48fcb47 blueswir1
}
732 c48fcb47 blueswir1
733 c48fcb47 blueswir1
void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu)
734 c48fcb47 blueswir1
{
735 c48fcb47 blueswir1
#if !defined(TARGET_SPARC64)
736 c48fcb47 blueswir1
    env->mxccregs[7] = ((cpu + 8) & 0xf) << 24;
737 c48fcb47 blueswir1
#endif
738 c48fcb47 blueswir1
}
739 c48fcb47 blueswir1
740 c48fcb47 blueswir1
static const sparc_def_t sparc_defs[] = {
741 c48fcb47 blueswir1
#ifdef TARGET_SPARC64
742 c48fcb47 blueswir1
    {
743 c48fcb47 blueswir1
        .name = "Fujitsu Sparc64",
744 c19148bd blueswir1
        .iu_version = ((0x04ULL << 48) | (0x02ULL << 32) | (0ULL << 24)),
745 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
746 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
747 1a14026e blueswir1
        .nwindows = 4,
748 c19148bd blueswir1
        .maxtl = 4,
749 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
750 c48fcb47 blueswir1
    },
751 c48fcb47 blueswir1
    {
752 c48fcb47 blueswir1
        .name = "Fujitsu Sparc64 III",
753 c19148bd blueswir1
        .iu_version = ((0x04ULL << 48) | (0x03ULL << 32) | (0ULL << 24)),
754 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
755 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
756 1a14026e blueswir1
        .nwindows = 5,
757 c19148bd blueswir1
        .maxtl = 4,
758 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
759 c48fcb47 blueswir1
    },
760 c48fcb47 blueswir1
    {
761 c48fcb47 blueswir1
        .name = "Fujitsu Sparc64 IV",
762 c19148bd blueswir1
        .iu_version = ((0x04ULL << 48) | (0x04ULL << 32) | (0ULL << 24)),
763 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
764 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
765 1a14026e blueswir1
        .nwindows = 8,
766 c19148bd blueswir1
        .maxtl = 5,
767 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
768 c48fcb47 blueswir1
    },
769 c48fcb47 blueswir1
    {
770 c48fcb47 blueswir1
        .name = "Fujitsu Sparc64 V",
771 c19148bd blueswir1
        .iu_version = ((0x04ULL << 48) | (0x05ULL << 32) | (0x51ULL << 24)),
772 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
773 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
774 1a14026e blueswir1
        .nwindows = 8,
775 c19148bd blueswir1
        .maxtl = 5,
776 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
777 c48fcb47 blueswir1
    },
778 c48fcb47 blueswir1
    {
779 c48fcb47 blueswir1
        .name = "TI UltraSparc I",
780 c19148bd blueswir1
        .iu_version = ((0x17ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)),
781 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
782 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
783 1a14026e blueswir1
        .nwindows = 8,
784 c19148bd blueswir1
        .maxtl = 5,
785 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
786 c48fcb47 blueswir1
    },
787 c48fcb47 blueswir1
    {
788 c48fcb47 blueswir1
        .name = "TI UltraSparc II",
789 c19148bd blueswir1
        .iu_version = ((0x17ULL << 48) | (0x11ULL << 32) | (0x20ULL << 24)),
790 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
791 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
792 1a14026e blueswir1
        .nwindows = 8,
793 c19148bd blueswir1
        .maxtl = 5,
794 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
795 c48fcb47 blueswir1
    },
796 c48fcb47 blueswir1
    {
797 c48fcb47 blueswir1
        .name = "TI UltraSparc IIi",
798 c19148bd blueswir1
        .iu_version = ((0x17ULL << 48) | (0x12ULL << 32) | (0x91ULL << 24)),
799 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
800 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
801 1a14026e blueswir1
        .nwindows = 8,
802 c19148bd blueswir1
        .maxtl = 5,
803 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
804 c48fcb47 blueswir1
    },
805 c48fcb47 blueswir1
    {
806 c48fcb47 blueswir1
        .name = "TI UltraSparc IIe",
807 c19148bd blueswir1
        .iu_version = ((0x17ULL << 48) | (0x13ULL << 32) | (0x14ULL << 24)),
808 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
809 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
810 1a14026e blueswir1
        .nwindows = 8,
811 c19148bd blueswir1
        .maxtl = 5,
812 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
813 c48fcb47 blueswir1
    },
814 c48fcb47 blueswir1
    {
815 c48fcb47 blueswir1
        .name = "Sun UltraSparc III",
816 c19148bd blueswir1
        .iu_version = ((0x3eULL << 48) | (0x14ULL << 32) | (0x34ULL << 24)),
817 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
818 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
819 1a14026e blueswir1
        .nwindows = 8,
820 c19148bd blueswir1
        .maxtl = 5,
821 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
822 c48fcb47 blueswir1
    },
823 c48fcb47 blueswir1
    {
824 c48fcb47 blueswir1
        .name = "Sun UltraSparc III Cu",
825 c19148bd blueswir1
        .iu_version = ((0x3eULL << 48) | (0x15ULL << 32) | (0x41ULL << 24)),
826 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
827 fb79ceb9 blueswir1
        .mmu_version = mmu_us_3,
828 1a14026e blueswir1
        .nwindows = 8,
829 c19148bd blueswir1
        .maxtl = 5,
830 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
831 c48fcb47 blueswir1
    },
832 c48fcb47 blueswir1
    {
833 c48fcb47 blueswir1
        .name = "Sun UltraSparc IIIi",
834 c19148bd blueswir1
        .iu_version = ((0x3eULL << 48) | (0x16ULL << 32) | (0x34ULL << 24)),
835 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
836 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
837 1a14026e blueswir1
        .nwindows = 8,
838 c19148bd blueswir1
        .maxtl = 5,
839 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
840 c48fcb47 blueswir1
    },
841 c48fcb47 blueswir1
    {
842 c48fcb47 blueswir1
        .name = "Sun UltraSparc IV",
843 c19148bd blueswir1
        .iu_version = ((0x3eULL << 48) | (0x18ULL << 32) | (0x31ULL << 24)),
844 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
845 fb79ceb9 blueswir1
        .mmu_version = mmu_us_4,
846 1a14026e blueswir1
        .nwindows = 8,
847 c19148bd blueswir1
        .maxtl = 5,
848 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
849 c48fcb47 blueswir1
    },
850 c48fcb47 blueswir1
    {
851 c48fcb47 blueswir1
        .name = "Sun UltraSparc IV+",
852 c19148bd blueswir1
        .iu_version = ((0x3eULL << 48) | (0x19ULL << 32) | (0x22ULL << 24)),
853 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
854 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
855 1a14026e blueswir1
        .nwindows = 8,
856 c19148bd blueswir1
        .maxtl = 5,
857 fb79ceb9 blueswir1
        .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_CMT,
858 c48fcb47 blueswir1
    },
859 c48fcb47 blueswir1
    {
860 c48fcb47 blueswir1
        .name = "Sun UltraSparc IIIi+",
861 c19148bd blueswir1
        .iu_version = ((0x3eULL << 48) | (0x22ULL << 32) | (0ULL << 24)),
862 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
863 fb79ceb9 blueswir1
        .mmu_version = mmu_us_3,
864 1a14026e blueswir1
        .nwindows = 8,
865 c19148bd blueswir1
        .maxtl = 5,
866 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
867 c48fcb47 blueswir1
    },
868 c48fcb47 blueswir1
    {
869 c7ba218d blueswir1
        .name = "Sun UltraSparc T1",
870 c7ba218d blueswir1
        // defined in sparc_ifu_fdp.v and ctu.h
871 c19148bd blueswir1
        .iu_version = ((0x3eULL << 48) | (0x23ULL << 32) | (0x02ULL << 24)),
872 c7ba218d blueswir1
        .fpu_version = 0x00000000,
873 c7ba218d blueswir1
        .mmu_version = mmu_sun4v,
874 c7ba218d blueswir1
        .nwindows = 8,
875 c19148bd blueswir1
        .maxtl = 6,
876 c7ba218d blueswir1
        .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_HYPV | CPU_FEATURE_CMT
877 c7ba218d blueswir1
        | CPU_FEATURE_GL,
878 c7ba218d blueswir1
    },
879 c7ba218d blueswir1
    {
880 c7ba218d blueswir1
        .name = "Sun UltraSparc T2",
881 c7ba218d blueswir1
        // defined in tlu_asi_ctl.v and n2_revid_cust.v
882 c19148bd blueswir1
        .iu_version = ((0x3eULL << 48) | (0x24ULL << 32) | (0x02ULL << 24)),
883 c7ba218d blueswir1
        .fpu_version = 0x00000000,
884 c7ba218d blueswir1
        .mmu_version = mmu_sun4v,
885 c7ba218d blueswir1
        .nwindows = 8,
886 c19148bd blueswir1
        .maxtl = 6,
887 c7ba218d blueswir1
        .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_HYPV | CPU_FEATURE_CMT
888 c7ba218d blueswir1
        | CPU_FEATURE_GL,
889 c7ba218d blueswir1
    },
890 c7ba218d blueswir1
    {
891 c48fcb47 blueswir1
        .name = "NEC UltraSparc I",
892 c19148bd blueswir1
        .iu_version = ((0x22ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)),
893 c48fcb47 blueswir1
        .fpu_version = 0x00000000,
894 fb79ceb9 blueswir1
        .mmu_version = mmu_us_12,
895 1a14026e blueswir1
        .nwindows = 8,
896 c19148bd blueswir1
        .maxtl = 5,
897 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
898 c48fcb47 blueswir1
    },
899 c48fcb47 blueswir1
#else
900 c48fcb47 blueswir1
    {
901 c48fcb47 blueswir1
        .name = "Fujitsu MB86900",
902 c48fcb47 blueswir1
        .iu_version = 0x00 << 24, /* Impl 0, ver 0 */
903 c48fcb47 blueswir1
        .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
904 c48fcb47 blueswir1
        .mmu_version = 0x00 << 24, /* Impl 0, ver 0 */
905 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
906 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
907 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
908 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
909 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
910 1a14026e blueswir1
        .nwindows = 7,
911 e30b4678 blueswir1
        .features = CPU_FEATURE_FLOAT | CPU_FEATURE_FSMULD,
912 c48fcb47 blueswir1
    },
913 c48fcb47 blueswir1
    {
914 c48fcb47 blueswir1
        .name = "Fujitsu MB86904",
915 c48fcb47 blueswir1
        .iu_version = 0x04 << 24, /* Impl 0, ver 4 */
916 c48fcb47 blueswir1
        .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
917 c48fcb47 blueswir1
        .mmu_version = 0x04 << 24, /* Impl 0, ver 4 */
918 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
919 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x00ffffc0,
920 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x000000ff,
921 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0x00016fff,
922 c48fcb47 blueswir1
        .mmu_trcr_mask = 0x00ffffff,
923 1a14026e blueswir1
        .nwindows = 8,
924 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
925 c48fcb47 blueswir1
    },
926 c48fcb47 blueswir1
    {
927 c48fcb47 blueswir1
        .name = "Fujitsu MB86907",
928 c48fcb47 blueswir1
        .iu_version = 0x05 << 24, /* Impl 0, ver 5 */
929 c48fcb47 blueswir1
        .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
930 c48fcb47 blueswir1
        .mmu_version = 0x05 << 24, /* Impl 0, ver 5 */
931 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
932 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0xffffffc0,
933 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x000000ff,
934 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0x00016fff,
935 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
936 1a14026e blueswir1
        .nwindows = 8,
937 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
938 c48fcb47 blueswir1
    },
939 c48fcb47 blueswir1
    {
940 c48fcb47 blueswir1
        .name = "LSI L64811",
941 c48fcb47 blueswir1
        .iu_version = 0x10 << 24, /* Impl 1, ver 0 */
942 c48fcb47 blueswir1
        .fpu_version = 1 << 17, /* FPU version 1 (LSI L64814) */
943 c48fcb47 blueswir1
        .mmu_version = 0x10 << 24,
944 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
945 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
946 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
947 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
948 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
949 1a14026e blueswir1
        .nwindows = 8,
950 e30b4678 blueswir1
        .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT |
951 e30b4678 blueswir1
        CPU_FEATURE_FSMULD,
952 c48fcb47 blueswir1
    },
953 c48fcb47 blueswir1
    {
954 c48fcb47 blueswir1
        .name = "Cypress CY7C601",
955 c48fcb47 blueswir1
        .iu_version = 0x11 << 24, /* Impl 1, ver 1 */
956 c48fcb47 blueswir1
        .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */
957 c48fcb47 blueswir1
        .mmu_version = 0x10 << 24,
958 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
959 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
960 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
961 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
962 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
963 1a14026e blueswir1
        .nwindows = 8,
964 e30b4678 blueswir1
        .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT |
965 e30b4678 blueswir1
        CPU_FEATURE_FSMULD,
966 c48fcb47 blueswir1
    },
967 c48fcb47 blueswir1
    {
968 c48fcb47 blueswir1
        .name = "Cypress CY7C611",
969 c48fcb47 blueswir1
        .iu_version = 0x13 << 24, /* Impl 1, ver 3 */
970 c48fcb47 blueswir1
        .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */
971 c48fcb47 blueswir1
        .mmu_version = 0x10 << 24,
972 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
973 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
974 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
975 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
976 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
977 1a14026e blueswir1
        .nwindows = 8,
978 e30b4678 blueswir1
        .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT |
979 e30b4678 blueswir1
        CPU_FEATURE_FSMULD,
980 c48fcb47 blueswir1
    },
981 c48fcb47 blueswir1
    {
982 c48fcb47 blueswir1
        .name = "TI MicroSparc I",
983 c48fcb47 blueswir1
        .iu_version = 0x41000000,
984 c48fcb47 blueswir1
        .fpu_version = 4 << 17,
985 c48fcb47 blueswir1
        .mmu_version = 0x41000000,
986 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
987 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
988 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
989 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0x00016fff,
990 c48fcb47 blueswir1
        .mmu_trcr_mask = 0x0000003f,
991 1a14026e blueswir1
        .nwindows = 7,
992 e30b4678 blueswir1
        .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_MUL |
993 e30b4678 blueswir1
        CPU_FEATURE_DIV | CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT |
994 e30b4678 blueswir1
        CPU_FEATURE_FMUL,
995 c48fcb47 blueswir1
    },
996 c48fcb47 blueswir1
    {
997 c48fcb47 blueswir1
        .name = "TI MicroSparc II",
998 c48fcb47 blueswir1
        .iu_version = 0x42000000,
999 c48fcb47 blueswir1
        .fpu_version = 4 << 17,
1000 c48fcb47 blueswir1
        .mmu_version = 0x02000000,
1001 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
1002 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x00ffffc0,
1003 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x000000ff,
1004 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0x00016fff,
1005 c48fcb47 blueswir1
        .mmu_trcr_mask = 0x00ffffff,
1006 1a14026e blueswir1
        .nwindows = 8,
1007 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
1008 c48fcb47 blueswir1
    },
1009 c48fcb47 blueswir1
    {
1010 c48fcb47 blueswir1
        .name = "TI MicroSparc IIep",
1011 c48fcb47 blueswir1
        .iu_version = 0x42000000,
1012 c48fcb47 blueswir1
        .fpu_version = 4 << 17,
1013 c48fcb47 blueswir1
        .mmu_version = 0x04000000,
1014 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
1015 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x00ffffc0,
1016 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x000000ff,
1017 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0x00016bff,
1018 c48fcb47 blueswir1
        .mmu_trcr_mask = 0x00ffffff,
1019 1a14026e blueswir1
        .nwindows = 8,
1020 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
1021 c48fcb47 blueswir1
    },
1022 c48fcb47 blueswir1
    {
1023 b5154bde blueswir1
        .name = "TI SuperSparc 40", // STP1020NPGA
1024 963262de blueswir1
        .iu_version = 0x41000000, // SuperSPARC 2.x
1025 b5154bde blueswir1
        .fpu_version = 0 << 17,
1026 963262de blueswir1
        .mmu_version = 0x00000800, // SuperSPARC 2.x, no MXCC
1027 b5154bde blueswir1
        .mmu_bm = 0x00002000,
1028 b5154bde blueswir1
        .mmu_ctpr_mask = 0xffffffc0,
1029 b5154bde blueswir1
        .mmu_cxr_mask = 0x0000ffff,
1030 b5154bde blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1031 b5154bde blueswir1
        .mmu_trcr_mask = 0xffffffff,
1032 1a14026e blueswir1
        .nwindows = 8,
1033 b5154bde blueswir1
        .features = CPU_DEFAULT_FEATURES,
1034 b5154bde blueswir1
    },
1035 b5154bde blueswir1
    {
1036 b5154bde blueswir1
        .name = "TI SuperSparc 50", // STP1020PGA
1037 963262de blueswir1
        .iu_version = 0x40000000, // SuperSPARC 3.x
1038 b5154bde blueswir1
        .fpu_version = 0 << 17,
1039 963262de blueswir1
        .mmu_version = 0x01000800, // SuperSPARC 3.x, no MXCC
1040 b5154bde blueswir1
        .mmu_bm = 0x00002000,
1041 b5154bde blueswir1
        .mmu_ctpr_mask = 0xffffffc0,
1042 b5154bde blueswir1
        .mmu_cxr_mask = 0x0000ffff,
1043 b5154bde blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1044 b5154bde blueswir1
        .mmu_trcr_mask = 0xffffffff,
1045 1a14026e blueswir1
        .nwindows = 8,
1046 b5154bde blueswir1
        .features = CPU_DEFAULT_FEATURES,
1047 b5154bde blueswir1
    },
1048 b5154bde blueswir1
    {
1049 c48fcb47 blueswir1
        .name = "TI SuperSparc 51",
1050 963262de blueswir1
        .iu_version = 0x40000000, // SuperSPARC 3.x
1051 c48fcb47 blueswir1
        .fpu_version = 0 << 17,
1052 963262de blueswir1
        .mmu_version = 0x01000000, // SuperSPARC 3.x, MXCC
1053 c48fcb47 blueswir1
        .mmu_bm = 0x00002000,
1054 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0xffffffc0,
1055 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000ffff,
1056 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1057 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
1058 963262de blueswir1
        .mxcc_version = 0x00000104,
1059 1a14026e blueswir1
        .nwindows = 8,
1060 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
1061 c48fcb47 blueswir1
    },
1062 c48fcb47 blueswir1
    {
1063 b5154bde blueswir1
        .name = "TI SuperSparc 60", // STP1020APGA
1064 963262de blueswir1
        .iu_version = 0x40000000, // SuperSPARC 3.x
1065 b5154bde blueswir1
        .fpu_version = 0 << 17,
1066 963262de blueswir1
        .mmu_version = 0x01000800, // SuperSPARC 3.x, no MXCC
1067 b5154bde blueswir1
        .mmu_bm = 0x00002000,
1068 b5154bde blueswir1
        .mmu_ctpr_mask = 0xffffffc0,
1069 b5154bde blueswir1
        .mmu_cxr_mask = 0x0000ffff,
1070 b5154bde blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1071 b5154bde blueswir1
        .mmu_trcr_mask = 0xffffffff,
1072 1a14026e blueswir1
        .nwindows = 8,
1073 b5154bde blueswir1
        .features = CPU_DEFAULT_FEATURES,
1074 b5154bde blueswir1
    },
1075 b5154bde blueswir1
    {
1076 c48fcb47 blueswir1
        .name = "TI SuperSparc 61",
1077 963262de blueswir1
        .iu_version = 0x44000000, // SuperSPARC 3.x
1078 c48fcb47 blueswir1
        .fpu_version = 0 << 17,
1079 963262de blueswir1
        .mmu_version = 0x01000000, // SuperSPARC 3.x, MXCC
1080 963262de blueswir1
        .mmu_bm = 0x00002000,
1081 963262de blueswir1
        .mmu_ctpr_mask = 0xffffffc0,
1082 963262de blueswir1
        .mmu_cxr_mask = 0x0000ffff,
1083 963262de blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1084 963262de blueswir1
        .mmu_trcr_mask = 0xffffffff,
1085 963262de blueswir1
        .mxcc_version = 0x00000104,
1086 963262de blueswir1
        .nwindows = 8,
1087 963262de blueswir1
        .features = CPU_DEFAULT_FEATURES,
1088 963262de blueswir1
    },
1089 963262de blueswir1
    {
1090 963262de blueswir1
        .name = "TI SuperSparc II",
1091 963262de blueswir1
        .iu_version = 0x40000000, // SuperSPARC II 1.x
1092 963262de blueswir1
        .fpu_version = 0 << 17,
1093 963262de blueswir1
        .mmu_version = 0x08000000, // SuperSPARC II 1.x, MXCC
1094 c48fcb47 blueswir1
        .mmu_bm = 0x00002000,
1095 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0xffffffc0,
1096 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000ffff,
1097 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1098 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
1099 963262de blueswir1
        .mxcc_version = 0x00000104,
1100 1a14026e blueswir1
        .nwindows = 8,
1101 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
1102 c48fcb47 blueswir1
    },
1103 c48fcb47 blueswir1
    {
1104 c48fcb47 blueswir1
        .name = "Ross RT625",
1105 c48fcb47 blueswir1
        .iu_version = 0x1e000000,
1106 c48fcb47 blueswir1
        .fpu_version = 1 << 17,
1107 c48fcb47 blueswir1
        .mmu_version = 0x1e000000,
1108 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
1109 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
1110 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
1111 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1112 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
1113 1a14026e blueswir1
        .nwindows = 8,
1114 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
1115 c48fcb47 blueswir1
    },
1116 c48fcb47 blueswir1
    {
1117 c48fcb47 blueswir1
        .name = "Ross RT620",
1118 c48fcb47 blueswir1
        .iu_version = 0x1f000000,
1119 c48fcb47 blueswir1
        .fpu_version = 1 << 17,
1120 c48fcb47 blueswir1
        .mmu_version = 0x1f000000,
1121 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
1122 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
1123 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
1124 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1125 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
1126 1a14026e blueswir1
        .nwindows = 8,
1127 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
1128 c48fcb47 blueswir1
    },
1129 c48fcb47 blueswir1
    {
1130 c48fcb47 blueswir1
        .name = "BIT B5010",
1131 c48fcb47 blueswir1
        .iu_version = 0x20000000,
1132 c48fcb47 blueswir1
        .fpu_version = 0 << 17, /* B5010/B5110/B5120/B5210 */
1133 c48fcb47 blueswir1
        .mmu_version = 0x20000000,
1134 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
1135 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
1136 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
1137 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1138 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
1139 1a14026e blueswir1
        .nwindows = 8,
1140 e30b4678 blueswir1
        .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT |
1141 e30b4678 blueswir1
        CPU_FEATURE_FSMULD,
1142 c48fcb47 blueswir1
    },
1143 c48fcb47 blueswir1
    {
1144 c48fcb47 blueswir1
        .name = "Matsushita MN10501",
1145 c48fcb47 blueswir1
        .iu_version = 0x50000000,
1146 c48fcb47 blueswir1
        .fpu_version = 0 << 17,
1147 c48fcb47 blueswir1
        .mmu_version = 0x50000000,
1148 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
1149 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
1150 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
1151 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1152 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
1153 1a14026e blueswir1
        .nwindows = 8,
1154 e30b4678 blueswir1
        .features = CPU_FEATURE_FLOAT | CPU_FEATURE_MUL | CPU_FEATURE_FSQRT |
1155 e30b4678 blueswir1
        CPU_FEATURE_FSMULD,
1156 c48fcb47 blueswir1
    },
1157 c48fcb47 blueswir1
    {
1158 c48fcb47 blueswir1
        .name = "Weitek W8601",
1159 c48fcb47 blueswir1
        .iu_version = 0x90 << 24, /* Impl 9, ver 0 */
1160 c48fcb47 blueswir1
        .fpu_version = 3 << 17, /* FPU version 3 (Weitek WTL3170/2) */
1161 c48fcb47 blueswir1
        .mmu_version = 0x10 << 24,
1162 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
1163 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
1164 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
1165 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1166 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
1167 1a14026e blueswir1
        .nwindows = 8,
1168 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
1169 c48fcb47 blueswir1
    },
1170 c48fcb47 blueswir1
    {
1171 c48fcb47 blueswir1
        .name = "LEON2",
1172 c48fcb47 blueswir1
        .iu_version = 0xf2000000,
1173 c48fcb47 blueswir1
        .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
1174 c48fcb47 blueswir1
        .mmu_version = 0xf2000000,
1175 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
1176 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
1177 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
1178 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1179 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
1180 1a14026e blueswir1
        .nwindows = 8,
1181 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
1182 c48fcb47 blueswir1
    },
1183 c48fcb47 blueswir1
    {
1184 c48fcb47 blueswir1
        .name = "LEON3",
1185 c48fcb47 blueswir1
        .iu_version = 0xf3000000,
1186 c48fcb47 blueswir1
        .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
1187 c48fcb47 blueswir1
        .mmu_version = 0xf3000000,
1188 c48fcb47 blueswir1
        .mmu_bm = 0x00004000,
1189 c48fcb47 blueswir1
        .mmu_ctpr_mask = 0x007ffff0,
1190 c48fcb47 blueswir1
        .mmu_cxr_mask = 0x0000003f,
1191 c48fcb47 blueswir1
        .mmu_sfsr_mask = 0xffffffff,
1192 c48fcb47 blueswir1
        .mmu_trcr_mask = 0xffffffff,
1193 1a14026e blueswir1
        .nwindows = 8,
1194 64a88d5d blueswir1
        .features = CPU_DEFAULT_FEATURES,
1195 c48fcb47 blueswir1
    },
1196 c48fcb47 blueswir1
#endif
1197 c48fcb47 blueswir1
};
1198 c48fcb47 blueswir1
1199 64a88d5d blueswir1
static const char * const feature_name[] = {
1200 64a88d5d blueswir1
    "float",
1201 64a88d5d blueswir1
    "float128",
1202 64a88d5d blueswir1
    "swap",
1203 64a88d5d blueswir1
    "mul",
1204 64a88d5d blueswir1
    "div",
1205 64a88d5d blueswir1
    "flush",
1206 64a88d5d blueswir1
    "fsqrt",
1207 64a88d5d blueswir1
    "fmul",
1208 64a88d5d blueswir1
    "vis1",
1209 64a88d5d blueswir1
    "vis2",
1210 e30b4678 blueswir1
    "fsmuld",
1211 fb79ceb9 blueswir1
    "hypv",
1212 fb79ceb9 blueswir1
    "cmt",
1213 fb79ceb9 blueswir1
    "gl",
1214 64a88d5d blueswir1
};
1215 64a88d5d blueswir1
1216 64a88d5d blueswir1
static void print_features(FILE *f,
1217 64a88d5d blueswir1
                           int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
1218 64a88d5d blueswir1
                           uint32_t features, const char *prefix)
1219 c48fcb47 blueswir1
{
1220 c48fcb47 blueswir1
    unsigned int i;
1221 c48fcb47 blueswir1
1222 64a88d5d blueswir1
    for (i = 0; i < ARRAY_SIZE(feature_name); i++)
1223 64a88d5d blueswir1
        if (feature_name[i] && (features & (1 << i))) {
1224 64a88d5d blueswir1
            if (prefix)
1225 64a88d5d blueswir1
                (*cpu_fprintf)(f, "%s", prefix);
1226 64a88d5d blueswir1
            (*cpu_fprintf)(f, "%s ", feature_name[i]);
1227 64a88d5d blueswir1
        }
1228 64a88d5d blueswir1
}
1229 64a88d5d blueswir1
1230 64a88d5d blueswir1
static void add_flagname_to_bitmaps(const char *flagname, uint32_t *features)
1231 64a88d5d blueswir1
{
1232 64a88d5d blueswir1
    unsigned int i;
1233 64a88d5d blueswir1
1234 64a88d5d blueswir1
    for (i = 0; i < ARRAY_SIZE(feature_name); i++)
1235 64a88d5d blueswir1
        if (feature_name[i] && !strcmp(flagname, feature_name[i])) {
1236 64a88d5d blueswir1
            *features |= 1 << i;
1237 64a88d5d blueswir1
            return;
1238 64a88d5d blueswir1
        }
1239 64a88d5d blueswir1
    fprintf(stderr, "CPU feature %s not found\n", flagname);
1240 64a88d5d blueswir1
}
1241 64a88d5d blueswir1
1242 22548760 blueswir1
static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *cpu_model)
1243 64a88d5d blueswir1
{
1244 64a88d5d blueswir1
    unsigned int i;
1245 64a88d5d blueswir1
    const sparc_def_t *def = NULL;
1246 64a88d5d blueswir1
    char *s = strdup(cpu_model);
1247 64a88d5d blueswir1
    char *featurestr, *name = strtok(s, ",");
1248 64a88d5d blueswir1
    uint32_t plus_features = 0;
1249 64a88d5d blueswir1
    uint32_t minus_features = 0;
1250 64a88d5d blueswir1
    long long iu_version;
1251 1a14026e blueswir1
    uint32_t fpu_version, mmu_version, nwindows;
1252 64a88d5d blueswir1
1253 b1503cda malc
    for (i = 0; i < ARRAY_SIZE(sparc_defs); i++) {
1254 c48fcb47 blueswir1
        if (strcasecmp(name, sparc_defs[i].name) == 0) {
1255 64a88d5d blueswir1
            def = &sparc_defs[i];
1256 c48fcb47 blueswir1
        }
1257 c48fcb47 blueswir1
    }
1258 64a88d5d blueswir1
    if (!def)
1259 64a88d5d blueswir1
        goto error;
1260 64a88d5d blueswir1
    memcpy(cpu_def, def, sizeof(*def));
1261 64a88d5d blueswir1
1262 64a88d5d blueswir1
    featurestr = strtok(NULL, ",");
1263 64a88d5d blueswir1
    while (featurestr) {
1264 64a88d5d blueswir1
        char *val;
1265 64a88d5d blueswir1
1266 64a88d5d blueswir1
        if (featurestr[0] == '+') {
1267 64a88d5d blueswir1
            add_flagname_to_bitmaps(featurestr + 1, &plus_features);
1268 64a88d5d blueswir1
        } else if (featurestr[0] == '-') {
1269 64a88d5d blueswir1
            add_flagname_to_bitmaps(featurestr + 1, &minus_features);
1270 64a88d5d blueswir1
        } else if ((val = strchr(featurestr, '='))) {
1271 64a88d5d blueswir1
            *val = 0; val++;
1272 64a88d5d blueswir1
            if (!strcmp(featurestr, "iu_version")) {
1273 64a88d5d blueswir1
                char *err;
1274 64a88d5d blueswir1
1275 64a88d5d blueswir1
                iu_version = strtoll(val, &err, 0);
1276 64a88d5d blueswir1
                if (!*val || *err) {
1277 64a88d5d blueswir1
                    fprintf(stderr, "bad numerical value %s\n", val);
1278 64a88d5d blueswir1
                    goto error;
1279 64a88d5d blueswir1
                }
1280 64a88d5d blueswir1
                cpu_def->iu_version = iu_version;
1281 64a88d5d blueswir1
#ifdef DEBUG_FEATURES
1282 64a88d5d blueswir1
                fprintf(stderr, "iu_version %llx\n", iu_version);
1283 64a88d5d blueswir1
#endif
1284 64a88d5d blueswir1
            } else if (!strcmp(featurestr, "fpu_version")) {
1285 64a88d5d blueswir1
                char *err;
1286 64a88d5d blueswir1
1287 64a88d5d blueswir1
                fpu_version = strtol(val, &err, 0);
1288 64a88d5d blueswir1
                if (!*val || *err) {
1289 64a88d5d blueswir1
                    fprintf(stderr, "bad numerical value %s\n", val);
1290 64a88d5d blueswir1
                    goto error;
1291 64a88d5d blueswir1
                }
1292 64a88d5d blueswir1
                cpu_def->fpu_version = fpu_version;
1293 64a88d5d blueswir1
#ifdef DEBUG_FEATURES
1294 64a88d5d blueswir1
                fprintf(stderr, "fpu_version %llx\n", fpu_version);
1295 64a88d5d blueswir1
#endif
1296 64a88d5d blueswir1
            } else if (!strcmp(featurestr, "mmu_version")) {
1297 64a88d5d blueswir1
                char *err;
1298 64a88d5d blueswir1
1299 64a88d5d blueswir1
                mmu_version = strtol(val, &err, 0);
1300 64a88d5d blueswir1
                if (!*val || *err) {
1301 64a88d5d blueswir1
                    fprintf(stderr, "bad numerical value %s\n", val);
1302 64a88d5d blueswir1
                    goto error;
1303 64a88d5d blueswir1
                }
1304 64a88d5d blueswir1
                cpu_def->mmu_version = mmu_version;
1305 64a88d5d blueswir1
#ifdef DEBUG_FEATURES
1306 64a88d5d blueswir1
                fprintf(stderr, "mmu_version %llx\n", mmu_version);
1307 64a88d5d blueswir1
#endif
1308 1a14026e blueswir1
            } else if (!strcmp(featurestr, "nwindows")) {
1309 1a14026e blueswir1
                char *err;
1310 1a14026e blueswir1
1311 1a14026e blueswir1
                nwindows = strtol(val, &err, 0);
1312 1a14026e blueswir1
                if (!*val || *err || nwindows > MAX_NWINDOWS ||
1313 1a14026e blueswir1
                    nwindows < MIN_NWINDOWS) {
1314 1a14026e blueswir1
                    fprintf(stderr, "bad numerical value %s\n", val);
1315 1a14026e blueswir1
                    goto error;
1316 1a14026e blueswir1
                }
1317 1a14026e blueswir1
                cpu_def->nwindows = nwindows;
1318 1a14026e blueswir1
#ifdef DEBUG_FEATURES
1319 1a14026e blueswir1
                fprintf(stderr, "nwindows %d\n", nwindows);
1320 1a14026e blueswir1
#endif
1321 64a88d5d blueswir1
            } else {
1322 64a88d5d blueswir1
                fprintf(stderr, "unrecognized feature %s\n", featurestr);
1323 64a88d5d blueswir1
                goto error;
1324 64a88d5d blueswir1
            }
1325 64a88d5d blueswir1
        } else {
1326 77f193da blueswir1
            fprintf(stderr, "feature string `%s' not in format "
1327 77f193da blueswir1
                    "(+feature|-feature|feature=xyz)\n", featurestr);
1328 64a88d5d blueswir1
            goto error;
1329 64a88d5d blueswir1
        }
1330 64a88d5d blueswir1
        featurestr = strtok(NULL, ",");
1331 64a88d5d blueswir1
    }
1332 64a88d5d blueswir1
    cpu_def->features |= plus_features;
1333 64a88d5d blueswir1
    cpu_def->features &= ~minus_features;
1334 64a88d5d blueswir1
#ifdef DEBUG_FEATURES
1335 64a88d5d blueswir1
    print_features(stderr, fprintf, cpu_def->features, NULL);
1336 64a88d5d blueswir1
#endif
1337 64a88d5d blueswir1
    free(s);
1338 64a88d5d blueswir1
    return 0;
1339 64a88d5d blueswir1
1340 64a88d5d blueswir1
 error:
1341 64a88d5d blueswir1
    free(s);
1342 64a88d5d blueswir1
    return -1;
1343 c48fcb47 blueswir1
}
1344 c48fcb47 blueswir1
1345 77f193da blueswir1
void sparc_cpu_list(FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
1346 c48fcb47 blueswir1
{
1347 c48fcb47 blueswir1
    unsigned int i;
1348 c48fcb47 blueswir1
1349 b1503cda malc
    for (i = 0; i < ARRAY_SIZE(sparc_defs); i++) {
1350 1a14026e blueswir1
        (*cpu_fprintf)(f, "Sparc %16s IU " TARGET_FMT_lx " FPU %08x MMU %08x NWINS %d ",
1351 c48fcb47 blueswir1
                       sparc_defs[i].name,
1352 c48fcb47 blueswir1
                       sparc_defs[i].iu_version,
1353 c48fcb47 blueswir1
                       sparc_defs[i].fpu_version,
1354 1a14026e blueswir1
                       sparc_defs[i].mmu_version,
1355 1a14026e blueswir1
                       sparc_defs[i].nwindows);
1356 77f193da blueswir1
        print_features(f, cpu_fprintf, CPU_DEFAULT_FEATURES &
1357 77f193da blueswir1
                       ~sparc_defs[i].features, "-");
1358 77f193da blueswir1
        print_features(f, cpu_fprintf, ~CPU_DEFAULT_FEATURES &
1359 77f193da blueswir1
                       sparc_defs[i].features, "+");
1360 64a88d5d blueswir1
        (*cpu_fprintf)(f, "\n");
1361 c48fcb47 blueswir1
    }
1362 f76981b1 blueswir1
    (*cpu_fprintf)(f, "Default CPU feature flags (use '-' to remove): ");
1363 f76981b1 blueswir1
    print_features(f, cpu_fprintf, CPU_DEFAULT_FEATURES, NULL);
1364 64a88d5d blueswir1
    (*cpu_fprintf)(f, "\n");
1365 f76981b1 blueswir1
    (*cpu_fprintf)(f, "Available CPU feature flags (use '+' to add): ");
1366 f76981b1 blueswir1
    print_features(f, cpu_fprintf, ~CPU_DEFAULT_FEATURES, NULL);
1367 f76981b1 blueswir1
    (*cpu_fprintf)(f, "\n");
1368 f76981b1 blueswir1
    (*cpu_fprintf)(f, "Numerical features (use '=' to set): iu_version "
1369 f76981b1 blueswir1
                   "fpu_version mmu_version nwindows\n");
1370 c48fcb47 blueswir1
}
1371 c48fcb47 blueswir1
1372 c48fcb47 blueswir1
void cpu_dump_state(CPUState *env, FILE *f,
1373 c48fcb47 blueswir1
                    int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
1374 c48fcb47 blueswir1
                    int flags)
1375 c48fcb47 blueswir1
{
1376 c48fcb47 blueswir1
    int i, x;
1377 c48fcb47 blueswir1
1378 77f193da blueswir1
    cpu_fprintf(f, "pc: " TARGET_FMT_lx "  npc: " TARGET_FMT_lx "\n", env->pc,
1379 77f193da blueswir1
                env->npc);
1380 c48fcb47 blueswir1
    cpu_fprintf(f, "General Registers:\n");
1381 c48fcb47 blueswir1
    for (i = 0; i < 4; i++)
1382 c48fcb47 blueswir1
        cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
1383 c48fcb47 blueswir1
    cpu_fprintf(f, "\n");
1384 c48fcb47 blueswir1
    for (; i < 8; i++)
1385 c48fcb47 blueswir1
        cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
1386 c48fcb47 blueswir1
    cpu_fprintf(f, "\nCurrent Register Window:\n");
1387 c48fcb47 blueswir1
    for (x = 0; x < 3; x++) {
1388 c48fcb47 blueswir1
        for (i = 0; i < 4; i++)
1389 c48fcb47 blueswir1
            cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
1390 c48fcb47 blueswir1
                    (x == 0 ? 'o' : (x == 1 ? 'l' : 'i')), i,
1391 c48fcb47 blueswir1
                    env->regwptr[i + x * 8]);
1392 c48fcb47 blueswir1
        cpu_fprintf(f, "\n");
1393 c48fcb47 blueswir1
        for (; i < 8; i++)
1394 c48fcb47 blueswir1
            cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
1395 c48fcb47 blueswir1
                    (x == 0 ? 'o' : x == 1 ? 'l' : 'i'), i,
1396 c48fcb47 blueswir1
                    env->regwptr[i + x * 8]);
1397 c48fcb47 blueswir1
        cpu_fprintf(f, "\n");
1398 c48fcb47 blueswir1
    }
1399 c48fcb47 blueswir1
    cpu_fprintf(f, "\nFloating Point Registers:\n");
1400 c48fcb47 blueswir1
    for (i = 0; i < 32; i++) {
1401 c48fcb47 blueswir1
        if ((i & 3) == 0)
1402 c48fcb47 blueswir1
            cpu_fprintf(f, "%%f%02d:", i);
1403 a37ee56c blueswir1
        cpu_fprintf(f, " %016f", *(float *)&env->fpr[i]);
1404 c48fcb47 blueswir1
        if ((i & 3) == 3)
1405 c48fcb47 blueswir1
            cpu_fprintf(f, "\n");
1406 c48fcb47 blueswir1
    }
1407 c48fcb47 blueswir1
#ifdef TARGET_SPARC64
1408 c48fcb47 blueswir1
    cpu_fprintf(f, "pstate: 0x%08x ccr: 0x%02x asi: 0x%02x tl: %d fprs: %d\n",
1409 c48fcb47 blueswir1
                env->pstate, GET_CCR(env), env->asi, env->tl, env->fprs);
1410 77f193da blueswir1
    cpu_fprintf(f, "cansave: %d canrestore: %d otherwin: %d wstate %d "
1411 77f193da blueswir1
                "cleanwin %d cwp %d\n",
1412 c48fcb47 blueswir1
                env->cansave, env->canrestore, env->otherwin, env->wstate,
1413 1a14026e blueswir1
                env->cleanwin, env->nwindows - 1 - env->cwp);
1414 c48fcb47 blueswir1
#else
1415 d78f3995 blueswir1
1416 d78f3995 blueswir1
#define GET_FLAG(a,b) ((env->psr & a)?b:'-')
1417 d78f3995 blueswir1
1418 77f193da blueswir1
    cpu_fprintf(f, "psr: 0x%08x -> %c%c%c%c %c%c%c wim: 0x%08x\n",
1419 77f193da blueswir1
                GET_PSR(env), GET_FLAG(PSR_ZERO, 'Z'), GET_FLAG(PSR_OVF, 'V'),
1420 77f193da blueswir1
                GET_FLAG(PSR_NEG, 'N'), GET_FLAG(PSR_CARRY, 'C'),
1421 77f193da blueswir1
                env->psrs?'S':'-', env->psrps?'P':'-',
1422 77f193da blueswir1
                env->psret?'E':'-', env->wim);
1423 c48fcb47 blueswir1
#endif
1424 3a3b925d blueswir1
    cpu_fprintf(f, "fsr: 0x%08x\n", env->fsr);
1425 c48fcb47 blueswir1
}