Statistics
| Branch: | Revision:

root / target-sparc / machine.c @ 5b50e790

History | View | Annotate | Download (6.7 kB)

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