Statistics
| Branch: | Revision:

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

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