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