Statistics
| Branch: | Revision:

root / target-sparc / machine.c @ 1d6198c3

History | View | Annotate | Download (6.7 kB)

1 8dd3dca3 aurel32
#include "hw/hw.h"
2 8dd3dca3 aurel32
#include "hw/boards.h"
3 0b8f1b10 blueswir1
#include "qemu-timer.h"
4 8dd3dca3 aurel32
5 8dd3dca3 aurel32
#include "exec-all.h"
6 8dd3dca3 aurel32
7 8dd3dca3 aurel32
void register_machines(void)
8 8dd3dca3 aurel32
{
9 8dd3dca3 aurel32
#ifdef TARGET_SPARC64
10 8dd3dca3 aurel32
    qemu_register_machine(&sun4u_machine);
11 c7ba218d blueswir1
    qemu_register_machine(&sun4v_machine);
12 e87231d4 blueswir1
    qemu_register_machine(&niagara_machine);
13 8dd3dca3 aurel32
#else
14 8dd3dca3 aurel32
    qemu_register_machine(&ss5_machine);
15 8dd3dca3 aurel32
    qemu_register_machine(&ss10_machine);
16 8dd3dca3 aurel32
    qemu_register_machine(&ss600mp_machine);
17 8dd3dca3 aurel32
    qemu_register_machine(&ss20_machine);
18 8dd3dca3 aurel32
    qemu_register_machine(&ss2_machine);
19 8dd3dca3 aurel32
    qemu_register_machine(&voyager_machine);
20 8dd3dca3 aurel32
    qemu_register_machine(&ss_lx_machine);
21 8dd3dca3 aurel32
    qemu_register_machine(&ss4_machine);
22 8dd3dca3 aurel32
    qemu_register_machine(&scls_machine);
23 8dd3dca3 aurel32
    qemu_register_machine(&sbook_machine);
24 8dd3dca3 aurel32
    qemu_register_machine(&ss1000_machine);
25 8dd3dca3 aurel32
    qemu_register_machine(&ss2000_machine);
26 8dd3dca3 aurel32
#endif
27 8dd3dca3 aurel32
}
28 8dd3dca3 aurel32
29 8dd3dca3 aurel32
void cpu_save(QEMUFile *f, void *opaque)
30 8dd3dca3 aurel32
{
31 8dd3dca3 aurel32
    CPUState *env = opaque;
32 8dd3dca3 aurel32
    int i;
33 8dd3dca3 aurel32
    uint32_t tmp;
34 8dd3dca3 aurel32
35 a7a044f2 blueswir1
    // if env->cwp == env->nwindows - 1, this will set the ins of the last
36 a7a044f2 blueswir1
    // window as the outs of the first window
37 a7a044f2 blueswir1
    cpu_set_cwp(env, env->cwp);
38 a7a044f2 blueswir1
39 8dd3dca3 aurel32
    for(i = 0; i < 8; i++)
40 8dd3dca3 aurel32
        qemu_put_betls(f, &env->gregs[i]);
41 1a14026e blueswir1
    qemu_put_be32s(f, &env->nwindows);
42 1a14026e blueswir1
    for(i = 0; i < env->nwindows * 16; i++)
43 8dd3dca3 aurel32
        qemu_put_betls(f, &env->regbase[i]);
44 8dd3dca3 aurel32
45 8dd3dca3 aurel32
    /* FPU */
46 8dd3dca3 aurel32
    for(i = 0; i < TARGET_FPREGS; i++) {
47 8dd3dca3 aurel32
        union {
48 8dd3dca3 aurel32
            float32 f;
49 8dd3dca3 aurel32
            uint32_t i;
50 8dd3dca3 aurel32
        } u;
51 8dd3dca3 aurel32
        u.f = env->fpr[i];
52 8dd3dca3 aurel32
        qemu_put_be32(f, u.i);
53 8dd3dca3 aurel32
    }
54 8dd3dca3 aurel32
55 8dd3dca3 aurel32
    qemu_put_betls(f, &env->pc);
56 8dd3dca3 aurel32
    qemu_put_betls(f, &env->npc);
57 8dd3dca3 aurel32
    qemu_put_betls(f, &env->y);
58 8dd3dca3 aurel32
    tmp = GET_PSR(env);
59 8dd3dca3 aurel32
    qemu_put_be32(f, tmp);
60 8dd3dca3 aurel32
    qemu_put_betls(f, &env->fsr);
61 8dd3dca3 aurel32
    qemu_put_betls(f, &env->tbr);
62 a7a044f2 blueswir1
    tmp = env->interrupt_index;
63 a7a044f2 blueswir1
    qemu_put_be32(f, tmp);
64 a7a044f2 blueswir1
    qemu_put_be32s(f, &env->pil_in);
65 8dd3dca3 aurel32
#ifndef TARGET_SPARC64
66 8dd3dca3 aurel32
    qemu_put_be32s(f, &env->wim);
67 8dd3dca3 aurel32
    /* MMU */
68 0b8f1b10 blueswir1
    for (i = 0; i < 32; i++)
69 8dd3dca3 aurel32
        qemu_put_be32s(f, &env->mmuregs[i]);
70 0b8f1b10 blueswir1
#else
71 0b8f1b10 blueswir1
    qemu_put_be64s(f, &env->lsu);
72 0b8f1b10 blueswir1
    for (i = 0; i < 16; i++) {
73 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->immuregs[i]);
74 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->dmmuregs[i]);
75 0b8f1b10 blueswir1
    }
76 0b8f1b10 blueswir1
    for (i = 0; i < 64; i++) {
77 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->itlb_tag[i]);
78 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->itlb_tte[i]);
79 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->dtlb_tag[i]);
80 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->dtlb_tte[i]);
81 0b8f1b10 blueswir1
    }
82 0b8f1b10 blueswir1
    qemu_put_be32s(f, &env->mmu_version);
83 c19148bd blueswir1
    for (i = 0; i < MAXTL_MAX; i++) {
84 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->ts[i].tpc);
85 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->ts[i].tnpc);
86 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->ts[i].tstate);
87 0b8f1b10 blueswir1
        qemu_put_be32s(f, &env->ts[i].tt);
88 0b8f1b10 blueswir1
    }
89 0b8f1b10 blueswir1
    qemu_put_be32s(f, &env->xcc);
90 0b8f1b10 blueswir1
    qemu_put_be32s(f, &env->asi);
91 0b8f1b10 blueswir1
    qemu_put_be32s(f, &env->pstate);
92 0b8f1b10 blueswir1
    qemu_put_be32s(f, &env->tl);
93 0b8f1b10 blueswir1
    qemu_put_be32s(f, &env->cansave);
94 0b8f1b10 blueswir1
    qemu_put_be32s(f, &env->canrestore);
95 0b8f1b10 blueswir1
    qemu_put_be32s(f, &env->otherwin);
96 0b8f1b10 blueswir1
    qemu_put_be32s(f, &env->wstate);
97 0b8f1b10 blueswir1
    qemu_put_be32s(f, &env->cleanwin);
98 0b8f1b10 blueswir1
    for (i = 0; i < 8; i++)
99 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->agregs[i]);
100 0b8f1b10 blueswir1
    for (i = 0; i < 8; i++)
101 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->bgregs[i]);
102 0b8f1b10 blueswir1
    for (i = 0; i < 8; i++)
103 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->igregs[i]);
104 0b8f1b10 blueswir1
    for (i = 0; i < 8; i++)
105 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->mgregs[i]);
106 0b8f1b10 blueswir1
    qemu_put_be64s(f, &env->fprs);
107 0b8f1b10 blueswir1
    qemu_put_be64s(f, &env->tick_cmpr);
108 0b8f1b10 blueswir1
    qemu_put_be64s(f, &env->stick_cmpr);
109 0b8f1b10 blueswir1
    qemu_put_ptimer(f, env->tick);
110 0b8f1b10 blueswir1
    qemu_put_ptimer(f, env->stick);
111 0b8f1b10 blueswir1
    qemu_put_be64s(f, &env->gsr);
112 0b8f1b10 blueswir1
    qemu_put_be32s(f, &env->gl);
113 0b8f1b10 blueswir1
    qemu_put_be64s(f, &env->hpstate);
114 c19148bd blueswir1
    for (i = 0; i < MAXTL_MAX; i++)
115 0b8f1b10 blueswir1
        qemu_put_be64s(f, &env->htstate[i]);
116 0b8f1b10 blueswir1
    qemu_put_be64s(f, &env->hintp);
117 0b8f1b10 blueswir1
    qemu_put_be64s(f, &env->htba);
118 0b8f1b10 blueswir1
    qemu_put_be64s(f, &env->hver);
119 0b8f1b10 blueswir1
    qemu_put_be64s(f, &env->hstick_cmpr);
120 0b8f1b10 blueswir1
    qemu_put_be64s(f, &env->ssr);
121 a7a044f2 blueswir1
    qemu_put_ptimer(f, env->hstick);
122 8dd3dca3 aurel32
#endif
123 8dd3dca3 aurel32
}
124 8dd3dca3 aurel32
125 8dd3dca3 aurel32
int cpu_load(QEMUFile *f, void *opaque, int version_id)
126 8dd3dca3 aurel32
{
127 8dd3dca3 aurel32
    CPUState *env = opaque;
128 8dd3dca3 aurel32
    int i;
129 8dd3dca3 aurel32
    uint32_t tmp;
130 8dd3dca3 aurel32
131 0b8f1b10 blueswir1
    if (version_id != 5)
132 1a14026e blueswir1
        return -EINVAL;
133 8dd3dca3 aurel32
    for(i = 0; i < 8; i++)
134 8dd3dca3 aurel32
        qemu_get_betls(f, &env->gregs[i]);
135 1a14026e blueswir1
    qemu_get_be32s(f, &env->nwindows);
136 1a14026e blueswir1
    for(i = 0; i < env->nwindows * 16; i++)
137 8dd3dca3 aurel32
        qemu_get_betls(f, &env->regbase[i]);
138 8dd3dca3 aurel32
139 8dd3dca3 aurel32
    /* FPU */
140 8dd3dca3 aurel32
    for(i = 0; i < TARGET_FPREGS; i++) {
141 8dd3dca3 aurel32
        union {
142 8dd3dca3 aurel32
            float32 f;
143 8dd3dca3 aurel32
            uint32_t i;
144 8dd3dca3 aurel32
        } u;
145 8dd3dca3 aurel32
        u.i = qemu_get_be32(f);
146 8dd3dca3 aurel32
        env->fpr[i] = u.f;
147 8dd3dca3 aurel32
    }
148 8dd3dca3 aurel32
149 8dd3dca3 aurel32
    qemu_get_betls(f, &env->pc);
150 8dd3dca3 aurel32
    qemu_get_betls(f, &env->npc);
151 8dd3dca3 aurel32
    qemu_get_betls(f, &env->y);
152 8dd3dca3 aurel32
    tmp = qemu_get_be32(f);
153 8dd3dca3 aurel32
    env->cwp = 0; /* needed to ensure that the wrapping registers are
154 8dd3dca3 aurel32
                     correctly updated */
155 8dd3dca3 aurel32
    PUT_PSR(env, tmp);
156 8dd3dca3 aurel32
    qemu_get_betls(f, &env->fsr);
157 8dd3dca3 aurel32
    qemu_get_betls(f, &env->tbr);
158 a7a044f2 blueswir1
    tmp = qemu_get_be32(f);
159 a7a044f2 blueswir1
    env->interrupt_index = tmp;
160 a7a044f2 blueswir1
    qemu_get_be32s(f, &env->pil_in);
161 8dd3dca3 aurel32
#ifndef TARGET_SPARC64
162 8dd3dca3 aurel32
    qemu_get_be32s(f, &env->wim);
163 8dd3dca3 aurel32
    /* MMU */
164 0b8f1b10 blueswir1
    for (i = 0; i < 32; i++)
165 8dd3dca3 aurel32
        qemu_get_be32s(f, &env->mmuregs[i]);
166 0b8f1b10 blueswir1
#else
167 0b8f1b10 blueswir1
    qemu_get_be64s(f, &env->lsu);
168 0b8f1b10 blueswir1
    for (i = 0; i < 16; i++) {
169 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->immuregs[i]);
170 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->dmmuregs[i]);
171 0b8f1b10 blueswir1
    }
172 0b8f1b10 blueswir1
    for (i = 0; i < 64; i++) {
173 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->itlb_tag[i]);
174 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->itlb_tte[i]);
175 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->dtlb_tag[i]);
176 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->dtlb_tte[i]);
177 0b8f1b10 blueswir1
    }
178 0b8f1b10 blueswir1
    qemu_get_be32s(f, &env->mmu_version);
179 c19148bd blueswir1
    for (i = 0; i < MAXTL_MAX; i++) {
180 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->ts[i].tpc);
181 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->ts[i].tnpc);
182 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->ts[i].tstate);
183 0b8f1b10 blueswir1
        qemu_get_be32s(f, &env->ts[i].tt);
184 0b8f1b10 blueswir1
    }
185 0b8f1b10 blueswir1
    qemu_get_be32s(f, &env->xcc);
186 0b8f1b10 blueswir1
    qemu_get_be32s(f, &env->asi);
187 0b8f1b10 blueswir1
    qemu_get_be32s(f, &env->pstate);
188 0b8f1b10 blueswir1
    qemu_get_be32s(f, &env->tl);
189 c19148bd blueswir1
    env->tsptr = &env->ts[env->tl & MAXTL_MASK];
190 0b8f1b10 blueswir1
    qemu_get_be32s(f, &env->cansave);
191 0b8f1b10 blueswir1
    qemu_get_be32s(f, &env->canrestore);
192 0b8f1b10 blueswir1
    qemu_get_be32s(f, &env->otherwin);
193 0b8f1b10 blueswir1
    qemu_get_be32s(f, &env->wstate);
194 0b8f1b10 blueswir1
    qemu_get_be32s(f, &env->cleanwin);
195 0b8f1b10 blueswir1
    for (i = 0; i < 8; i++)
196 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->agregs[i]);
197 0b8f1b10 blueswir1
    for (i = 0; i < 8; i++)
198 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->bgregs[i]);
199 0b8f1b10 blueswir1
    for (i = 0; i < 8; i++)
200 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->igregs[i]);
201 0b8f1b10 blueswir1
    for (i = 0; i < 8; i++)
202 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->mgregs[i]);
203 0b8f1b10 blueswir1
    qemu_get_be64s(f, &env->fprs);
204 0b8f1b10 blueswir1
    qemu_get_be64s(f, &env->tick_cmpr);
205 0b8f1b10 blueswir1
    qemu_get_be64s(f, &env->stick_cmpr);
206 0b8f1b10 blueswir1
    qemu_get_ptimer(f, env->tick);
207 0b8f1b10 blueswir1
    qemu_get_ptimer(f, env->stick);
208 0b8f1b10 blueswir1
    qemu_get_be64s(f, &env->gsr);
209 0b8f1b10 blueswir1
    qemu_get_be32s(f, &env->gl);
210 0b8f1b10 blueswir1
    qemu_get_be64s(f, &env->hpstate);
211 c19148bd blueswir1
    for (i = 0; i < MAXTL_MAX; i++)
212 0b8f1b10 blueswir1
        qemu_get_be64s(f, &env->htstate[i]);
213 0b8f1b10 blueswir1
    qemu_get_be64s(f, &env->hintp);
214 0b8f1b10 blueswir1
    qemu_get_be64s(f, &env->htba);
215 0b8f1b10 blueswir1
    qemu_get_be64s(f, &env->hver);
216 0b8f1b10 blueswir1
    qemu_get_be64s(f, &env->hstick_cmpr);
217 0b8f1b10 blueswir1
    qemu_get_be64s(f, &env->ssr);
218 0b8f1b10 blueswir1
    qemu_get_ptimer(f, env->hstick);
219 8dd3dca3 aurel32
#endif
220 8dd3dca3 aurel32
    tlb_flush(env, 1);
221 8dd3dca3 aurel32
    return 0;
222 8dd3dca3 aurel32
}