public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PULL 0/8] ppc patch queue 2013-01-10
@ 2013-01-10 12:45 Alexander Graf
  2013-01-10 12:45 ` [PATCH 1/8] KVM: PPC: Fix SREGS documentation reference Alexander Graf
                   ` (8 more replies)
  0 siblings, 9 replies; 12+ messages in thread
From: Alexander Graf @ 2013-01-10 12:45 UTC (permalink / raw)
  To: kvm-ppc; +Cc: KVM list

Hi Marcelo / Gleb,

This is my current patch queue for ppc.  Please pull.

Highlights this time:

  - Book3S: enable potential sPAPR guest emulation on PR KVM on pHyp
  - BookE: EPR (External Proxy Register) support

Alex

The following changes since commit 908e7d7999bcce70ac52e7f390a8f5cbc55948de:
  Gleb Natapov (1):
        KVM: MMU: simplify folding of dirty bit into accessed_dirty

are available in the git repository at:

  git://github.com/agraf/linux-2.6.git kvm-ppc-next

Alexander Graf (6):
      KVM: PPC: Only WARN on invalid emulation
      KVM: PPC: Book3S: PR: Enable alternative instruction for SC 1
      KVM: PPC: BookE: Allow irq deliveries to inject requests
      KVM: PPC: BookE: Emulate mfspr on EPR
      KVM: PPC: BookE: Implement EPR exit
      KVM: PPC: BookE: Add EPR ONE_REG sync

Mihai Caraman (2):
      KVM: PPC: Fix SREGS documentation reference
      KVM: PPC: Fix mfspr/mtspr MMUCFG emulation

 Documentation/virtual/kvm/api.txt   |   43 ++++++++++++++++++++++++++++++++--
 arch/powerpc/include/asm/kvm_host.h |    2 +
 arch/powerpc/include/asm/kvm_ppc.h  |   10 ++++++++
 arch/powerpc/include/uapi/asm/kvm.h |    6 ++++-
 arch/powerpc/kvm/book3s_emulate.c   |   30 ++++++++++++++++++++++++
 arch/powerpc/kvm/book3s_pr.c        |    5 ++++
 arch/powerpc/kvm/booke.c            |   40 +++++++++++++++++++++++++++++++-
 arch/powerpc/kvm/booke_emulate.c    |    3 ++
 arch/powerpc/kvm/emulate.c          |    5 ----
 arch/powerpc/kvm/powerpc.c          |   13 +++++++++-
 include/linux/kvm_host.h            |    1 +
 include/uapi/linux/kvm.h            |    6 +++++
 12 files changed, 153 insertions(+), 11 deletions(-)

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/8] KVM: PPC: Fix SREGS documentation reference
  2013-01-10 12:45 [PULL 0/8] ppc patch queue 2013-01-10 Alexander Graf
@ 2013-01-10 12:45 ` Alexander Graf
  2013-01-10 12:45 ` [PATCH 2/8] KVM: PPC: Only WARN on invalid emulation Alexander Graf
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Alexander Graf @ 2013-01-10 12:45 UTC (permalink / raw)
  To: kvm-ppc; +Cc: KVM list, Mihai Caraman

From: Mihai Caraman <mihai.caraman@freescale.com>

Reflect the uapi folder change in SREGS API documentation.

Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com>
Reviewed-by: Amos Kong <kongjianjun@gmail.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
---
 Documentation/virtual/kvm/api.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index f2d6391..4fc2bfc 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -345,7 +345,7 @@ struct kvm_sregs {
 	__u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];
 };
 
-/* ppc -- see arch/powerpc/include/asm/kvm.h */
+/* ppc -- see arch/powerpc/include/uapi/asm/kvm.h */
 
 interrupt_bitmap is a bitmap of pending external interrupts.  At most
 one bit may be set.  This interrupt has been acknowledged by the APIC
-- 
1.6.0.2


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/8] KVM: PPC: Only WARN on invalid emulation
  2013-01-10 12:45 [PULL 0/8] ppc patch queue 2013-01-10 Alexander Graf
  2013-01-10 12:45 ` [PATCH 1/8] KVM: PPC: Fix SREGS documentation reference Alexander Graf
@ 2013-01-10 12:45 ` Alexander Graf
  2013-01-10 12:45 ` [PATCH 3/8] KVM: PPC: Book3S: PR: Enable alternative instruction for SC 1 Alexander Graf
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Alexander Graf @ 2013-01-10 12:45 UTC (permalink / raw)
  To: kvm-ppc; +Cc: KVM list

When we hit an emulation result that we didn't expect, that is an error,
but it's nothing that warrants a BUG(), because it can be guest triggered.

So instead, let's only WARN() the user that this happened.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 arch/powerpc/kvm/powerpc.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index be83fca..e2225e5 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -237,7 +237,8 @@ int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu)
 		r = RESUME_HOST;
 		break;
 	default:
-		BUG();
+		WARN_ON(1);
+		r = RESUME_GUEST;
 	}
 
 	return r;
-- 
1.6.0.2


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/8] KVM: PPC: Book3S: PR: Enable alternative instruction for SC 1
  2013-01-10 12:45 [PULL 0/8] ppc patch queue 2013-01-10 Alexander Graf
  2013-01-10 12:45 ` [PATCH 1/8] KVM: PPC: Fix SREGS documentation reference Alexander Graf
  2013-01-10 12:45 ` [PATCH 2/8] KVM: PPC: Only WARN on invalid emulation Alexander Graf
@ 2013-01-10 12:45 ` Alexander Graf
  2013-01-10 12:45 ` [PATCH 4/8] KVM: PPC: Fix mfspr/mtspr MMUCFG emulation Alexander Graf
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Alexander Graf @ 2013-01-10 12:45 UTC (permalink / raw)
  To: kvm-ppc; +Cc: KVM list

When running on top of pHyp, the hypercall instruction "sc 1" goes
straight into pHyp without trapping in supervisor mode.

So if we want to support PAPR guest in this configuration we need to
add a second way of accessing PAPR hypercalls, preferably with the
exact same semantics except for the instruction.

So let's overlay an officially reserved instruction and emulate PAPR
hypercalls whenever we hit that one.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 arch/powerpc/include/asm/kvm_ppc.h |    1 +
 arch/powerpc/kvm/book3s_emulate.c  |   28 ++++++++++++++++++++++++++++
 arch/powerpc/kvm/book3s_pr.c       |    5 +++++
 3 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index 572aa75..5f5f69a 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -44,6 +44,7 @@ enum emulation_result {
 	EMULATE_DO_DCR,       /* kvm_run filled with DCR request */
 	EMULATE_FAIL,         /* can't emulate this instruction */
 	EMULATE_AGAIN,        /* something went wrong. go again */
+	EMULATE_DO_PAPR,      /* kvm_run filled with PAPR request */
 };
 
 extern int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu);
diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c
index d31a716..c88161b 100644
--- a/arch/powerpc/kvm/book3s_emulate.c
+++ b/arch/powerpc/kvm/book3s_emulate.c
@@ -34,6 +34,8 @@
 #define OP_31_XOP_MTSRIN	242
 #define OP_31_XOP_TLBIEL	274
 #define OP_31_XOP_TLBIE		306
+/* Opcode is officially reserved, reuse it as sc 1 when sc 1 doesn't trap */
+#define OP_31_XOP_FAKE_SC1	308
 #define OP_31_XOP_SLBMTE	402
 #define OP_31_XOP_SLBIE		434
 #define OP_31_XOP_SLBIA		498
@@ -170,6 +172,32 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
 			vcpu->arch.mmu.tlbie(vcpu, addr, large);
 			break;
 		}
+#ifdef CONFIG_KVM_BOOK3S_64_PR
+		case OP_31_XOP_FAKE_SC1:
+		{
+			/* SC 1 papr hypercalls */
+			ulong cmd = kvmppc_get_gpr(vcpu, 3);
+			int i;
+
+		        if ((vcpu->arch.shared->msr & MSR_PR) ||
+			    !vcpu->arch.papr_enabled) {
+				emulated = EMULATE_FAIL;
+				break;
+			}
+
+			if (kvmppc_h_pr(vcpu, cmd) == EMULATE_DONE)
+				break;
+
+			run->papr_hcall.nr = cmd;
+			for (i = 0; i < 9; ++i) {
+				ulong gpr = kvmppc_get_gpr(vcpu, 4 + i);
+				run->papr_hcall.args[i] = gpr;
+			}
+
+			emulated = EMULATE_DO_PAPR;
+			break;
+		}
+#endif
 		case OP_31_XOP_EIOIO:
 			break;
 		case OP_31_XOP_SLBMTE:
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
index 28d38ad..73ed11c 100644
--- a/arch/powerpc/kvm/book3s_pr.c
+++ b/arch/powerpc/kvm/book3s_pr.c
@@ -760,6 +760,11 @@ program_interrupt:
 			run->exit_reason = KVM_EXIT_MMIO;
 			r = RESUME_HOST_NV;
 			break;
+		case EMULATE_DO_PAPR:
+			run->exit_reason = KVM_EXIT_PAPR_HCALL;
+			vcpu->arch.hcall_needed = 1;
+			r = RESUME_HOST_NV;
+			break;
 		default:
 			BUG();
 		}
-- 
1.6.0.2


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/8] KVM: PPC: Fix mfspr/mtspr MMUCFG emulation
  2013-01-10 12:45 [PULL 0/8] ppc patch queue 2013-01-10 Alexander Graf
                   ` (2 preceding siblings ...)
  2013-01-10 12:45 ` [PATCH 3/8] KVM: PPC: Book3S: PR: Enable alternative instruction for SC 1 Alexander Graf
@ 2013-01-10 12:45 ` Alexander Graf
  2013-01-10 12:45 ` [PATCH 5/8] KVM: PPC: BookE: Allow irq deliveries to inject requests Alexander Graf
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Alexander Graf @ 2013-01-10 12:45 UTC (permalink / raw)
  To: kvm-ppc; +Cc: KVM list, Mihai Caraman

From: Mihai Caraman <mihai.caraman@freescale.com>

On mfspr/mtspr emulation path Book3E's MMUCFG SPR with value 1015 clashes
with G4's MSSSR0 SPR. Move MSSSR0 emulation from generic part to Books3S.
MSSSR0 also clashes with Book3S's DABRX SPR. DABRX was not explicitly
handled so Book3S execution flow will behave as before.

Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
---
 arch/powerpc/kvm/book3s_emulate.c |    2 ++
 arch/powerpc/kvm/emulate.c        |    5 -----
 2 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c
index c88161b..836c569 100644
--- a/arch/powerpc/kvm/book3s_emulate.c
+++ b/arch/powerpc/kvm/book3s_emulate.c
@@ -455,6 +455,7 @@ int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
 	case SPRN_PMC3_GEKKO:
 	case SPRN_PMC4_GEKKO:
 	case SPRN_WPAR_GEKKO:
+	case SPRN_MSSSR0:
 		break;
 unprivileged:
 	default:
@@ -551,6 +552,7 @@ int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
 	case SPRN_PMC3_GEKKO:
 	case SPRN_PMC4_GEKKO:
 	case SPRN_WPAR_GEKKO:
+	case SPRN_MSSSR0:
 		*spr_val = 0;
 		break;
 	default:
diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
index b0855e5..71abcf4 100644
--- a/arch/powerpc/kvm/emulate.c
+++ b/arch/powerpc/kvm/emulate.c
@@ -149,8 +149,6 @@ static int kvmppc_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs)
 	case SPRN_TBWL: break;
 	case SPRN_TBWU: break;
 
-	case SPRN_MSSSR0: break;
-
 	case SPRN_DEC:
 		vcpu->arch.dec = spr_val;
 		kvmppc_emulate_dec(vcpu);
@@ -201,9 +199,6 @@ static int kvmppc_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt)
 	case SPRN_PIR:
 		spr_val = vcpu->vcpu_id;
 		break;
-	case SPRN_MSSSR0:
-		spr_val = 0;
-		break;
 
 	/* Note: mftb and TBRL/TBWL are user-accessible, so
 	 * the guest can always access the real TB anyways.
-- 
1.6.0.2


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/8] KVM: PPC: BookE: Allow irq deliveries to inject requests
  2013-01-10 12:45 [PULL 0/8] ppc patch queue 2013-01-10 Alexander Graf
                   ` (3 preceding siblings ...)
  2013-01-10 12:45 ` [PATCH 4/8] KVM: PPC: Fix mfspr/mtspr MMUCFG emulation Alexander Graf
@ 2013-01-10 12:45 ` Alexander Graf
  2013-01-10 12:45 ` [PATCH 6/8] KVM: PPC: BookE: Emulate mfspr on EPR Alexander Graf
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Alexander Graf @ 2013-01-10 12:45 UTC (permalink / raw)
  To: kvm-ppc; +Cc: KVM list

When injecting an interrupt into guest context, we usually don't need
to check for requests anymore. At least not until today.

With the introduction of EPR, we will have to create a request when the
guest has successfully accepted an external interrupt though.

So we need to prepare the interrupt delivery to abort guest entry
gracefully. Otherwise we'd delay the EPR request.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 arch/powerpc/kvm/booke.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 69f1140..964f447 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -581,6 +581,11 @@ int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu)
 
 	kvmppc_core_check_exceptions(vcpu);
 
+	if (vcpu->requests) {
+		/* Exception delivery raised request; start over */
+		return 1;
+	}
+
 	if (vcpu->arch.shared->msr & MSR_WE) {
 		local_irq_enable();
 		kvm_vcpu_block(vcpu);
-- 
1.6.0.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 6/8] KVM: PPC: BookE: Emulate mfspr on EPR
  2013-01-10 12:45 [PULL 0/8] ppc patch queue 2013-01-10 Alexander Graf
                   ` (4 preceding siblings ...)
  2013-01-10 12:45 ` [PATCH 5/8] KVM: PPC: BookE: Allow irq deliveries to inject requests Alexander Graf
@ 2013-01-10 12:45 ` Alexander Graf
  2013-01-10 12:45 ` [PATCH 7/8] KVM: PPC: BookE: Implement EPR exit Alexander Graf
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Alexander Graf @ 2013-01-10 12:45 UTC (permalink / raw)
  To: kvm-ppc; +Cc: KVM list

The EPR register is potentially valid for PR KVM as well, so we need
to emulate accesses to it. It's only defined for reading, so only
handle the mfspr case.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 arch/powerpc/kvm/booke_emulate.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/kvm/booke_emulate.c b/arch/powerpc/kvm/booke_emulate.c
index 4685b8c..27a4b28 100644
--- a/arch/powerpc/kvm/booke_emulate.c
+++ b/arch/powerpc/kvm/booke_emulate.c
@@ -269,6 +269,9 @@ int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
 	case SPRN_ESR:
 		*spr_val = vcpu->arch.shared->esr;
 		break;
+	case SPRN_EPR:
+		*spr_val = vcpu->arch.epr;
+		break;
 	case SPRN_CSRR0:
 		*spr_val = vcpu->arch.csrr0;
 		break;
-- 
1.6.0.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 7/8] KVM: PPC: BookE: Implement EPR exit
  2013-01-10 12:45 [PULL 0/8] ppc patch queue 2013-01-10 Alexander Graf
                   ` (5 preceding siblings ...)
  2013-01-10 12:45 ` [PATCH 6/8] KVM: PPC: BookE: Emulate mfspr on EPR Alexander Graf
@ 2013-01-10 12:45 ` Alexander Graf
  2013-01-10 12:45 ` [PATCH 8/8] KVM: PPC: BookE: Add EPR ONE_REG sync Alexander Graf
  2013-01-14  9:03 ` [PULL 0/8] ppc patch queue 2013-01-10 Gleb Natapov
  8 siblings, 0 replies; 12+ messages in thread
From: Alexander Graf @ 2013-01-10 12:45 UTC (permalink / raw)
  To: kvm-ppc; +Cc: KVM list

The External Proxy Facility in FSL BookE chips allows the interrupt
controller to automatically acknowledge an interrupt as soon as a
core gets its pending external interrupt delivered.

Today, user space implements the interrupt controller, so we need to
check on it during such a cycle.

This patch implements logic for user space to enable EPR exiting,
disable EPR exiting and EPR exiting itself, so that user space can
acknowledge an interrupt when an external interrupt has successfully
been delivered into the guest vcpu.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 Documentation/virtual/kvm/api.txt   |   40 +++++++++++++++++++++++++++++++++-
 arch/powerpc/include/asm/kvm_host.h |    2 +
 arch/powerpc/include/asm/kvm_ppc.h  |    9 +++++++
 arch/powerpc/kvm/booke.c            |   14 +++++++++++-
 arch/powerpc/kvm/powerpc.c          |   10 ++++++++
 include/linux/kvm_host.h            |    1 +
 include/uapi/linux/kvm.h            |    6 +++++
 7 files changed, 79 insertions(+), 3 deletions(-)

diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index 4fc2bfc..a98ed09 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -2246,8 +2246,8 @@ executed a memory-mapped I/O instruction which could not be satisfied
 by kvm.  The 'data' member contains the written data if 'is_write' is
 true, and should be filled by application code otherwise.
 
-NOTE: For KVM_EXIT_IO, KVM_EXIT_MMIO, KVM_EXIT_OSI, KVM_EXIT_DCR
-      and KVM_EXIT_PAPR the corresponding
+NOTE: For KVM_EXIT_IO, KVM_EXIT_MMIO, KVM_EXIT_OSI, KVM_EXIT_DCR,
+      KVM_EXIT_PAPR and KVM_EXIT_EPR the corresponding
 operations are complete (and guest state is consistent) only after userspace
 has re-entered the kernel with KVM_RUN.  The kernel side will first finish
 incomplete operations and then check for pending signals.  Userspace
@@ -2366,6 +2366,25 @@ interrupt for the target subchannel has been dequeued and subchannel_id,
 subchannel_nr, io_int_parm and io_int_word contain the parameters for that
 interrupt. ipb is needed for instruction parameter decoding.
 
+		/* KVM_EXIT_EPR */
+		struct {
+			__u32 epr;
+		} epr;
+
+On FSL BookE PowerPC chips, the interrupt controller has a fast patch
+interrupt acknowledge path to the core. When the core successfully
+delivers an interrupt, it automatically populates the EPR register with
+the interrupt vector number and acknowledges the interrupt inside
+the interrupt controller.
+
+In case the interrupt controller lives in user space, we need to do
+the interrupt acknowledge cycle through it to fetch the next to be
+delivered interrupt vector using this exit.
+
+It gets triggered whenever both KVM_CAP_PPC_EPR are enabled and an
+external interrupt has just been delivered into the guest. User space
+should put the acknowledged interrupt vector into the 'epr' field.
+
 		/* Fix the size of the union. */
 		char padding[256];
 	};
@@ -2501,3 +2520,20 @@ handled in-kernel, while the other I/O instructions are passed to userspace.
 
 When this capability is enabled, KVM_EXIT_S390_TSCH will occur on TEST
 SUBCHANNEL intercepts.
+
+6.5 KVM_CAP_PPC_EPR
+
+Architectures: ppc
+Parameters: args[0] defines whether the proxy facility is active
+Returns: 0 on success; -1 on error
+
+This capability enables or disables the delivery of interrupts through the
+external proxy facility.
+
+When enabled (args[0] != 0), every time the guest gets an external interrupt
+delivered, it automatically exits into user space with a KVM_EXIT_EPR exit
+to receive the topmost interrupt vector.
+
+When disabled (args[0] == 0), behavior is as if this facility is unsupported.
+
+When this capability is enabled, KVM_EXIT_EPR can occur.
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index ab49c6c..8a72d59 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -520,6 +520,8 @@ struct kvm_vcpu_arch {
 	u8 sane;
 	u8 cpu_type;
 	u8 hcall_needed;
+	u8 epr_enabled;
+	u8 epr_needed;
 
 	u32 cpr0_cfgaddr; /* holds the last set cpr0_cfgaddr */
 
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index 5f5f69a..493630e 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -264,6 +264,15 @@ static inline void kvm_linear_init(void)
 {}
 #endif
 
+static inline void kvmppc_set_epr(struct kvm_vcpu *vcpu, u32 epr)
+{
+#ifdef CONFIG_KVM_BOOKE_HV
+	mtspr(SPRN_GEPR, epr);
+#elif defined(CONFIG_BOOKE)
+	vcpu->arch.epr = epr;
+#endif
+}
+
 int kvm_vcpu_ioctl_config_tlb(struct kvm_vcpu *vcpu,
 			      struct kvm_config_tlb *cfg);
 int kvm_vcpu_ioctl_dirty_tlb(struct kvm_vcpu *vcpu,
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 964f447..940ec80 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -306,7 +306,7 @@ static int kvmppc_booke_irqprio_deliver(struct kvm_vcpu *vcpu,
 {
 	int allowed = 0;
 	ulong msr_mask = 0;
-	bool update_esr = false, update_dear = false;
+	bool update_esr = false, update_dear = false, update_epr = false;
 	ulong crit_raw = vcpu->arch.shared->critical;
 	ulong crit_r1 = kvmppc_get_gpr(vcpu, 1);
 	bool crit;
@@ -330,6 +330,9 @@ static int kvmppc_booke_irqprio_deliver(struct kvm_vcpu *vcpu,
 		keep_irq = true;
 	}
 
+	if ((priority == BOOKE_IRQPRIO_EXTERNAL) && vcpu->arch.epr_enabled)
+		update_epr = true;
+
 	switch (priority) {
 	case BOOKE_IRQPRIO_DTLB_MISS:
 	case BOOKE_IRQPRIO_DATA_STORAGE:
@@ -408,6 +411,8 @@ static int kvmppc_booke_irqprio_deliver(struct kvm_vcpu *vcpu,
 			set_guest_esr(vcpu, vcpu->arch.queued_esr);
 		if (update_dear == true)
 			set_guest_dear(vcpu, vcpu->arch.queued_dear);
+		if (update_epr == true)
+			kvm_make_request(KVM_REQ_EPR_EXIT, vcpu);
 
 		new_msr &= msr_mask;
 #if defined(CONFIG_64BIT)
@@ -615,6 +620,13 @@ int kvmppc_core_check_requests(struct kvm_vcpu *vcpu)
 		r = 0;
 	}
 
+	if (kvm_check_request(KVM_REQ_EPR_EXIT, vcpu)) {
+		vcpu->run->epr.epr = 0;
+		vcpu->arch.epr_needed = true;
+		vcpu->run->exit_reason = KVM_EXIT_EPR;
+		r = 0;
+	}
+
 	return r;
 }
 
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index e2225e5..934413c 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -306,6 +306,7 @@ int kvm_dev_ioctl_check_extension(long ext)
 #ifdef CONFIG_BOOKE
 	case KVM_CAP_PPC_BOOKE_SREGS:
 	case KVM_CAP_PPC_BOOKE_WATCHDOG:
+	case KVM_CAP_PPC_EPR:
 #else
 	case KVM_CAP_PPC_SEGSTATE:
 	case KVM_CAP_PPC_HIOR:
@@ -721,6 +722,11 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
 		for (i = 0; i < 9; ++i)
 			kvmppc_set_gpr(vcpu, 4 + i, run->papr_hcall.args[i]);
 		vcpu->arch.hcall_needed = 0;
+#ifdef CONFIG_BOOKE
+	} else if (vcpu->arch.epr_needed) {
+		kvmppc_set_epr(vcpu, run->epr.epr);
+		vcpu->arch.epr_needed = 0;
+#endif
 	}
 
 	r = kvmppc_vcpu_run(run, vcpu);
@@ -762,6 +768,10 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
 		r = 0;
 		vcpu->arch.papr_enabled = true;
 		break;
+	case KVM_CAP_PPC_EPR:
+		r = 0;
+		vcpu->arch.epr_enabled = cap->args[0];
+		break;
 #ifdef CONFIG_BOOKE
 	case KVM_CAP_PPC_BOOKE_WATCHDOG:
 		r = 0;
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index cbe0d68..4dd7d75 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -122,6 +122,7 @@ static inline bool is_error_page(struct page *page)
 #define KVM_REQ_WATCHDOG          18
 #define KVM_REQ_MASTERCLOCK_UPDATE 19
 #define KVM_REQ_MCLOCK_INPROGRESS 20
+#define KVM_REQ_EPR_EXIT          21
 
 #define KVM_USERSPACE_IRQ_SOURCE_ID		0
 #define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID	1
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
index 8bb0bf8..9a2db57 100644
--- a/include/uapi/linux/kvm.h
+++ b/include/uapi/linux/kvm.h
@@ -169,6 +169,7 @@ struct kvm_pit_config {
 #define KVM_EXIT_S390_UCONTROL	  20
 #define KVM_EXIT_WATCHDOG         21
 #define KVM_EXIT_S390_TSCH        22
+#define KVM_EXIT_EPR              23
 
 /* For KVM_EXIT_INTERNAL_ERROR */
 /* Emulate instruction failed. */
@@ -295,6 +296,10 @@ struct kvm_run {
 			__u32 ipb;
 			__u8 dequeued;
 		} s390_tsch;
+		/* KVM_EXIT_EPR */
+		struct {
+			__u32 epr;
+		} epr;
 		/* Fix the size of the union. */
 		char padding[256];
 	};
@@ -656,6 +661,7 @@ struct kvm_ppc_smmu_info {
 #define KVM_CAP_PPC_BOOKE_WATCHDOG 83
 #define KVM_CAP_PPC_HTAB_FD 84
 #define KVM_CAP_S390_CSS_SUPPORT 85
+#define KVM_CAP_PPC_EPR 86
 
 #ifdef KVM_CAP_IRQ_ROUTING
 
-- 
1.6.0.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 8/8] KVM: PPC: BookE: Add EPR ONE_REG sync
  2013-01-10 12:45 [PULL 0/8] ppc patch queue 2013-01-10 Alexander Graf
                   ` (6 preceding siblings ...)
  2013-01-10 12:45 ` [PATCH 7/8] KVM: PPC: BookE: Implement EPR exit Alexander Graf
@ 2013-01-10 12:45 ` Alexander Graf
  2013-01-14  9:03 ` [PULL 0/8] ppc patch queue 2013-01-10 Gleb Natapov
  8 siblings, 0 replies; 12+ messages in thread
From: Alexander Graf @ 2013-01-10 12:45 UTC (permalink / raw)
  To: kvm-ppc; +Cc: KVM list

We need to be able to read and write the contents of the EPR register
from user space.

This patch implements that logic through the ONE_REG API and declares
its (never implemented) SREGS counterpart as deprecated.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 Documentation/virtual/kvm/api.txt   |    1 +
 arch/powerpc/include/uapi/asm/kvm.h |    6 +++++-
 arch/powerpc/kvm/booke.c            |   21 +++++++++++++++++++++
 3 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index a98ed09..09905cb 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -1774,6 +1774,7 @@ registers, find a list below:
   PPC   | KVM_REG_PPC_VPA_SLB   | 128
   PPC   | KVM_REG_PPC_VPA_DTL   | 128
   PPC   | KVM_REG_PPC_EPCR	| 32
+  PPC   | KVM_REG_PPC_EPR	| 32
 
 4.69 KVM_GET_ONE_REG
 
diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index 2fba8a6..16064d0 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -114,7 +114,10 @@ struct kvm_regs {
 /* Embedded Floating Point (SPE) -- IVOR32-34 if KVM_SREGS_E_IVOR */
 #define KVM_SREGS_E_SPE			(1 << 9)
 
-/* External Proxy (EXP) -- EPR */
+/*
+ * DEPRECATED! USE ONE_REG FOR THIS ONE!
+ * External Proxy (EXP) -- EPR
+ */
 #define KVM_SREGS_EXP			(1 << 10)
 
 /* External PID (E.PD) -- EPSC/EPLC */
@@ -412,5 +415,6 @@ struct kvm_get_htab_header {
 #define KVM_REG_PPC_VPA_DTL	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x84)
 
 #define KVM_REG_PPC_EPCR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x85)
+#define KVM_REG_PPC_EPR		(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x86)
 
 #endif /* __LINUX_KVM_POWERPC_H */
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 940ec80..8779cd4 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -300,6 +300,15 @@ static void set_guest_esr(struct kvm_vcpu *vcpu, u32 esr)
 #endif
 }
 
+static unsigned long get_guest_epr(struct kvm_vcpu *vcpu)
+{
+#ifdef CONFIG_KVM_BOOKE_HV
+	return mfspr(SPRN_GEPR);
+#else
+	return vcpu->arch.epr;
+#endif
+}
+
 /* Deliver the interrupt of the corresponding priority, if possible. */
 static int kvmppc_booke_irqprio_deliver(struct kvm_vcpu *vcpu,
                                         unsigned int priority)
@@ -1405,6 +1414,11 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
 				 &vcpu->arch.dbg_reg.dac[dac], sizeof(u64));
 		break;
 	}
+	case KVM_REG_PPC_EPR: {
+		u32 epr = get_guest_epr(vcpu);
+		r = put_user(epr, (u32 __user *)(long)reg->addr);
+		break;
+	}
 #if defined(CONFIG_64BIT)
 	case KVM_REG_PPC_EPCR:
 		r = put_user(vcpu->arch.epcr, (u32 __user *)(long)reg->addr);
@@ -1437,6 +1451,13 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
 			     (u64 __user *)(long)reg->addr, sizeof(u64));
 		break;
 	}
+	case KVM_REG_PPC_EPR: {
+		u32 new_epr;
+		r = get_user(new_epr, (u32 __user *)(long)reg->addr);
+		if (!r)
+			kvmppc_set_epr(vcpu, new_epr);
+		break;
+	}
 #if defined(CONFIG_64BIT)
 	case KVM_REG_PPC_EPCR: {
 		u32 new_epcr;
-- 
1.6.0.2


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PULL 0/8] ppc patch queue 2013-01-10
  2013-01-10 12:45 [PULL 0/8] ppc patch queue 2013-01-10 Alexander Graf
                   ` (7 preceding siblings ...)
  2013-01-10 12:45 ` [PATCH 8/8] KVM: PPC: BookE: Add EPR ONE_REG sync Alexander Graf
@ 2013-01-14  9:03 ` Gleb Natapov
  2013-01-17 10:53   ` Alexander Graf
  8 siblings, 1 reply; 12+ messages in thread
From: Gleb Natapov @ 2013-01-14  9:03 UTC (permalink / raw)
  To: Alexander Graf; +Cc: kvm-ppc, KVM list

On Thu, Jan 10, 2013 at 01:45:04PM +0100, Alexander Graf wrote:
> Hi Marcelo / Gleb,
> 
> This is my current patch queue for ppc.  Please pull.
> 
> Highlights this time:
> 
>   - Book3S: enable potential sPAPR guest emulation on PR KVM on pHyp
>   - BookE: EPR (External Proxy Register) support
> 
> Alex
> 
Pulled, thanks.

> The following changes since commit 908e7d7999bcce70ac52e7f390a8f5cbc55948de:
>   Gleb Natapov (1):
>         KVM: MMU: simplify folding of dirty bit into accessed_dirty
> 
> are available in the git repository at:
> 
>   git://github.com/agraf/linux-2.6.git kvm-ppc-next
> 
> Alexander Graf (6):
>       KVM: PPC: Only WARN on invalid emulation
>       KVM: PPC: Book3S: PR: Enable alternative instruction for SC 1
>       KVM: PPC: BookE: Allow irq deliveries to inject requests
>       KVM: PPC: BookE: Emulate mfspr on EPR
>       KVM: PPC: BookE: Implement EPR exit
>       KVM: PPC: BookE: Add EPR ONE_REG sync
> 
> Mihai Caraman (2):
>       KVM: PPC: Fix SREGS documentation reference
>       KVM: PPC: Fix mfspr/mtspr MMUCFG emulation
> 
>  Documentation/virtual/kvm/api.txt   |   43 ++++++++++++++++++++++++++++++++--
>  arch/powerpc/include/asm/kvm_host.h |    2 +
>  arch/powerpc/include/asm/kvm_ppc.h  |   10 ++++++++
>  arch/powerpc/include/uapi/asm/kvm.h |    6 ++++-
>  arch/powerpc/kvm/book3s_emulate.c   |   30 ++++++++++++++++++++++++
>  arch/powerpc/kvm/book3s_pr.c        |    5 ++++
>  arch/powerpc/kvm/booke.c            |   40 +++++++++++++++++++++++++++++++-
>  arch/powerpc/kvm/booke_emulate.c    |    3 ++
>  arch/powerpc/kvm/emulate.c          |    5 ----
>  arch/powerpc/kvm/powerpc.c          |   13 +++++++++-
>  include/linux/kvm_host.h            |    1 +
>  include/uapi/linux/kvm.h            |    6 +++++
>  12 files changed, 153 insertions(+), 11 deletions(-)
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
			Gleb.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PULL 0/8] ppc patch queue 2013-01-10
  2013-01-14  9:03 ` [PULL 0/8] ppc patch queue 2013-01-10 Gleb Natapov
@ 2013-01-17 10:53   ` Alexander Graf
  2013-01-17 11:28     ` Gleb Natapov
  0 siblings, 1 reply; 12+ messages in thread
From: Alexander Graf @ 2013-01-17 10:53 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: kvm-ppc, KVM list


On 14.01.2013, at 10:03, Gleb Natapov wrote:

> On Thu, Jan 10, 2013 at 01:45:04PM +0100, Alexander Graf wrote:
>> Hi Marcelo / Gleb,
>> 
>> This is my current patch queue for ppc.  Please pull.
>> 
>> Highlights this time:
>> 
>>  - Book3S: enable potential sPAPR guest emulation on PR KVM on pHyp
>>  - BookE: EPR (External Proxy Register) support
>> 
>> Alex
>> 
> Pulled, thanks.

Any particular reason I don't see it in kvm/next?


Alex

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PULL 0/8] ppc patch queue 2013-01-10
  2013-01-17 10:53   ` Alexander Graf
@ 2013-01-17 11:28     ` Gleb Natapov
  0 siblings, 0 replies; 12+ messages in thread
From: Gleb Natapov @ 2013-01-17 11:28 UTC (permalink / raw)
  To: Alexander Graf; +Cc: kvm-ppc, KVM list

On Thu, Jan 17, 2013 at 11:53:38AM +0100, Alexander Graf wrote:
> 
> On 14.01.2013, at 10:03, Gleb Natapov wrote:
> 
> > On Thu, Jan 10, 2013 at 01:45:04PM +0100, Alexander Graf wrote:
> >> Hi Marcelo / Gleb,
> >> 
> >> This is my current patch queue for ppc.  Please pull.
> >> 
> >> Highlights this time:
> >> 
> >>  - Book3S: enable potential sPAPR guest emulation on PR KVM on pHyp
> >>  - BookE: EPR (External Proxy Register) support
> >> 
> >> Alex
> >> 
> > Pulled, thanks.
> 
> Any particular reason I don't see it in kvm/next?
> 
Not pushed yet. Sorry. Autotesting now and will push today.

--
			Gleb.

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2013-01-17 11:28 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-10 12:45 [PULL 0/8] ppc patch queue 2013-01-10 Alexander Graf
2013-01-10 12:45 ` [PATCH 1/8] KVM: PPC: Fix SREGS documentation reference Alexander Graf
2013-01-10 12:45 ` [PATCH 2/8] KVM: PPC: Only WARN on invalid emulation Alexander Graf
2013-01-10 12:45 ` [PATCH 3/8] KVM: PPC: Book3S: PR: Enable alternative instruction for SC 1 Alexander Graf
2013-01-10 12:45 ` [PATCH 4/8] KVM: PPC: Fix mfspr/mtspr MMUCFG emulation Alexander Graf
2013-01-10 12:45 ` [PATCH 5/8] KVM: PPC: BookE: Allow irq deliveries to inject requests Alexander Graf
2013-01-10 12:45 ` [PATCH 6/8] KVM: PPC: BookE: Emulate mfspr on EPR Alexander Graf
2013-01-10 12:45 ` [PATCH 7/8] KVM: PPC: BookE: Implement EPR exit Alexander Graf
2013-01-10 12:45 ` [PATCH 8/8] KVM: PPC: BookE: Add EPR ONE_REG sync Alexander Graf
2013-01-14  9:03 ` [PULL 0/8] ppc patch queue 2013-01-10 Gleb Natapov
2013-01-17 10:53   ` Alexander Graf
2013-01-17 11:28     ` Gleb Natapov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox