From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: Juan Quintela <quintela@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 13/36] vmstate: port ppc cpu
Date: Wed, 21 Mar 2012 16:52:36 -0500 [thread overview]
Message-ID: <20120321215236.GE18965@illuin> (raw)
In-Reply-To: <bbdd1f845f58bdda271f111bb68adb6ccf6a7971.1332197811.git.quintela@redhat.com>
On Mon, Mar 19, 2012 at 11:57:41PM +0100, Juan Quintela wrote:
> Added sdr1_vmstate because storing the value requires calling ppc_store_sdr1().
> The position when the function is called also changes (I think it is save).
Doesn't side-effect any loads that originally occurred after it, and
same holds for possible call to tlb_flush(), so it seems to safe to move
it to cpu_post_load.
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
>
> Signed-off-by: Juan Quintela <quintela@redhat.com>
> ---
> target-ppc/cpu.h | 5 +-
> target-ppc/machine.c | 245 ++++++++++++++++++--------------------------------
> 2 files changed, 90 insertions(+), 160 deletions(-)
>
> diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
> index ca6f1cb..595ffb1 100644
> --- a/target-ppc/cpu.h
> +++ b/target-ppc/cpu.h
> @@ -1064,6 +1064,9 @@ struct CPUPPCState {
> */
> uint8_t fit_period[4];
> uint8_t wdt_period[4];
> +
> + /* Fields needed as intermediate for vmstate */
> + target_ulong sdr1_vmstate;
> };
>
> #define SET_FIT_PERIOD(a_, b_, c_, d_) \
> @@ -1219,8 +1222,6 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, uint32_t val);
> #define cpu_signal_handler cpu_ppc_signal_handler
> #define cpu_list ppc_cpu_list
>
> -#define CPU_SAVE_VERSION 4
> -
> /* MMU modes definitions */
> #define MMU_MODE0_SUFFIX _user
> #define MMU_MODE1_SUFFIX _kernel
> diff --git a/target-ppc/machine.c b/target-ppc/machine.c
> index d6c2ee4..ca60bc0 100644
> --- a/target-ppc/machine.c
> +++ b/target-ppc/machine.c
> @@ -2,172 +2,101 @@
> #include "hw/boards.h"
> #include "kvm.h"
>
> -void cpu_save(QEMUFile *f, void *opaque)
> +static const VMStateDescription vmstate_tlb = {
> + .name = "tlb",
> + .version_id = 1,
> + .minimum_version_id = 1,
> + .minimum_version_id_old = 1,
> + .fields = (VMStateField[]) {
> + VMSTATE_UINTTL(pte0, ppc6xx_tlb_t),
> + VMSTATE_UINTTL(pte1, ppc6xx_tlb_t),
> + VMSTATE_UINTTL(EPN, ppc6xx_tlb_t),
> + VMSTATE_END_OF_LIST()
> + }
> +};
> +
> +static bool is_tlb6(void *opaque, int version_id)
> {
> - CPUPPCState *env = (CPUPPCState *)opaque;
> - unsigned int i, j;
> + CPUPPCState *env = opaque;
>
> - for (i = 0; i < 32; i++)
> - qemu_put_betls(f, &env->gpr[i]);
> -#if !defined(TARGET_PPC64)
> - for (i = 0; i < 32; i++)
> - qemu_put_betls(f, &env->gprh[i]);
> -#endif
> - qemu_put_betls(f, &env->lr);
> - qemu_put_betls(f, &env->ctr);
> - for (i = 0; i < 8; i++)
> - qemu_put_be32s(f, &env->crf[i]);
> - qemu_put_betls(f, &env->xer);
> - qemu_put_betls(f, &env->reserve_addr);
> - qemu_put_betls(f, &env->msr);
> - for (i = 0; i < 4; i++)
> - qemu_put_betls(f, &env->tgpr[i]);
> - for (i = 0; i < 32; i++) {
> - union {
> - float64 d;
> - uint64_t l;
> - } u;
> - u.d = env->fpr[i];
> - qemu_put_be64(f, u.l);
> - }
> - qemu_put_be32s(f, &env->fpscr);
> - qemu_put_sbe32s(f, &env->access_type);
> -#if defined(TARGET_PPC64)
> - qemu_put_betls(f, &env->asr);
> - qemu_put_sbe32s(f, &env->slb_nr);
> -#endif
> - qemu_put_betls(f, &env->spr[SPR_SDR1]);
> - for (i = 0; i < 32; i++)
> - qemu_put_betls(f, &env->sr[i]);
> - for (i = 0; i < 2; i++)
> - for (j = 0; j < 8; j++)
> - qemu_put_betls(f, &env->DBAT[i][j]);
> - for (i = 0; i < 2; i++)
> - for (j = 0; j < 8; j++)
> - qemu_put_betls(f, &env->IBAT[i][j]);
> - qemu_put_sbe32s(f, &env->nb_tlb);
> - qemu_put_sbe32s(f, &env->tlb_per_way);
> - qemu_put_sbe32s(f, &env->nb_ways);
> - qemu_put_sbe32s(f, &env->last_way);
> - qemu_put_sbe32s(f, &env->id_tlbs);
> - qemu_put_sbe32s(f, &env->nb_pids);
> - if (env->tlb.tlb6) {
> - // XXX assumes 6xx
> - for (i = 0; i < env->nb_tlb; i++) {
> - qemu_put_betls(f, &env->tlb.tlb6[i].pte0);
> - qemu_put_betls(f, &env->tlb.tlb6[i].pte1);
> - qemu_put_betls(f, &env->tlb.tlb6[i].EPN);
> - }
> - }
> - for (i = 0; i < 4; i++)
> - qemu_put_betls(f, &env->pb[i]);
> - for (i = 0; i < 1024; i++)
> - qemu_put_betls(f, &env->spr[i]);
> - qemu_put_be32s(f, &env->vscr);
> - qemu_put_be64s(f, &env->spe_acc);
> - qemu_put_be32s(f, &env->spe_fscr);
> - qemu_put_betls(f, &env->msr_mask);
> - qemu_put_be32s(f, &env->flags);
> - qemu_put_sbe32s(f, &env->error_code);
> - qemu_put_be32s(f, &env->pending_interrupts);
> - qemu_put_be32s(f, &env->irq_input_state);
> - for (i = 0; i < POWERPC_EXCP_NB; i++)
> - qemu_put_betls(f, &env->excp_vectors[i]);
> - qemu_put_betls(f, &env->excp_prefix);
> - qemu_put_betls(f, &env->hreset_excp_prefix);
> - qemu_put_betls(f, &env->ivor_mask);
> - qemu_put_betls(f, &env->ivpr_mask);
> - qemu_put_betls(f, &env->hreset_vector);
> - qemu_put_betls(f, &env->nip);
> - qemu_put_betls(f, &env->hflags);
> - qemu_put_betls(f, &env->hflags_nmsr);
> - qemu_put_sbe32s(f, &env->mmu_idx);
> - qemu_put_sbe32s(f, &env->power_mode);
> + return (env->tlb.tlb6 != NULL);
> }
>
> -int cpu_load(QEMUFile *f, void *opaque, int version_id)
> +static void cpu_pre_save(void *opaque)
> {
> - CPUPPCState *env = (CPUPPCState *)opaque;
> - unsigned int i, j;
> - target_ulong sdr1;
> + CPUPPCState *env = opaque;
> + env->sdr1_vmstate = env->spr[SPR_SDR1];
> +}
>
> - for (i = 0; i < 32; i++)
> - qemu_get_betls(f, &env->gpr[i]);
> +static int cpu_post_load(void *opaque, int version_id)
> +{
> + CPUPPCState *env = opaque;
> + ppc_store_sdr1(env, env->sdr1_vmstate);
> + return 0;
> +}
> +
> +const VMStateDescription vmstate_cpu = {
> + .name = "cpu",
> + .version_id = 4,
> + .minimum_version_id = 4,
> + .minimum_version_id_old = 4,
> + .pre_save = cpu_pre_save,
> + .post_load = cpu_post_load,
> + .fields = (VMStateField[]) {
> + VMSTATE_UINTTL_ARRAY(gpr, CPUPPCState, 32),
> #if !defined(TARGET_PPC64)
> - for (i = 0; i < 32; i++)
> - qemu_get_betls(f, &env->gprh[i]);
> + VMSTATE_UINTTL_ARRAY(gprh, CPUPPCState, 32),
> #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, &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, &env->fpscr);
> - qemu_get_sbe32s(f, &env->access_type);
> + VMSTATE_UINTTL(lr, CPUPPCState),
> + VMSTATE_UINTTL(ctr, CPUPPCState),
> + VMSTATE_UINT32_ARRAY(crf, CPUPPCState, 8),
> + VMSTATE_UINTTL(xer, CPUPPCState),
> + VMSTATE_UINTTL(reserve_addr, CPUPPCState),
> + VMSTATE_UINTTL(msr, CPUPPCState),
> + VMSTATE_UINTTL_ARRAY(tgpr, CPUPPCState, 4),
> + VMSTATE_FLOAT64_ARRAY(fpr, CPUPPCState, 32),
> + VMSTATE_UINT32(fpscr, CPUPPCState),
> + VMSTATE_INT32(access_type, CPUPPCState),
> #if defined(TARGET_PPC64)
> - qemu_get_betls(f, &env->asr);
> - qemu_get_sbe32s(f, &env->slb_nr);
> + VMSTATE_UINTTL(asr, CPUPPCState),
> + VMSTATE_INT32(slb_nr, CPUPPCState),
> #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]);
> - 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->hreset_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_sbe32s(f, &env->power_mode);
> + VMSTATE_UINTTL(spr[SPR_SDR1], CPUPPCState),
> + VMSTATE_UINTTL_ARRAY(sr, CPUPPCState, 32),
> + VMSTATE_UINTTL_ARRAY(DBAT[0], CPUPPCState, 8),
> + VMSTATE_UINTTL_ARRAY(DBAT[1], CPUPPCState, 8),
> + VMSTATE_UINTTL_ARRAY(IBAT[0], CPUPPCState, 8),
> + VMSTATE_UINTTL_ARRAY(IBAT[1], CPUPPCState, 8),
> + VMSTATE_INT32(nb_tlb, CPUPPCState),
> + VMSTATE_INT32(tlb_per_way, CPUPPCState),
> + VMSTATE_INT32(nb_ways, CPUPPCState),
> + VMSTATE_INT32(last_way, CPUPPCState),
> + VMSTATE_INT32(id_tlbs, CPUPPCState),
> + VMSTATE_INT32(nb_pids, CPUPPCState),
> + VMSTATE_STRUCT_VARRAY_INT32_TEST(tlb.tlb6, CPUPPCState, nb_tlb,
> + is_tlb6, vmstate_tlb, ppc6xx_tlb_t),
> + VMSTATE_UINTTL_ARRAY(pb, CPUPPCState, 4),
> + VMSTATE_UINTTL_ARRAY(spr, CPUPPCState, 1024),
> + VMSTATE_UINT32(vscr, CPUPPCState),
> + VMSTATE_UINT64(spe_acc, CPUPPCState),
> + VMSTATE_UINT32(spe_fscr, CPUPPCState),
> + VMSTATE_UINTTL(msr_mask, CPUPPCState),
> + VMSTATE_UINT32(flags, CPUPPCState),
> + VMSTATE_INT32(error_code, CPUPPCState),
> + VMSTATE_UINT32(pending_interrupts, CPUPPCState),
> + VMSTATE_UINT32(irq_input_state, CPUPPCState),
> + VMSTATE_UINTTL_ARRAY(excp_vectors, CPUPPCState, POWERPC_EXCP_NB),
> + VMSTATE_UINTTL(excp_prefix, CPUPPCState),
> + VMSTATE_UINTTL(hreset_excp_prefix, CPUPPCState),
> + VMSTATE_UINTTL(ivor_mask, CPUPPCState),
> + VMSTATE_UINTTL(ivpr_mask, CPUPPCState),
> + VMSTATE_UINTTL(hreset_vector, CPUPPCState),
> + VMSTATE_UINTTL(nip, CPUPPCState),
> + VMSTATE_UINTTL(hflags, CPUPPCState),
> + VMSTATE_UINTTL(hflags_nmsr, CPUPPCState),
> + VMSTATE_INT32(mmu_idx, CPUPPCState),
> + VMSTATE_INT32(power_mode, CPUPPCState),
> + VMSTATE_END_OF_LIST()
> + },
> +};
>
> - return 0;
> -}
> --
> 1.7.7.6
>
>
next prev parent reply other threads:[~2012-03-21 21:52 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-19 22:57 [Qemu-devel] [PATCH v4 00/36] VMState port of all cpus Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 01/36] vmstate: Simplify test for CPU_SAVE_VERSION Juan Quintela
2012-03-21 20:35 ` Michael Roth
2012-03-19 22:57 ` [Qemu-devel] [PATCH 02/36] vmstate: make all architectures export a way to migrate cpu's Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 03/36] vmstate: unicore32 don't support cpu migration Juan Quintela
2012-03-21 20:49 ` Michael Roth
2012-03-19 22:57 ` [Qemu-devel] [PATCH 04/36] vmstate: use new cpu style for x86 Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 05/36] vmstate: use new style for lm32 cpus Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 06/36] vmstate: make microblaze cpus not migrateable Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 07/36] vmstate: port cris cpu to vmstate Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 08/36] vmstate: machine.c is only compiled for !CONFIG_USER_ONLY Juan Quintela
2012-03-21 18:09 ` Andreas Färber
2012-03-21 19:20 ` Peter Maydell
2012-03-19 22:57 ` [Qemu-devel] [PATCH 09/36] vmstate: introduce float32 arrays Juan Quintela
2012-03-20 14:11 ` Peter Maydell
2012-03-20 15:20 ` Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 10/36] vmstate: introduce float64 arrays Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 11/36] vmstate: introduce CPU_DoubleU arrays Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 12/36] vmstate: Introduce VMSTATE_STRUCT_VARRAY_INT32_TEST Juan Quintela
2012-03-21 20:16 ` Igor Mitsyanko
2012-03-19 22:57 ` [Qemu-devel] [PATCH 13/36] vmstate: port ppc cpu Juan Quintela
2012-03-21 21:52 ` Michael Roth [this message]
2012-03-21 21:56 ` Peter Maydell
2012-03-19 22:57 ` [Qemu-devel] [PATCH 14/36] vmstate: introduce VMSTATE_VARRAY_MULTIPLY Juan Quintela
2012-03-21 20:54 ` Igor Mitsyanko
2012-03-19 22:57 ` [Qemu-devel] [PATCH 15/36] vmstate: define vmstate_info_uinttls Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 16/36] vmstate: port sparc cpu Juan Quintela
2012-03-21 22:46 ` Michael Roth
2012-03-24 12:32 ` Blue Swirl
2012-03-19 22:57 ` [Qemu-devel] [PATCH 17/36] vmstate: make incompatible change for sparc Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 18/36] mips_fulong2e: cpu vmstate already registered in cpu_exec_init Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 19/36] mips: make mvp an embedded struct instead of a pointer Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 20/36] mips: make tlb " Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 21/36] mips: bump migration version to 4 Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 22/36] vmstate: port mips cpu Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 23/36] arm: save always 32 fpu registers Juan Quintela
2012-03-20 11:54 ` Peter Maydell
2012-03-20 12:27 ` Juan Quintela
2012-03-20 13:48 ` Peter Maydell
2012-03-19 22:57 ` [Qemu-devel] [PATCH 24/36] vmstate: port arm cpu Juan Quintela
2012-03-21 16:29 ` Andreas Färber
2012-03-21 16:42 ` Peter Maydell
2012-03-21 17:16 ` Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 25/36] vmstate: all cpus converted Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 26/36] vmstate: fix vmstate formating for i386 Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 27/36] vmstate: remove unneeded includes from target-*/machine.c Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 28/36] vmstate: rename machine.c to vmstate-cpu.c Juan Quintela
2012-03-22 12:42 ` Andreas Färber
2012-03-22 13:13 ` Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 29/36] vmstate: Add copyright info for alpha processor Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 30/36] vmstate: Add copyright info for lm32 processor Juan Quintela
2012-03-19 22:57 ` [Qemu-devel] [PATCH 31/36] vmstate: Add copyright info for cris processor Juan Quintela
2012-03-19 22:58 ` [Qemu-devel] [PATCH 32/36] vmstate: Add copyright info for arm processor Juan Quintela
2012-03-19 22:58 ` [Qemu-devel] [PATCH 33/36] vmstate: Add copyright info for i386 processor Juan Quintela
2012-03-19 22:58 ` [Qemu-devel] [PATCH 34/36] vmstate: Add copyright info for mips processor Juan Quintela
2012-03-19 22:58 ` [Qemu-devel] [PATCH 35/36] vmstate: Add copyright info for ppc processor Juan Quintela
2012-03-19 22:58 ` [Qemu-devel] [PATCH 36/36] vmstate: Add copyright info for sparc processor Juan Quintela
2012-03-21 17:13 ` [Qemu-devel] [PATCH v4 00/36] VMState port of all cpus Andreas Färber
2012-03-21 17:24 ` Juan Quintela
2012-03-21 18:43 ` Andreas Färber
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120321215236.GE18965@illuin \
--to=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.