static int rtc_load(QEMUFile *f, void *opaque, int version_id) { RTCState *s = opaque; if (version_id != 1) return -EINVAL; qemu_get_buffer(f, s->cmos_data, 128); qemu_get_8s(f, &s->cmos_index); s->current_tm.tm_sec=qemu_get_be32(f); s->current_tm.tm_min=qemu_get_be32(f); s->current_tm.tm_hour=qemu_get_be32(f); s->current_tm.tm_wday=qemu_get_be32(f); s->current_tm.tm_mday=qemu_get_be32(f); s->current_tm.tm_mon=qemu_get_be32(f); s->current_tm.tm_year=qemu_get_be32(f); qemu_get_timer(f, s->periodic_timer); s->next_periodic_time=qemu_get_be64(f); s->next_second_time=qemu_get_be64(f); qemu_get_timer(f, s->second_timer); qemu_get_timer(f, s->second_timer2); return 0; }
static int s390_storage_keys_load(QEMUFile *f, void *opaque, int version_id) { S390SKeysState *ss = S390_SKEYS(opaque); S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss); int ret = 0; while (!ret) { ram_addr_t addr; int flags; addr = qemu_get_be64(f); flags = addr & ~TARGET_PAGE_MASK; addr &= TARGET_PAGE_MASK; switch (flags) { case S390_SKEYS_SAVE_FLAG_SKEYS: { const uint64_t total_count = qemu_get_be64(f); uint64_t handled_count = 0, cur_count; uint64_t cur_gfn = addr / TARGET_PAGE_SIZE; uint8_t *buf = g_try_malloc(S390_SKEYS_BUFFER_SIZE); if (!buf) { error_report("storage key load could not allocate memory\n"); ret = -ENOMEM; break; } while (handled_count < total_count) { cur_count = MIN(total_count - handled_count, S390_SKEYS_BUFFER_SIZE); qemu_get_buffer(f, buf, cur_count); ret = skeyclass->set_skeys(ss, cur_gfn, cur_count, buf); if (ret < 0) { error_report("S390_SET_KEYS error %d\n", ret); break; } handled_count += cur_count; cur_gfn += cur_count; } g_free(buf); break; } case S390_SKEYS_SAVE_FLAG_ERROR: { error_report("Storage key data is incomplete"); ret = -EINVAL; break; } case S390_SKEYS_SAVE_FLAG_EOS: /* normal exit */ return 0; default: error_report("Unexpected storage key flag data: %#x", flags); ret = -EINVAL; } } return ret; }
static int cmma_load(QEMUFile *f, void *opaque, int version_id) { S390StAttribState *sas = S390_STATTRIB(opaque); S390StAttribClass *sac = S390_STATTRIB_GET_CLASS(sas); uint64_t count, cur_gfn; int flags, ret = 0; ram_addr_t addr; uint8_t *buf; while (!ret) { addr = qemu_get_be64(f); flags = addr & ~TARGET_PAGE_MASK; addr &= TARGET_PAGE_MASK; switch (flags) { case STATTR_FLAG_MORE: { cur_gfn = addr / TARGET_PAGE_SIZE; count = qemu_get_be64(f); buf = g_try_malloc(count); if (!buf) { error_report("cmma_load could not allocate memory"); ret = -ENOMEM; break; } qemu_get_buffer(f, buf, count); ret = sac->set_stattr(sas, cur_gfn, count, buf); if (ret < 0) { error_report("Error %d while setting storage attributes", ret); } g_free(buf); break; } case STATTR_FLAG_ERROR: { error_report("Storage attributes data is incomplete"); ret = -EINVAL; break; } case STATTR_FLAG_DONE: /* This is after the last pre-copied value has been sent, nothing * more will be sent after this. Pre-copy has finished, and we * are done flushing all the remaining values. Now the target * system is about to take over. We synchronize the buffer to * apply the actual correct values where needed. */ sac->synchronize(sas); break; case STATTR_FLAG_EOS: /* Normal exit */ return 0; default: error_report("Unexpected storage attribute flag data: %#x", flags); ret = -EINVAL; } } return ret; }
static int get_slbe(QEMUFile *f, void *pv, size_t size) { ppc_slb_t *v = pv; v->esid = qemu_get_be64(f); v->vsid = qemu_get_be64(f); return 0; }
static int get_avr(QEMUFile *f, void *pv, size_t size) { ppc_avr_t *v = pv; v->u64[0] = qemu_get_be64(f); v->u64[1] = qemu_get_be64(f); return 0; }
static int get_slbe(QEMUFile *f, void *pv, size_t size, const VMStateField *field) { ppc_slb_t *v = pv; v->esid = qemu_get_be64(f); v->vsid = qemu_get_be64(f); return 0; }
static int get_avr(QEMUFile *f, void *pv, size_t size, const VMStateField *field) { ppc_avr_t *v = pv; v->u64[0] = qemu_get_be64(f); v->u64[1] = qemu_get_be64(f); return 0; }
static int syborg_rtc_load(QEMUFile *f, void *opaque, int version_id) { SyborgRTCState *s = opaque; if (version_id != 1) return -EINVAL; s->offset = qemu_get_be64(f); s->data = qemu_get_be64(f); return 0; }
static int get_float64(QEMUFile *f, void *pv, size_t size) { float64 *v = pv; *v = make_float64(qemu_get_be64(f)); return 0; }
/* This function is only used for old state version 1 and 2 */ static int apic_load_old(QEMUFile *f, void *opaque, int version_id) { APICCommonState *s = opaque; APICCommonClass *info = APIC_COMMON_GET_CLASS(s); int i; if (version_id > 2) { return -EINVAL; } /* XXX: what if the base changes? (registered memory regions) */ qemu_get_be32s(f, &s->apicbase); qemu_get_8s(f, &s->id); qemu_get_8s(f, &s->arb_id); qemu_get_8s(f, &s->tpr); qemu_get_be32s(f, &s->spurious_vec); qemu_get_8s(f, &s->log_dest); qemu_get_8s(f, &s->dest_mode); for (i = 0; i < 8; i++) { qemu_get_be32s(f, &s->isr[i]); qemu_get_be32s(f, &s->tmr[i]); qemu_get_be32s(f, &s->irr[i]); } for (i = 0; i < APIC_LVT_NB; i++) { qemu_get_be32s(f, &s->lvt[i]); } qemu_get_be32s(f, &s->esr); qemu_get_be32s(f, &s->icr[0]); qemu_get_be32s(f, &s->icr[1]); qemu_get_be32s(f, &s->divide_conf); s->count_shift = qemu_get_be32(f); qemu_get_be32s(f, &s->initial_count); s->initial_count_load_time = qemu_get_be64(f); s->next_time = qemu_get_be64(f); if (version_id >= 2) { s->timer_expiry = qemu_get_be64(f); } if (info->post_load) { info->post_load(s); } return 0; }
void timer_get(QEMUFile *f, QEMUTimer *ts) { uint64_t expire_time; expire_time = qemu_get_be64(f); if (expire_time != -1) { timer_mod_ns(ts, expire_time); } else { timer_del(ts); } }
static int goldfish_rtc_load(QEMUFile* f, void* opaque, int version_id) { struct rtc_state* s = opaque; if (version_id != GOLDFISH_RTC_SAVE_VERSION) return -1; /* this is an old value that is not correct. but that's ok anyway */ s->now = qemu_get_be64(f); return 0; }
void qemu_get_timer(QEMUFile *f, QEMUTimer *ts) { uint64_t expire_time; expire_time = qemu_get_be64(f); if (expire_time != -1) { qemu_mod_timer_ns(ts, expire_time); } else { qemu_del_timer(ts); } }
static int get_bitmap(QEMUFile *f, void *pv, size_t size) { unsigned long *bmp = pv; int i, idx = 0; for (i = 0; i < BITS_TO_U64S(size); i++) { uint64_t w = qemu_get_be64(f); bmp[idx++] = w; if (sizeof(unsigned long) == 4 && idx < BITS_TO_LONGS(size)) { bmp[idx++] = w >> 32; } }
/** * Overwrites the contents of the disk image managed by this device with the * contents as they were at the point the snapshot was made. */ static int nand_dev_load_disk_state(QEMUFile *f, nand_dev *dev) { #ifndef ANDROID_QCOW int buf_size = NAND_DEV_SAVE_DISK_BUF_SIZE; uint8_t buffer[NAND_DEV_SAVE_DISK_BUF_SIZE] = {0}; int ret; /* File size for restore and truncate */ uint64_t total_size = qemu_get_be64(f); if (total_size > dev->max_size) { XLOG("%s, restore failed: size required (%lld) exceeds device limit (%lld)\n", __FUNCTION__, total_size, dev->max_size); return -EIO; } /* overwrite disk contents with snapshot contents */ uint64_t next_offset = 0; ret = do_lseek(dev->fd, 0, SEEK_SET); if (ret < 0) { XLOG("%s seek failed: %s\n", __FUNCTION__, strerror(errno)); return -EIO; } while (next_offset < total_size) { /* snapshot buffer may not be an exact multiple of buf_size * if necessary, adjust buffer size for last copy operation */ if (total_size - next_offset < buf_size) { buf_size = total_size - next_offset; } ret = qemu_get_buffer(f, buffer, buf_size); if (ret != buf_size) { XLOG("%s read failed: expected %d bytes but got %d\n", __FUNCTION__, buf_size, ret); return -EIO; } ret = do_write(dev->fd, buffer, buf_size); if (ret != buf_size) { XLOG("%s, write failed: %s\n", __FUNCTION__, strerror(errno)); return -EIO; } next_offset += buf_size; } ret = do_ftruncate(dev->fd, total_size); if (ret < 0) { XLOG("%s ftruncate failed: %s\n", __FUNCTION__, strerror(errno)); return -EIO; } #endif return 0; }
static Pipe* pipe_load( PipeDevice* dev, QEMUFile* file, int version_id ) { Pipe* pipe; const PipeService* service = NULL; int state = qemu_get_byte(file); uint64_t channel; if (state != 0) { /* Pipe is associated with a service. */ char* name = qemu_get_string(file); if (name == NULL) return NULL; service = goldfish_pipe_find_type(name); if (service == NULL) { D("No QEMU pipe service named '%s'", name); AFREE(name); return NULL; } } if (version_id == GOLDFISH_PIPE_SAVE_VERSION_LEGACY) { channel = qemu_get_be32(file); } else { channel = qemu_get_be64(file); } pipe = pipe_new(channel, dev); pipe->wanted = qemu_get_byte(file); pipe->closed = qemu_get_byte(file); if (qemu_get_byte(file) != 0) { pipe->args = qemu_get_string(file); } pipe->service = service; if (service != NULL) { pipe->funcs = &service->funcs; } if (pipe->funcs->load) { pipe->opaque = pipe->funcs->load(pipe, service ? service->opaque : NULL, pipe->args, file); if (pipe->opaque == NULL) { AFREE(pipe); return NULL; } } else { /* Force-close the pipe on load */ pipe->closed = 1; } return pipe; }
static int goldfish_mmc_load(QEMUFile* f, void* opaque, int version_id) { struct goldfish_mmc_state* s = opaque; if (version_id == GOLDFISH_MMC_SAVE_VERSION) { s->buffer_address = qemu_get_be64(f); } else if (version_id == GOLDFISH_MMC_SAVE_VERSION_LEGACY) { s->buffer_address = qemu_get_be32(f); } else { // Unsupported version! return -1; } return qemu_get_struct(f, goldfish_mmc_fields, s); }
static int goldfish_timer_load(QEMUFile* f, void* opaque, int version_id) { struct timer_state* s = opaque; if (version_id != GOLDFISH_TIMER_SAVE_VERSION) return -1; s->now = qemu_get_be64(f); s->armed = qemu_get_byte(f); if (s->armed) { int64_t now = qemu_get_clock(vm_clock); int64_t diff = qemu_get_be64(f); int64_t alarm = now + diff; if (alarm <= now) { goldfish_device_set_irq(&s->dev, 0, 1); s->armed = 0; } else { qemu_mod_timer(s->timer, alarm); } } return 0; }
int virtio_load(VirtIODevice *vdev, QEMUFile *f) { int num, i, ret; uint32_t features; uint32_t supported_features = vdev->binding->get_features(vdev->binding_opaque); if (vdev->binding->load_config) { ret = vdev->binding->load_config(vdev->binding_opaque, f); if (ret) return ret; } qemu_get_8s(f, &vdev->status); qemu_get_8s(f, &vdev->isr); qemu_get_be16s(f, &vdev->queue_sel); qemu_get_be32s(f, &features); if (features & ~supported_features) { fprintf(stderr, "Features 0x%x unsupported. Allowed features: 0x%x\n", features, supported_features); return -1; } vdev->guest_features = features; vdev->config_len = qemu_get_be32(f); qemu_get_buffer(f, vdev->config, vdev->config_len); num = qemu_get_be32(f); for (i = 0; i < num; i++) { vdev->vq[i].vring.num = qemu_get_be32(f); vdev->vq[i].pa = qemu_get_be64(f); qemu_get_be16s(f, &vdev->vq[i].last_avail_idx); if (vdev->vq[i].pa) { virtqueue_init(&vdev->vq[i]); } if (vdev->binding->load_queue) { ret = vdev->binding->load_queue(vdev->binding_opaque, i, f); if (ret) return ret; } } virtio_notify_vector(vdev, VIRTIO_NO_VECTOR); return 0; }
/** * kvm_flic_load - Load pending floating interrupts * @f: QEMUFile containing migration state * @opaque: pointer to flic device state * @version_id: version id for migration * * Returns: value of flic_enqueue_irqs, -EINVAL on error * Note: Do nothing when no interrupts where stored * in QEMUFile */ static int kvm_flic_load(QEMUFile *f, void *opaque, int version_id) { uint64_t len = 0; uint64_t count = 0; void *buf = NULL; int r = 0; if (version_id != FLIC_SAVEVM_VERSION) { r = -EINVAL; goto out; } flic_enable_pfault((struct KVMS390FLICState *) opaque); count = qemu_get_be64(f); len = count * sizeof(struct kvm_s390_irq); if (count == FLIC_FAILED) { r = -EINVAL; goto out; } if (count == 0) { r = 0; goto out; } buf = g_try_malloc0(len); if (!buf) { r = -ENOMEM; goto out; } if (qemu_get_buffer(f, (uint8_t *) buf, len) != len) { r = -EINVAL; goto out_free; } r = flic_enqueue_irqs(buf, len, (struct KVMS390FLICState *) opaque); out_free: g_free(buf); out: return r; }
int ram_load(QEMUFile *f, void *opaque, int version_id) { ram_addr_t addr; int flags; if (version_id != 3) { return -EINVAL; } do { addr = qemu_get_be64(f); flags = addr & ~TARGET_PAGE_MASK; addr &= TARGET_PAGE_MASK; if (flags & RAM_SAVE_FLAG_MEM_SIZE) { if (addr != last_ram_offset) { return -EINVAL; } } if (flags & RAM_SAVE_FLAG_COMPRESS) { uint8_t ch = qemu_get_byte(f); memset(qemu_get_ram_ptr(addr), ch, TARGET_PAGE_SIZE); #ifndef _WIN32 if (ch == 0 && (!kvm_enabled() || kvm_has_sync_mmu())) { madvise(qemu_get_ram_ptr(addr), TARGET_PAGE_SIZE, MADV_DONTNEED); } #endif } else if (flags & RAM_SAVE_FLAG_PAGE) { qemu_get_buffer(f, qemu_get_ram_ptr(addr), TARGET_PAGE_SIZE); } if (qemu_file_has_error(f)) { return -EIO; } } while (!(flags & RAM_SAVE_FLAG_EOS)); return 0; }
static uint64_t colo_receive_message_value(QEMUFile *f, uint32_t expect_msg, Error **errp) { Error *local_err = NULL; uint64_t value; int ret; colo_receive_check_message(f, expect_msg, &local_err); if (local_err) { error_propagate(errp, local_err); return 0; } value = qemu_get_be64(f); ret = qemu_file_get_error(f); if (ret < 0) { error_setg_errno(errp, -ret, "Failed to get value for COLO message: %s", COLOMessage_lookup[expect_msg]); } return value; }
static int goldfish_pipe_load( QEMUFile* file, void* opaque, int version_id ) { PipeDevice* dev = opaque; Pipe* pipe; if (version_id != GOLDFISH_PIPE_SAVE_VERSION) return -EINVAL; dev->address = qemu_get_be32(file); dev->size = qemu_get_be32(file); dev->status = qemu_get_be32(file); dev->channel = qemu_get_be32(file); dev->wakes = qemu_get_be32(file); dev->params_addr = qemu_get_be64(file); int count = qemu_get_sbe32(file); for ( ; count > 0; count-- ) { pipe = pipe_load(dev, file); if (pipe == NULL) { return -EIO; } pipe->next = dev->pipes; dev->pipes = pipe; } for ( pipe = dev->pipes; pipe; pipe = pipe->next ) { if (pipe->wanted != 0) goldfish_pipe_wake(pipe, pipe->wanted); if (pipe->closed != 0) goldfish_pipe_close(pipe); } return 0; }
int gtod_load(QEMUFile *f, void *opaque, int version_id) { uint64_t tod_low; uint8_t tod_high; int r; if (qemu_get_byte(f) == S390_TOD_CLOCK_VALUE_MISSING) { fprintf(stderr, "WARNING: Guest clock was not migrated. This could " "cause the guest to hang.\n"); return 0; } tod_high = qemu_get_byte(f); tod_low = qemu_get_be64(f); r = s390_set_clock(&tod_high, &tod_low); if (r) { fprintf(stderr, "WARNING: Unable to set guest clock value. " "s390_get_clock returned error %d. This could cause " "the guest to hang.\n", r); } return 0; }
static int goldfish_timer_load(QEMUFile* f, void* opaque, int version_id) { struct timer_state* s = opaque; if (version_id != GOLDFISH_TIMER_SAVE_VERSION) return -1; s->now_ns = qemu_get_sbe64(f); /* using qemu_get_be64 (without 's') causes faulty code generation in the compiler, dropping the 32 most significant bits */ s->armed = qemu_get_byte(f); if (s->armed) { int64_t now_tks = qemu_get_clock(vm_clock); int64_t diff_tks = qemu_get_be64(f); int64_t alarm_tks = now_tks + diff_tks; if (alarm_tks <= now_tks) { goldfish_device_set_irq(&s->dev, 0, 1); s->armed = 0; } else { qemu_mod_timer(s->timer, alarm_tks); } } return 0; }
int cpu_load(QEMUFile *f, void *opaque, int version_id) { CPUARMState *env = (CPUARMState *)opaque; int i; uint32_t val; if (version_id != CPU_SAVE_VERSION) return -EINVAL; for (i = 0; i < 16; i++) { env->regs[i] = qemu_get_be32(f); } val = qemu_get_be32(f); /* Avoid mode switch when restoring CPSR. */ env->uncached_cpsr = val & CPSR_M; cpsr_write(env, val, 0xffffffff); env->spsr = qemu_get_be32(f); for (i = 0; i < 6; i++) { env->banked_spsr[i] = qemu_get_be32(f); env->banked_r13[i] = qemu_get_be32(f); env->banked_r14[i] = qemu_get_be32(f); } for (i = 0; i < 5; i++) { env->usr_regs[i] = qemu_get_be32(f); env->fiq_regs[i] = qemu_get_be32(f); } env->cp15.c0_cpuid = qemu_get_be32(f); env->cp15.c0_cachetype = qemu_get_be32(f); env->cp15.c0_cssel = qemu_get_be32(f); env->cp15.c1_sys = qemu_get_be32(f); env->cp15.c1_coproc = qemu_get_be32(f); env->cp15.c1_xscaleauxcr = qemu_get_be32(f); env->cp15.c1_scr = qemu_get_be32(f); env->cp15.c2_base0 = qemu_get_be32(f); env->cp15.c2_base1 = qemu_get_be32(f); env->cp15.c2_control = qemu_get_be32(f); env->cp15.c2_mask = qemu_get_be32(f); env->cp15.c2_base_mask = qemu_get_be32(f); env->cp15.c2_data = qemu_get_be32(f); env->cp15.c2_insn = qemu_get_be32(f); env->cp15.c3 = qemu_get_be32(f); env->cp15.c5_insn = qemu_get_be32(f); env->cp15.c5_data = qemu_get_be32(f); for (i = 0; i < 8; i++) { env->cp15.c6_region[i] = qemu_get_be32(f); } env->cp15.c6_insn = qemu_get_be32(f); env->cp15.c6_data = qemu_get_be32(f); env->cp15.c7_par = qemu_get_be32(f); env->cp15.c9_insn = qemu_get_be32(f); env->cp15.c9_data = qemu_get_be32(f); env->cp15.c9_pmcr = qemu_get_be32(f); env->cp15.c9_pmcnten = qemu_get_be32(f); env->cp15.c9_pmovsr = qemu_get_be32(f); env->cp15.c9_pmxevtyper = qemu_get_be32(f); env->cp15.c9_pmuserenr = qemu_get_be32(f); env->cp15.c9_pminten = qemu_get_be32(f); env->cp15.c13_fcse = qemu_get_be32(f); env->cp15.c13_context = qemu_get_be32(f); env->cp15.c13_tls1 = qemu_get_be32(f); env->cp15.c13_tls2 = qemu_get_be32(f); env->cp15.c13_tls3 = qemu_get_be32(f); env->cp15.c15_cpar = qemu_get_be32(f); env->cp15.c15_power_control = qemu_get_be32(f); env->cp15.c15_diagnostic = qemu_get_be32(f); env->cp15.c15_power_diagnostic = qemu_get_be32(f); env->features = qemu_get_be32(f); if (arm_feature(env, ARM_FEATURE_VFP)) { for (i = 0; i < 16; i++) { CPU_DoubleU u; u.l.upper = qemu_get_be32(f); u.l.lower = qemu_get_be32(f); env->vfp.regs[i] = u.d; } for (i = 0; i < 16; i++) { env->vfp.xregs[i] = qemu_get_be32(f); } /* TODO: Should use proper FPSCR access functions. */ env->vfp.vec_len = qemu_get_be32(f); env->vfp.vec_stride = qemu_get_be32(f); if (arm_feature(env, ARM_FEATURE_VFP3)) { for (i = 16; i < 32; i++) { CPU_DoubleU u; u.l.upper = qemu_get_be32(f); u.l.lower = qemu_get_be32(f); env->vfp.regs[i] = u.d; } } } if (arm_feature(env, ARM_FEATURE_IWMMXT)) { for (i = 0; i < 16; i++) { env->iwmmxt.regs[i] = qemu_get_be64(f); } for (i = 0; i < 16; i++) { env->iwmmxt.cregs[i] = qemu_get_be32(f); } } if (arm_feature(env, ARM_FEATURE_M)) { env->v7m.other_sp = qemu_get_be32(f); env->v7m.vecbase = qemu_get_be32(f); env->v7m.basepri = qemu_get_be32(f); env->v7m.control = qemu_get_be32(f); env->v7m.current_sp = qemu_get_be32(f); env->v7m.exception = qemu_get_be32(f); } if (arm_feature(env, ARM_FEATURE_THUMB2EE)) { env->teecr = qemu_get_be32(f); env->teehbr = qemu_get_be32(f); } return 0; }
static int cpu_load_old(QEMUFile *f, void *opaque, int version_id) { PowerPCCPU *cpu = opaque; CPUPPCState *env = &cpu->env; unsigned int i, j; target_ulong sdr1; uint32_t fpscr; target_ulong xer; for (i = 0; i < 32; i++) qemu_get_betls(f, &env->gpr[i]); #if !defined(TARGET_PPC64) for (i = 0; i < 32; i++) qemu_get_betls(f, &env->gprh[i]); #endif qemu_get_betls(f, &env->lr); qemu_get_betls(f, &env->ctr); for (i = 0; i < 8; i++) qemu_get_be32s(f, &env->crf[i]); qemu_get_betls(f, &xer); cpu_write_xer(env, xer); qemu_get_betls(f, &env->reserve_addr); qemu_get_betls(f, &env->msr); for (i = 0; i < 4; i++) qemu_get_betls(f, &env->tgpr[i]); for (i = 0; i < 32; i++) { union { float64 d; uint64_t l; } u; u.l = qemu_get_be64(f); env->fpr[i] = u.d; } qemu_get_be32s(f, &fpscr); env->fpscr = fpscr; qemu_get_sbe32s(f, &env->access_type); #if defined(TARGET_PPC64) qemu_get_betls(f, &env->spr[SPR_ASR]); qemu_get_sbe32s(f, &env->slb_nr); #endif qemu_get_betls(f, &sdr1); for (i = 0; i < 32; i++) qemu_get_betls(f, &env->sr[i]); for (i = 0; i < 2; i++) for (j = 0; j < 8; j++) qemu_get_betls(f, &env->DBAT[i][j]); for (i = 0; i < 2; i++) for (j = 0; j < 8; j++) qemu_get_betls(f, &env->IBAT[i][j]); qemu_get_sbe32s(f, &env->nb_tlb); qemu_get_sbe32s(f, &env->tlb_per_way); qemu_get_sbe32s(f, &env->nb_ways); qemu_get_sbe32s(f, &env->last_way); qemu_get_sbe32s(f, &env->id_tlbs); qemu_get_sbe32s(f, &env->nb_pids); if (env->tlb.tlb6) { // XXX assumes 6xx for (i = 0; i < env->nb_tlb; i++) { qemu_get_betls(f, &env->tlb.tlb6[i].pte0); qemu_get_betls(f, &env->tlb.tlb6[i].pte1); qemu_get_betls(f, &env->tlb.tlb6[i].EPN); } } for (i = 0; i < 4; i++) qemu_get_betls(f, &env->pb[i]); for (i = 0; i < 1024; i++) qemu_get_betls(f, &env->spr[i]); if (!env->external_htab) { ppc_store_sdr1(env, sdr1); } qemu_get_be32s(f, &env->vscr); qemu_get_be64s(f, &env->spe_acc); qemu_get_be32s(f, &env->spe_fscr); qemu_get_betls(f, &env->msr_mask); qemu_get_be32s(f, &env->flags); qemu_get_sbe32s(f, &env->error_code); qemu_get_be32s(f, &env->pending_interrupts); qemu_get_be32s(f, &env->irq_input_state); for (i = 0; i < POWERPC_EXCP_NB; i++) qemu_get_betls(f, &env->excp_vectors[i]); qemu_get_betls(f, &env->excp_prefix); qemu_get_betls(f, &env->ivor_mask); qemu_get_betls(f, &env->ivpr_mask); qemu_get_betls(f, &env->hreset_vector); qemu_get_betls(f, &env->nip); qemu_get_betls(f, &env->hflags); qemu_get_betls(f, &env->hflags_nmsr); qemu_get_sbe32s(f, &env->mmu_idx); qemu_get_sbe32(f); /* Discard unused power_mode */ return 0; }
static int get_fpcr(QEMUFile *f, void *opaque, size_t size) { CPUAlphaState *env = opaque; cpu_alpha_store_fpcr(env, qemu_get_be64(f)); return 0; }