Message ID | CAH47eN16zb4pJcwV4rYJrXERiPRxhB24_aUut7odxaNMGTBW4A@mail.gmail.com |
---|---|
State | New |
Headers | show |
On 5 March 2014 15:01, alvise rigo <a.rigo@virtualopensystems.com> wrote: > So, if the processor does not start in AArch64 mode, we only add the AArch32 > version of the ARM_CP_STATE_BOTH register to the hashtable, otherwise > nothing changes and we add the two views of the register. Yes, I think if we want TCG<->KVM migration we're going to have to do something like this. It introduces complication for reset handling, though -- at the moment the aarch64 view handles reset and the aarch32 view does not. We'd need to add (back) reset information in the aarch32 views, and also raw read/write functions if needed. > This approach works only > if all the 64bit CPUs will always start in 64 bit mode. You should be checking for whether the CPU has the AARCH64 feature, which would fix that nit. > In my opinion, other solutions would require to revisit the idea of > ARM_CP_STATE_BOTH in favour of distinct definitions of the registers with > multiple views (like VBAR for AArch32 and VBAR_EL1 for AArch64). ARM_CP_STATE_BOTH is purely a shorthand to avoid having to write out two definitions when they'd be virtually the same. I don't think it adds any extra complexity that isn't already present for registers that have split definitions. In fact the split-definition registers are trickier because you end up needing all of (1) aarch64 view (2) aarch32-in-aarch64-cpu view (3) aarch32 view, which is pretty ugly. thanks -- PMM
diff --git a/target-arm/helper.c b/target-arm/helper.c index 90f85f1..7fd8dc8 100644 --- a/target-arm/helper.c +++ b/target-arm/helper.c @@ -2232,6 +2232,13 @@ static void add_cpreg_to_hashtable(ARMCPU *cpu, const ARMCPRegInfo *r, /* Private utility function for define_one_arm_cp_reg_with_opaque(): * add a single reginfo struct to the hash table. */ + int is_a64 = (&cpu->env)->aarch64; + if (r->state == ARM_CP_STATE_BOTH && state == ARM_CP_STATE_AA64 + && !is_a64) { + /* no need of the AArch64 cp definition */ + return; + } + uint32_t *key = g_new(uint32_t, 1);