Revision e6cb4d45 hw/hpet.c
b/hw/hpet.c | ||
---|---|---|
157 | 157 |
} |
158 | 158 |
} |
159 | 159 |
|
160 |
static void hpet_save(QEMUFile *f, void *opaque)
|
|
160 |
static void hpet_pre_save(const void *opaque)
|
|
161 | 161 |
{ |
162 |
HPETState *s = opaque; |
|
163 |
int i; |
|
164 |
qemu_put_be64s(f, &s->config); |
|
165 |
qemu_put_be64s(f, &s->isr); |
|
162 |
HPETState *s = (void *)opaque; |
|
166 | 163 |
/* save current counter value */ |
167 | 164 |
s->hpet_counter = hpet_get_ticks(); |
168 |
qemu_put_be64s(f, &s->hpet_counter); |
|
169 |
|
|
170 |
for (i = 0; i < HPET_NUM_TIMERS; i++) { |
|
171 |
qemu_put_8s(f, &s->timer[i].tn); |
|
172 |
qemu_put_be64s(f, &s->timer[i].config); |
|
173 |
qemu_put_be64s(f, &s->timer[i].cmp); |
|
174 |
qemu_put_be64s(f, &s->timer[i].fsb); |
|
175 |
qemu_put_be64s(f, &s->timer[i].period); |
|
176 |
qemu_put_8s(f, &s->timer[i].wrap_flag); |
|
177 |
qemu_put_timer(f, s->timer[i].qemu_timer); |
|
178 |
} |
|
179 | 165 |
} |
180 | 166 |
|
181 |
static int hpet_load(QEMUFile *f, void *opaque, int version_id)
|
|
167 |
static int hpet_post_load(void *opaque)
|
|
182 | 168 |
{ |
183 | 169 |
HPETState *s = opaque; |
184 |
int i; |
|
185 | 170 |
|
186 |
if (version_id != 1) |
|
187 |
return -EINVAL; |
|
188 |
|
|
189 |
qemu_get_be64s(f, &s->config); |
|
190 |
qemu_get_be64s(f, &s->isr); |
|
191 |
qemu_get_be64s(f, &s->hpet_counter); |
|
192 | 171 |
/* Recalculate the offset between the main counter and guest time */ |
193 | 172 |
s->hpet_offset = ticks_to_ns(s->hpet_counter) - qemu_get_clock(vm_clock); |
194 |
|
|
195 |
for (i = 0; i < HPET_NUM_TIMERS; i++) { |
|
196 |
qemu_get_8s(f, &s->timer[i].tn); |
|
197 |
qemu_get_be64s(f, &s->timer[i].config); |
|
198 |
qemu_get_be64s(f, &s->timer[i].cmp); |
|
199 |
qemu_get_be64s(f, &s->timer[i].fsb); |
|
200 |
qemu_get_be64s(f, &s->timer[i].period); |
|
201 |
qemu_get_8s(f, &s->timer[i].wrap_flag); |
|
202 |
qemu_get_timer(f, s->timer[i].qemu_timer); |
|
203 |
} |
|
204 | 173 |
return 0; |
205 | 174 |
} |
206 | 175 |
|
176 |
static const VMStateDescription vmstate_hpet_timer = { |
|
177 |
.name = "hpet_timer", |
|
178 |
.version_id = 1, |
|
179 |
.minimum_version_id = 1, |
|
180 |
.minimum_version_id_old = 1, |
|
181 |
.fields = (VMStateField []) { |
|
182 |
VMSTATE_UINT8(tn, HPETTimer), |
|
183 |
VMSTATE_UINT64(config, HPETTimer), |
|
184 |
VMSTATE_UINT64(cmp, HPETTimer), |
|
185 |
VMSTATE_UINT64(fsb, HPETTimer), |
|
186 |
VMSTATE_UINT64(period, HPETTimer), |
|
187 |
VMSTATE_UINT8(wrap_flag, HPETTimer), |
|
188 |
VMSTATE_TIMER(qemu_timer, HPETTimer), |
|
189 |
VMSTATE_END_OF_LIST() |
|
190 |
} |
|
191 |
}; |
|
192 |
|
|
193 |
static const VMStateDescription vmstate_hpet = { |
|
194 |
.name = "hpet", |
|
195 |
.version_id = 1, |
|
196 |
.minimum_version_id = 1, |
|
197 |
.minimum_version_id_old = 1, |
|
198 |
.pre_save = hpet_pre_save, |
|
199 |
.post_load = hpet_post_load, |
|
200 |
.fields = (VMStateField []) { |
|
201 |
VMSTATE_UINT64(config, HPETState), |
|
202 |
VMSTATE_UINT64(isr, HPETState), |
|
203 |
VMSTATE_UINT64(hpet_counter, HPETState), |
|
204 |
VMSTATE_STRUCT_ARRAY(timer, HPETState, HPET_NUM_TIMERS, 0, |
|
205 |
vmstate_hpet_timer, HPETTimer), |
|
206 |
VMSTATE_END_OF_LIST() |
|
207 |
} |
|
208 |
}; |
|
209 |
|
|
207 | 210 |
/* |
208 | 211 |
* timer expiration callback |
209 | 212 |
*/ |
... | ... | |
575 | 578 |
timer->qemu_timer = qemu_new_timer(vm_clock, hpet_timer, timer); |
576 | 579 |
} |
577 | 580 |
hpet_reset(s); |
578 |
register_savevm("hpet", -1, 1, hpet_save, hpet_load, s);
|
|
581 |
vmstate_register(-1, &vmstate_hpet, s);
|
|
579 | 582 |
qemu_register_reset(hpet_reset, s); |
580 | 583 |
/* HPET Area */ |
581 | 584 |
iomemtype = cpu_register_io_memory(hpet_ram_read, |
Also available in: Unified diff