* [Qemu-devel] [PATCH V3 0/2] Add virtio endianness determination in KVM ARM/ARM64
@ 2015-02-05 9:59 Pranavkumar Sawargaonkar
2015-02-05 9:59 ` [Qemu-devel] [PATCH V3 1/2] target-arm: KVM64: Get and Sync up guest register state like kvm32 Pranavkumar Sawargaonkar
2015-02-05 9:59 ` [Qemu-devel] [PATCH V3 2/2] target-arm: Guest cpu endianness determination for virtio KVM ARM/ARM64 Pranavkumar Sawargaonkar
0 siblings, 2 replies; 6+ messages in thread
From: Pranavkumar Sawargaonkar @ 2015-02-05 9:59 UTC (permalink / raw)
To: qemu-devel
Cc: peter.maydell, patches, alex.bennee, kvmarm, christoffer.dall,
Pranavkumar Sawargaonkar
In KVM ARM/ARM64 one can run cross-endian guset with respect to host kernel.
For virtio to work with this we need to make virtio code aware of
guest's endianness.
This patchset adds the guest endianness determination for KVM ARM/ARM64
and related small fix in KVM ARM64.
V2->V3:
- Renamed arm_cpu_virtio_endianness() to arm_cpu_is_big_endian()
- Added check for current exception level so that endianness
for el0 is determined by looking at sctlr EOE and for others
from sctlr EE bit.
V1->V2:
- Change the patch to be used generically for both ARM and ARM64.
- Define TARGET_IS_BIENDIAN for target-arm
- Address the review comments received in v1.
- Rebased code on top of latest qemu code.
V1:
- First patch in this series.
- http://lists.gnu.org/archive/html/qemu-devel/2014-10/msg03321.html
Pranavkumar Sawargaonkar (2):
target-arm: KVM64: Get and Sync up guest register state like kvm32.
target-arm: Guest cpu endianness determination for virtio KVM
ARM/ARM64
target-arm/cpu.c | 24 ++++++++++++++++++++++++
target-arm/cpu.h | 2 ++
target-arm/kvm64.c | 13 ++++++++++++-
3 files changed, 38 insertions(+), 1 deletion(-)
--
1.9.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH V3 1/2] target-arm: KVM64: Get and Sync up guest register state like kvm32.
2015-02-05 9:59 [Qemu-devel] [PATCH V3 0/2] Add virtio endianness determination in KVM ARM/ARM64 Pranavkumar Sawargaonkar
@ 2015-02-05 9:59 ` Pranavkumar Sawargaonkar
2015-02-05 9:59 ` [Qemu-devel] [PATCH V3 2/2] target-arm: Guest cpu endianness determination for virtio KVM ARM/ARM64 Pranavkumar Sawargaonkar
1 sibling, 0 replies; 6+ messages in thread
From: Pranavkumar Sawargaonkar @ 2015-02-05 9:59 UTC (permalink / raw)
To: qemu-devel
Cc: peter.maydell, patches, alex.bennee, kvmarm, christoffer.dall,
Pranavkumar Sawargaonkar
This patch adds:
1. Call write_kvmstate_to_list() and write_list_to_cpustate()
in kvm_arch_get_registers() to sync guest register state.
2. Call write_list_to_kvmstate() in kvm_arch_put_registers()
to sync guest register state.
These changes are already there for kvm32 in target-arm/kvm32.c.
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
---
target-arm/kvm64.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/target-arm/kvm64.c b/target-arm/kvm64.c
index ba16821..033babf 100644
--- a/target-arm/kvm64.c
+++ b/target-arm/kvm64.c
@@ -193,9 +193,12 @@ int kvm_arch_put_registers(CPUState *cs, int level)
}
}
+ if (!write_list_to_kvmstate(cpu)) {
+ return EINVAL;
+ }
+
/* TODO:
* FP state
- * system registers
*/
return ret;
}
@@ -269,6 +272,14 @@ int kvm_arch_get_registers(CPUState *cs)
}
}
+ if (!write_kvmstate_to_list(cpu)) {
+ return EINVAL;
+ }
+ /* Note that it's OK to have registers which aren't in CPUState,
+ * so we can ignore a failure return here.
+ */
+ write_list_to_cpustate(cpu);
+
/* TODO: other registers */
return ret;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH V3 2/2] target-arm: Guest cpu endianness determination for virtio KVM ARM/ARM64
2015-02-05 9:59 [Qemu-devel] [PATCH V3 0/2] Add virtio endianness determination in KVM ARM/ARM64 Pranavkumar Sawargaonkar
2015-02-05 9:59 ` [Qemu-devel] [PATCH V3 1/2] target-arm: KVM64: Get and Sync up guest register state like kvm32 Pranavkumar Sawargaonkar
@ 2015-02-05 9:59 ` Pranavkumar Sawargaonkar
2015-02-05 11:43 ` Peter Maydell
1 sibling, 1 reply; 6+ messages in thread
From: Pranavkumar Sawargaonkar @ 2015-02-05 9:59 UTC (permalink / raw)
To: qemu-devel
Cc: peter.maydell, patches, alex.bennee, kvmarm, christoffer.dall,
Pranavkumar Sawargaonkar
This patch implements a fucntion pointer "virtio_is_big_endian"
from "CPUClass" structure for arm/arm64.
Function arm_cpu_is_big_endian() is added to determine and
return the guest cpu endianness to virtio.
This is required for running cross endian guests with virtio on ARM/ARM64.
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
---
target-arm/cpu.c | 24 ++++++++++++++++++++++++
target-arm/cpu.h | 2 ++
2 files changed, 26 insertions(+)
diff --git a/target-arm/cpu.c b/target-arm/cpu.c
index 285947f..4d9cded 100644
--- a/target-arm/cpu.c
+++ b/target-arm/cpu.c
@@ -320,6 +320,29 @@ static void arm_cpu_kvm_set_irq(void *opaque, int irq, int level)
kvm_set_irq(kvm_state, kvm_irq, level ? 1 : 0);
#endif
}
+
+static bool arm_cpu_is_big_endian(CPUState *cs)
+{
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
+ int cur_el;
+
+ cpu_synchronize_state(cs);
+
+ /* In 32bit guest endianess is determined by looking at CPSR's E bit */
+ if (!is_a64(env)) {
+ return (env->pstate & CPSR_E) ? 1 : 0;
+ }
+
+ cur_el = arm_current_el(env);
+
+ if (cur_el == 0) {
+ return (env->cp15.sctlr_el[1] & SCTLR_E0E) != 0;
+ }
+
+ return (env->cp15.sctlr_el[cur_el] & SCTLR_EE) != 0;
+}
+
#endif
static inline void set_feature(CPUARMState *env, int feature)
@@ -1189,6 +1212,7 @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
cc->do_interrupt = arm_cpu_do_interrupt;
cc->get_phys_page_debug = arm_cpu_get_phys_page_debug;
cc->vmsd = &vmstate_arm_cpu;
+ cc->virtio_is_big_endian = arm_cpu_is_big_endian;
#endif
cc->gdb_num_core_regs = 26;
cc->gdb_core_xml_file = "arm-core.xml";
diff --git a/target-arm/cpu.h b/target-arm/cpu.h
index cd7a9e8..317e801 100644
--- a/target-arm/cpu.h
+++ b/target-arm/cpu.h
@@ -32,6 +32,8 @@
# define ELF_MACHINE EM_ARM
#endif
+#define TARGET_IS_BIENDIAN 1
+
#define CPUArchState struct CPUARMState
#include "qemu-common.h"
--
1.9.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH V3 2/2] target-arm: Guest cpu endianness determination for virtio KVM ARM/ARM64
2015-02-05 9:59 ` [Qemu-devel] [PATCH V3 2/2] target-arm: Guest cpu endianness determination for virtio KVM ARM/ARM64 Pranavkumar Sawargaonkar
@ 2015-02-05 11:43 ` Peter Maydell
2015-02-05 11:48 ` Peter Maydell
0 siblings, 1 reply; 6+ messages in thread
From: Peter Maydell @ 2015-02-05 11:43 UTC (permalink / raw)
To: Pranavkumar Sawargaonkar
Cc: patches@apm.com, Alex Bennée, QEMU Developers,
Christoffer Dall, kvmarm@lists.cs.columbia.edu
On 5 February 2015 at 09:59, Pranavkumar Sawargaonkar
<pranavkumar@linaro.org> wrote:
> This patch implements a fucntion pointer "virtio_is_big_endian"
> from "CPUClass" structure for arm/arm64.
> Function arm_cpu_is_big_endian() is added to determine and
> return the guest cpu endianness to virtio.
> This is required for running cross endian guests with virtio on ARM/ARM64.
>
> Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
> ---
> target-arm/cpu.c | 24 ++++++++++++++++++++++++
> target-arm/cpu.h | 2 ++
> 2 files changed, 26 insertions(+)
>
> diff --git a/target-arm/cpu.c b/target-arm/cpu.c
> index 285947f..4d9cded 100644
> --- a/target-arm/cpu.c
> +++ b/target-arm/cpu.c
> @@ -320,6 +320,29 @@ static void arm_cpu_kvm_set_irq(void *opaque, int irq, int level)
> kvm_set_irq(kvm_state, kvm_irq, level ? 1 : 0);
> #endif
> }
> +
> +static bool arm_cpu_is_big_endian(CPUState *cs)
> +{
> + ARMCPU *cpu = ARM_CPU(cs);
> + CPUARMState *env = &cpu->env;
> + int cur_el;
> +
> + cpu_synchronize_state(cs);
> +
> + /* In 32bit guest endianess is determined by looking at CPSR's E bit */
> + if (!is_a64(env)) {
> + return (env->pstate & CPSR_E) ? 1 : 0;
This is wrong, because if we're not 32-bit then the CPSR
isn't in env->pstate but in env->cpsr_uncached. (I'm guessing
you didn't test 32-bit guests.)
Since this is the only error in this patch, I'll just fix it
as I put the series into target-arm.next rather than forcing
you to respin it.
thanks
-- PMM
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH V3 2/2] target-arm: Guest cpu endianness determination for virtio KVM ARM/ARM64
2015-02-05 11:43 ` Peter Maydell
@ 2015-02-05 11:48 ` Peter Maydell
2015-02-06 16:43 ` Pranavkumar Sawargaonkar
0 siblings, 1 reply; 6+ messages in thread
From: Peter Maydell @ 2015-02-05 11:48 UTC (permalink / raw)
To: Pranavkumar Sawargaonkar
Cc: patches@apm.com, Alex Bennée, QEMU Developers,
Christoffer Dall, kvmarm@lists.cs.columbia.edu
On 5 February 2015 at 11:43, Peter Maydell <peter.maydell@linaro.org> wrote:
> On 5 February 2015 at 09:59, Pranavkumar Sawargaonkar
> <pranavkumar@linaro.org> wrote:
>> +
>> + /* In 32bit guest endianess is determined by looking at CPSR's E bit */
>> + if (!is_a64(env)) {
>> + return (env->pstate & CPSR_E) ? 1 : 0;
>
> This is wrong, because if we're not 32-bit then the CPSR
> isn't in env->pstate but in env->cpsr_uncached. (I'm guessing
> you didn't test 32-bit guests.)
Actually thinking about it your code would have worked for the
common 32-bit guest case, since if we fall through to looking
at SCTLR then (assuming the guest is at EL1 which it will be when
it's messing with the virtio device) we'll end up checking the
32-bit SCTLR EE bit, which will be the same as the current
guest endianness for any sane guest kernel. So I apologise
for suggesting you didn't test that case.
-- PMM
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH V3 2/2] target-arm: Guest cpu endianness determination for virtio KVM ARM/ARM64
2015-02-05 11:48 ` Peter Maydell
@ 2015-02-06 16:43 ` Pranavkumar Sawargaonkar
0 siblings, 0 replies; 6+ messages in thread
From: Pranavkumar Sawargaonkar @ 2015-02-06 16:43 UTC (permalink / raw)
To: Peter Maydell
Cc: patches@apm.com, Alex Bennée, QEMU Developers,
Christoffer Dall, kvmarm@lists.cs.columbia.edu
Hi PMM,
On 5 February 2015 at 17:18, Peter Maydell <peter.maydell@linaro.org> wrote:
> On 5 February 2015 at 11:43, Peter Maydell <peter.maydell@linaro.org> wrote:
>> On 5 February 2015 at 09:59, Pranavkumar Sawargaonkar
>> <pranavkumar@linaro.org> wrote:
>>> +
>>> + /* In 32bit guest endianess is determined by looking at CPSR's E bit */
>>> + if (!is_a64(env)) {
>>> + return (env->pstate & CPSR_E) ? 1 : 0;
>>
>> This is wrong, because if we're not 32-bit then the CPSR
>> isn't in env->pstate but in env->cpsr_uncached. (I'm guessing
>> you didn't test 32-bit guests.)
>
> Actually thinking about it your code would have worked for the
> common 32-bit guest case, since if we fall through to looking
> at SCTLR then (assuming the guest is at EL1 which it will be when
> it's messing with the virtio device) we'll end up checking the
> 32-bit SCTLR EE bit, which will be the same as the current
> guest endianness for any sane guest kernel. So I apologise
> for suggesting you didn't test that case.
Actually I have not not tested patch with 32bit guests.
Thanks for pulling the patches and 32bit guest case fix.
Thanks,
Pranav
>
> -- PMM
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-02-06 16:43 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-05 9:59 [Qemu-devel] [PATCH V3 0/2] Add virtio endianness determination in KVM ARM/ARM64 Pranavkumar Sawargaonkar
2015-02-05 9:59 ` [Qemu-devel] [PATCH V3 1/2] target-arm: KVM64: Get and Sync up guest register state like kvm32 Pranavkumar Sawargaonkar
2015-02-05 9:59 ` [Qemu-devel] [PATCH V3 2/2] target-arm: Guest cpu endianness determination for virtio KVM ARM/ARM64 Pranavkumar Sawargaonkar
2015-02-05 11:43 ` Peter Maydell
2015-02-05 11:48 ` Peter Maydell
2015-02-06 16:43 ` Pranavkumar Sawargaonkar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).