* [Qemu-devel] [PATCH v5 0/3] spapr: fix H_SET_MODE
@ 2014-03-20 0:03 Alexey Kardashevskiy
2014-03-20 0:03 ` [Qemu-devel] [PATCH v5 1/3] target-ppc: introduce powerisa-207-server flag Alexey Kardashevskiy
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Alexey Kardashevskiy @ 2014-03-20 0:03 UTC (permalink / raw)
To: qemu-devel
Cc: Alexey Kardashevskiy, qemu-ppc, Alexander Graf, Andreas Färber
This fixes H_SET_MODE.
Changes:
v5:
* fixed code style
v4:
* rebased on top of current ppc-next.
* changed PPC2_ISA207S flag value
Alexey Kardashevskiy (3):
target-ppc: introduce powerisa-207-server flag
spapr_hcall: fix little-endian resource handling in H_SET_MODE
spapr_hcall: add address-translation-mode-on-interrupt resource in
H_SET_MODE
hw/ppc/spapr_hcall.c | 67 +++++++++++++++++++++++++++++++++++++++------
include/hw/ppc/spapr.h | 9 ++++--
target-ppc/cpu.h | 4 +++
target-ppc/translate_init.c | 3 +-
4 files changed, 72 insertions(+), 11 deletions(-)
--
1.8.4.rc4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v5 1/3] target-ppc: introduce powerisa-207-server flag
2014-03-20 0:03 [Qemu-devel] [PATCH v5 0/3] spapr: fix H_SET_MODE Alexey Kardashevskiy
@ 2014-03-20 0:03 ` Alexey Kardashevskiy
2014-03-20 0:03 ` [Qemu-devel] [PATCH v5 2/3] spapr_hcall: fix little-endian resource handling in H_SET_MODE Alexey Kardashevskiy
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Alexey Kardashevskiy @ 2014-03-20 0:03 UTC (permalink / raw)
To: qemu-devel
Cc: Alexey Kardashevskiy, qemu-ppc, Alexander Graf, Andreas Färber
This flag will be used to decide whether to emulate some bits of
H_SET_MODE hypercall because some are POWER8-only.
While we are here, add 2.05 flag to POWER8 family too. POWER7/7+ already
have it.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
target-ppc/cpu.h | 2 ++
target-ppc/translate_init.c | 3 ++-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
index 91b7ae5..72cb546 100644
--- a/target-ppc/cpu.h
+++ b/target-ppc/cpu.h
@@ -1900,6 +1900,8 @@ enum {
PPC2_LSQ_ISA207 = 0x0000000000002000ULL,
/* ISA 2.07 Altivec */
PPC2_ALTIVEC_207 = 0x0000000000004000ULL,
+ /* PowerISA 2.07 Book3s specification */
+ PPC2_ISA207S = 0x0000000000008000ULL,
#define PPC_TCG_INSNS2 (PPC2_BOOKE206 | PPC2_VSX | PPC2_PRCNTL | PPC2_DBRX | \
PPC2_ISA205 | PPC2_VSX207 | PPC2_PERM_ISA206 | \
diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
index 6084f40..6d01c9d 100644
--- a/target-ppc/translate_init.c
+++ b/target-ppc/translate_init.c
@@ -7173,7 +7173,8 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
- PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207;
+ PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
+ PPC2_ISA205 | PPC2_ISA207S;
pcc->msr_mask = 0x800000000284FF36ULL;
pcc->mmu_model = POWERPC_MMU_2_06;
#if defined(CONFIG_SOFTMMU)
--
1.8.4.rc4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v5 2/3] spapr_hcall: fix little-endian resource handling in H_SET_MODE
2014-03-20 0:03 [Qemu-devel] [PATCH v5 0/3] spapr: fix H_SET_MODE Alexey Kardashevskiy
2014-03-20 0:03 ` [Qemu-devel] [PATCH v5 1/3] target-ppc: introduce powerisa-207-server flag Alexey Kardashevskiy
@ 2014-03-20 0:03 ` Alexey Kardashevskiy
2014-03-20 0:03 ` [Qemu-devel] [PATCH v5 3/3] spapr_hcall: add address-translation-mode-on-interrupt resource " Alexey Kardashevskiy
2014-03-20 0:21 ` [Qemu-devel] [PATCH v5 0/3] spapr: fix H_SET_MODE Andreas Färber
3 siblings, 0 replies; 6+ messages in thread
From: Alexey Kardashevskiy @ 2014-03-20 0:03 UTC (permalink / raw)
To: qemu-devel
Cc: Alexey Kardashevskiy, qemu-ppc, Alexander Graf, Andreas Färber
This changes resource code definitions to ones used in the host kernel.
This fixes H_SET_MODE_RESOURCE_LE (switch between big endian and
little endian) to sync registers from KVM before changing LPCR value.
This adds a set_spr() helper to update an SPR in a CPU's context to avoid
possible races and makes use of it to change LPCR.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
Changes:
v5:
* fixed code design style
---
hw/ppc/spapr_hcall.c | 41 +++++++++++++++++++++++++++++++++--------
include/hw/ppc/spapr.h | 9 +++++++--
2 files changed, 40 insertions(+), 10 deletions(-)
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index e999bba..fc5211b 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -4,6 +4,36 @@
#include "hw/ppc/spapr.h"
#include "mmu-hash64.h"
+struct SPRSyncState {
+ CPUState *cs;
+ int spr;
+ target_ulong value;
+ target_ulong mask;
+};
+
+static void do_spr_sync(void *arg)
+{
+ struct SPRSyncState *s = arg;
+ PowerPCCPU *cpu = POWERPC_CPU(s->cs);
+ CPUPPCState *env = &cpu->env;
+
+ cpu_synchronize_state(s->cs);
+ env->spr[s->spr] &= ~s->mask;
+ env->spr[s->spr] |= s->value;
+}
+
+static void set_spr(CPUState *cs, int spr, target_ulong value,
+ target_ulong mask)
+{
+ struct SPRSyncState s = {
+ .cs = cs,
+ .spr = spr,
+ .value = value,
+ .mask = mask
+ };
+ run_on_cpu(cs, do_spr_sync, &s);
+}
+
static target_ulong compute_tlbie_rb(target_ulong v, target_ulong r,
target_ulong pte_index)
{
@@ -690,7 +720,7 @@ static target_ulong h_set_mode(PowerPCCPU *cpu, sPAPREnvironment *spapr,
target_ulong value2 = args[3];
target_ulong ret = H_P2;
- if (resource == H_SET_MODE_ENDIAN) {
+ if (resource == H_SET_MODE_RESOURCE_LE) {
if (value1) {
ret = H_P3;
goto out;
@@ -699,22 +729,17 @@ static target_ulong h_set_mode(PowerPCCPU *cpu, sPAPREnvironment *spapr,
ret = H_P4;
goto out;
}
-
switch (mflags) {
case H_SET_MODE_ENDIAN_BIG:
CPU_FOREACH(cs) {
- PowerPCCPU *cp = POWERPC_CPU(cs);
- CPUPPCState *env = &cp->env;
- env->spr[SPR_LPCR] &= ~LPCR_ILE;
+ set_spr(cs, SPR_LPCR, 0, LPCR_ILE);
}
ret = H_SUCCESS;
break;
case H_SET_MODE_ENDIAN_LITTLE:
CPU_FOREACH(cs) {
- PowerPCCPU *cp = POWERPC_CPU(cs);
- CPUPPCState *env = &cp->env;
- env->spr[SPR_LPCR] |= LPCR_ILE;
+ set_spr(cs, SPR_LPCR, LPCR_ILE, LPCR_ILE);
}
ret = H_SUCCESS;
break;
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 449fc7c..5fdac1e 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -153,8 +153,13 @@ typedef struct sPAPREnvironment {
#define H_PP1 (1ULL<<(63-62))
#define H_PP2 (1ULL<<(63-63))
-/* H_SET_MODE flags */
-#define H_SET_MODE_ENDIAN 4
+/* Values for 2nd argument to H_SET_MODE */
+#define H_SET_MODE_RESOURCE_SET_CIABR 1
+#define H_SET_MODE_RESOURCE_SET_DAWR 2
+#define H_SET_MODE_RESOURCE_ADDR_TRANS_MODE 3
+#define H_SET_MODE_RESOURCE_LE 4
+
+/* Flags for H_SET_MODE_RESOURCE_LE */
#define H_SET_MODE_ENDIAN_BIG 0
#define H_SET_MODE_ENDIAN_LITTLE 1
--
1.8.4.rc4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v5 3/3] spapr_hcall: add address-translation-mode-on-interrupt resource in H_SET_MODE
2014-03-20 0:03 [Qemu-devel] [PATCH v5 0/3] spapr: fix H_SET_MODE Alexey Kardashevskiy
2014-03-20 0:03 ` [Qemu-devel] [PATCH v5 1/3] target-ppc: introduce powerisa-207-server flag Alexey Kardashevskiy
2014-03-20 0:03 ` [Qemu-devel] [PATCH v5 2/3] spapr_hcall: fix little-endian resource handling in H_SET_MODE Alexey Kardashevskiy
@ 2014-03-20 0:03 ` Alexey Kardashevskiy
2014-03-20 13:15 ` Mike Day
2014-03-20 0:21 ` [Qemu-devel] [PATCH v5 0/3] spapr: fix H_SET_MODE Andreas Färber
3 siblings, 1 reply; 6+ messages in thread
From: Alexey Kardashevskiy @ 2014-03-20 0:03 UTC (permalink / raw)
To: qemu-devel
Cc: Alexey Kardashevskiy, qemu-ppc, Alexander Graf, Andreas Färber
This adds handling of the RESOURCE_ADDR_TRANS_MODE resource from
the H_SET_MODE, for POWER8 (PowerISA 2.07) only.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
hw/ppc/spapr_hcall.c | 26 ++++++++++++++++++++++++++
target-ppc/cpu.h | 2 ++
2 files changed, 28 insertions(+)
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index fc5211b..fb23730 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -747,6 +747,32 @@ static target_ulong h_set_mode(PowerPCCPU *cpu, sPAPREnvironment *spapr,
default:
ret = H_UNSUPPORTED_FLAG;
}
+ } else if (resource == H_SET_MODE_RESOURCE_ADDR_TRANS_MODE) {
+ PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+
+ if (!(pcc->insns_flags2 & PPC2_ISA207S)) {
+ return H_P2;
+ }
+ if (value1) {
+ ret = H_P3;
+ goto out;
+ }
+ if (value2) {
+ ret = H_P4;
+ goto out;
+ }
+ switch (mflags) {
+ case 0:
+ case 2:
+ case 3:
+ CPU_FOREACH(cs) {
+ set_spr(cs, SPR_LPCR, mflags << LPCR_AIL_SH, LPCR_AIL);
+ }
+ return H_SUCCESS;
+
+ default:
+ return H_UNSUPPORTED_FLAG;
+ }
}
out:
diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
index 72cb546..577193a 100644
--- a/target-ppc/cpu.h
+++ b/target-ppc/cpu.h
@@ -462,6 +462,8 @@ struct ppc_slb_t {
#define MSR_LE 0 /* Little-endian mode 1 hflags */
#define LPCR_ILE (1 << (63-38))
+#define LPCR_AIL 0x01800000 /* Alternate interrupt location */
+#define LPCR_AIL_SH (63-40)
#define msr_sf ((env->msr >> MSR_SF) & 1)
#define msr_isf ((env->msr >> MSR_ISF) & 1)
--
1.8.4.rc4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v5 0/3] spapr: fix H_SET_MODE
2014-03-20 0:03 [Qemu-devel] [PATCH v5 0/3] spapr: fix H_SET_MODE Alexey Kardashevskiy
` (2 preceding siblings ...)
2014-03-20 0:03 ` [Qemu-devel] [PATCH v5 3/3] spapr_hcall: add address-translation-mode-on-interrupt resource " Alexey Kardashevskiy
@ 2014-03-20 0:21 ` Andreas Färber
3 siblings, 0 replies; 6+ messages in thread
From: Andreas Färber @ 2014-03-20 0:21 UTC (permalink / raw)
To: Alexey Kardashevskiy, qemu-devel; +Cc: qemu-ppc, Alexander Graf, Greg Kurz
Am 20.03.2014 01:03, schrieb Alexey Kardashevskiy:
> This fixes H_SET_MODE.
> Changes:
> v5:
> * fixed code style
>
> v4:
> * rebased on top of current ppc-next.
> * changed PPC2_ISA207S flag value
>
>
> Alexey Kardashevskiy (3):
> target-ppc: introduce powerisa-207-server flag
> spapr_hcall: fix little-endian resource handling in H_SET_MODE
Thanks, applied these two to my ppc-next:
https://github.com/afaerber/qemu-cpu/commits/ppc-next
> spapr_hcall: add address-translation-mode-on-interrupt resource in
> H_SET_MODE
This doesn't strike me as a bug fix worthy of -rc1? Does anything
severely break without it that would justify putting it in -rc2?
Also some additional reviewer would assure me there's been no oversight.
Regards,
Andreas
> hw/ppc/spapr_hcall.c | 67 +++++++++++++++++++++++++++++++++++++++------
> include/hw/ppc/spapr.h | 9 ++++--
> target-ppc/cpu.h | 4 +++
> target-ppc/translate_init.c | 3 +-
> 4 files changed, 72 insertions(+), 11 deletions(-)
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v5 3/3] spapr_hcall: add address-translation-mode-on-interrupt resource in H_SET_MODE
2014-03-20 0:03 ` [Qemu-devel] [PATCH v5 3/3] spapr_hcall: add address-translation-mode-on-interrupt resource " Alexey Kardashevskiy
@ 2014-03-20 13:15 ` Mike Day
0 siblings, 0 replies; 6+ messages in thread
From: Mike Day @ 2014-03-20 13:15 UTC (permalink / raw)
To: Alexey Kardashevskiy, qemu-devel
Cc: qemu-ppc, Alexander Graf, Andreas Färber
Alexey Kardashevskiy <aik@ozlabs.ru> writes:
> This adds handling of the RESOURCE_ADDR_TRANS_MODE resource from
> the H_SET_MODE, for POWER8 (PowerISA 2.07) only.
>
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: Mike Day <ncmike@ncultra.org>
> ---
> hw/ppc/spapr_hcall.c | 26 ++++++++++++++++++++++++++
> target-ppc/cpu.h | 2 ++
> 2 files changed, 28 insertions(+)
>
> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> index fc5211b..fb23730 100644
> --- a/hw/ppc/spapr_hcall.c
> +++ b/hw/ppc/spapr_hcall.c
> @@ -747,6 +747,32 @@ static target_ulong h_set_mode(PowerPCCPU *cpu, sPAPREnvironment *spapr,
> default:
> ret = H_UNSUPPORTED_FLAG;
> }
> + } else if (resource == H_SET_MODE_RESOURCE_ADDR_TRANS_MODE) {
> + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
> +
> + if (!(pcc->insns_flags2 & PPC2_ISA207S)) {
> + return H_P2;
ret = H_P2;
goto out;
Just a nit to make for easier review. The above would be more
consistent. (Even though ret is already initialized to H_P2.)
> + }
> + if (value1) {
> + ret = H_P3;
> + goto out;
> + }
> + if (value2) {
> + ret = H_P4;
> + goto out;
> + }
> + switch (mflags) {
> + case 0:
> + case 2:
> + case 3:
> + CPU_FOREACH(cs) {
> + set_spr(cs, SPR_LPCR, mflags << LPCR_AIL_SH, LPCR_AIL);
> + }
> + return H_SUCCESS;
> +
> + default:
> + return H_UNSUPPORTED_FLAG;
> + }
> }
>
> out:
> diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
> index 72cb546..577193a 100644
> --- a/target-ppc/cpu.h
> +++ b/target-ppc/cpu.h
> @@ -462,6 +462,8 @@ struct ppc_slb_t {
> #define MSR_LE 0 /* Little-endian mode 1 hflags */
>
> #define LPCR_ILE (1 << (63-38))
> +#define LPCR_AIL 0x01800000 /* Alternate interrupt location */
> +#define LPCR_AIL_SH (63-40)
>
> #define msr_sf ((env->msr >> MSR_SF) & 1)
> #define msr_isf ((env->msr >> MSR_ISF) & 1)
> --
> 1.8.4.rc4
>
>
--
Mike Day | "Endurance is a Virtue"
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-03-20 13:15 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-20 0:03 [Qemu-devel] [PATCH v5 0/3] spapr: fix H_SET_MODE Alexey Kardashevskiy
2014-03-20 0:03 ` [Qemu-devel] [PATCH v5 1/3] target-ppc: introduce powerisa-207-server flag Alexey Kardashevskiy
2014-03-20 0:03 ` [Qemu-devel] [PATCH v5 2/3] spapr_hcall: fix little-endian resource handling in H_SET_MODE Alexey Kardashevskiy
2014-03-20 0:03 ` [Qemu-devel] [PATCH v5 3/3] spapr_hcall: add address-translation-mode-on-interrupt resource " Alexey Kardashevskiy
2014-03-20 13:15 ` Mike Day
2014-03-20 0:21 ` [Qemu-devel] [PATCH v5 0/3] spapr: fix H_SET_MODE Andreas Färber
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.