linux-mips.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] KVM: MIPS: Misc fixes for 4.10
@ 2017-01-03 17:42 James Hogan
  2017-01-03 17:42 ` James Hogan
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: James Hogan @ 2017-01-03 17:42 UTC (permalink / raw)
  To: Paolo Bonzini, Radim Krčmář
  Cc: Ralf Baechle, linux-mips, kvm, stable, James Hogan

This series contains a couple of 4.10 fixes.

- Patch 1 fixes when KVM is used by a 64-bit (n64) userland program,
  which can result in a kernel crash when a signal is delivered on the
  way back out from the guest.

- Patch 2 fixes flushing of the entry code from the icache to take place
  on all CPUs rather than only the local one.

Both are tagged for stable.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org

James Hogan (2):
  KVM: MIPS: Don't clobber CP0_Status.UX
  KVM: MIPS: Flush KVM entry code from icache globally

 arch/mips/kvm/entry.c | 5 ++++-
 arch/mips/kvm/mips.c  | 4 ++--
 2 files changed, 6 insertions(+), 3 deletions(-)

-- 
git-series 0.8.10

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

* [PATCH 0/2] KVM: MIPS: Misc fixes for 4.10
  2017-01-03 17:42 [PATCH 0/2] KVM: MIPS: Misc fixes for 4.10 James Hogan
@ 2017-01-03 17:42 ` James Hogan
  2017-01-03 17:43 ` [PATCH 1/2] KVM: MIPS: Don't clobber CP0_Status.UX James Hogan
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: James Hogan @ 2017-01-03 17:42 UTC (permalink / raw)
  To: Paolo Bonzini, Radim Krčmář
  Cc: Ralf Baechle, linux-mips, kvm, stable, James Hogan

This series contains a couple of 4.10 fixes.

- Patch 1 fixes when KVM is used by a 64-bit (n64) userland program,
  which can result in a kernel crash when a signal is delivered on the
  way back out from the guest.

- Patch 2 fixes flushing of the entry code from the icache to take place
  on all CPUs rather than only the local one.

Both are tagged for stable.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org

James Hogan (2):
  KVM: MIPS: Don't clobber CP0_Status.UX
  KVM: MIPS: Flush KVM entry code from icache globally

 arch/mips/kvm/entry.c | 5 ++++-
 arch/mips/kvm/mips.c  | 4 ++--
 2 files changed, 6 insertions(+), 3 deletions(-)

-- 
git-series 0.8.10

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

* [PATCH 1/2] KVM: MIPS: Don't clobber CP0_Status.UX
  2017-01-03 17:42 [PATCH 0/2] KVM: MIPS: Misc fixes for 4.10 James Hogan
  2017-01-03 17:42 ` James Hogan
@ 2017-01-03 17:43 ` James Hogan
  2017-01-03 17:43   ` James Hogan
  2017-01-03 17:43 ` [PATCH 2/2] KVM: MIPS: Flush KVM entry code from icache globally James Hogan
  2017-01-05 16:54 ` [PATCH 0/2] KVM: MIPS: Misc fixes for 4.10 Radim Krčmář
  3 siblings, 1 reply; 7+ messages in thread
From: James Hogan @ 2017-01-03 17:43 UTC (permalink / raw)
  To: Paolo Bonzini, Radim Krčmář
  Cc: Ralf Baechle, linux-mips, kvm, stable, James Hogan

On 64-bit kernels, MIPS KVM will clear CP0_Status.UX to prevent the
guest (running in user mode) from accessing the 64-bit memory segments.
However the previous value of CP0_Status.UX is never restored when
exiting from the guest.

If the user process uses 64-bit addressing (the n64 ABI) this can result
in address error exceptions from the kernel if it needs to deliver a
signal before returning to user mode, as the kernel will need to write a
sigframe to high user addresses on the user stack which are disallowed
by CP0_Status.UX=0.

This is fixed by explicitly setting SX and UX again when exiting from
the guest, and explicitly clearing those bits when returning to the
guest. Having the SX and UX bits set when handling guest exits (rather
than only when exiting to userland) will be helpful when we support VZ,
since we shouldn't need to directly read or write guest memory, so it
will be valid for cache management IPIs to access host user addresses.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
Cc: <stable@vger.kernel.org> # 4.8.x-
---
 arch/mips/kvm/entry.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/mips/kvm/entry.c b/arch/mips/kvm/entry.c
index 6a02b3a3fa65..e92fb190e2d6 100644
--- a/arch/mips/kvm/entry.c
+++ b/arch/mips/kvm/entry.c
@@ -521,6 +521,9 @@ void *kvm_mips_build_exit(void *addr)
 	uasm_i_and(&p, V0, V0, AT);
 	uasm_i_lui(&p, AT, ST0_CU0 >> 16);
 	uasm_i_or(&p, V0, V0, AT);
+#ifdef CONFIG_64BIT
+	uasm_i_ori(&p, V0, V0, ST0_SX | ST0_UX);
+#endif
 	uasm_i_mtc0(&p, V0, C0_STATUS);
 	uasm_i_ehb(&p);
 
@@ -643,7 +646,7 @@ static void *kvm_mips_build_ret_to_guest(void *addr)
 
 	/* Setup status register for running guest in UM */
 	uasm_i_ori(&p, V1, V1, ST0_EXL | KSU_USER | ST0_IE);
-	UASM_i_LA(&p, AT, ~(ST0_CU0 | ST0_MX));
+	UASM_i_LA(&p, AT, ~(ST0_CU0 | ST0_MX | ST0_SX | ST0_UX));
 	uasm_i_and(&p, V1, V1, AT);
 	uasm_i_mtc0(&p, V1, C0_STATUS);
 	uasm_i_ehb(&p);
-- 
git-series 0.8.10

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

* [PATCH 1/2] KVM: MIPS: Don't clobber CP0_Status.UX
  2017-01-03 17:43 ` [PATCH 1/2] KVM: MIPS: Don't clobber CP0_Status.UX James Hogan
@ 2017-01-03 17:43   ` James Hogan
  0 siblings, 0 replies; 7+ messages in thread
From: James Hogan @ 2017-01-03 17:43 UTC (permalink / raw)
  To: Paolo Bonzini, Radim Krčmář
  Cc: Ralf Baechle, linux-mips, kvm, stable, James Hogan

On 64-bit kernels, MIPS KVM will clear CP0_Status.UX to prevent the
guest (running in user mode) from accessing the 64-bit memory segments.
However the previous value of CP0_Status.UX is never restored when
exiting from the guest.

If the user process uses 64-bit addressing (the n64 ABI) this can result
in address error exceptions from the kernel if it needs to deliver a
signal before returning to user mode, as the kernel will need to write a
sigframe to high user addresses on the user stack which are disallowed
by CP0_Status.UX=0.

This is fixed by explicitly setting SX and UX again when exiting from
the guest, and explicitly clearing those bits when returning to the
guest. Having the SX and UX bits set when handling guest exits (rather
than only when exiting to userland) will be helpful when we support VZ,
since we shouldn't need to directly read or write guest memory, so it
will be valid for cache management IPIs to access host user addresses.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
Cc: <stable@vger.kernel.org> # 4.8.x-
---
 arch/mips/kvm/entry.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/mips/kvm/entry.c b/arch/mips/kvm/entry.c
index 6a02b3a3fa65..e92fb190e2d6 100644
--- a/arch/mips/kvm/entry.c
+++ b/arch/mips/kvm/entry.c
@@ -521,6 +521,9 @@ void *kvm_mips_build_exit(void *addr)
 	uasm_i_and(&p, V0, V0, AT);
 	uasm_i_lui(&p, AT, ST0_CU0 >> 16);
 	uasm_i_or(&p, V0, V0, AT);
+#ifdef CONFIG_64BIT
+	uasm_i_ori(&p, V0, V0, ST0_SX | ST0_UX);
+#endif
 	uasm_i_mtc0(&p, V0, C0_STATUS);
 	uasm_i_ehb(&p);
 
@@ -643,7 +646,7 @@ static void *kvm_mips_build_ret_to_guest(void *addr)
 
 	/* Setup status register for running guest in UM */
 	uasm_i_ori(&p, V1, V1, ST0_EXL | KSU_USER | ST0_IE);
-	UASM_i_LA(&p, AT, ~(ST0_CU0 | ST0_MX));
+	UASM_i_LA(&p, AT, ~(ST0_CU0 | ST0_MX | ST0_SX | ST0_UX));
 	uasm_i_and(&p, V1, V1, AT);
 	uasm_i_mtc0(&p, V1, C0_STATUS);
 	uasm_i_ehb(&p);
-- 
git-series 0.8.10

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

* [PATCH 2/2] KVM: MIPS: Flush KVM entry code from icache globally
  2017-01-03 17:42 [PATCH 0/2] KVM: MIPS: Misc fixes for 4.10 James Hogan
  2017-01-03 17:42 ` James Hogan
  2017-01-03 17:43 ` [PATCH 1/2] KVM: MIPS: Don't clobber CP0_Status.UX James Hogan
@ 2017-01-03 17:43 ` James Hogan
  2017-01-03 17:43   ` James Hogan
  2017-01-05 16:54 ` [PATCH 0/2] KVM: MIPS: Misc fixes for 4.10 Radim Krčmář
  3 siblings, 1 reply; 7+ messages in thread
From: James Hogan @ 2017-01-03 17:43 UTC (permalink / raw)
  To: Paolo Bonzini, Radim Krčmář
  Cc: Ralf Baechle, linux-mips, kvm, stable, James Hogan

Flush the KVM entry code from the icache on all CPUs, not just the one
that built the entry code.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
Cc: <stable@vger.kernel.org> # 3.16.x-
---
 arch/mips/kvm/mips.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c
index 06a60b19acfb..29ec9ab3fd55 100644
--- a/arch/mips/kvm/mips.c
+++ b/arch/mips/kvm/mips.c
@@ -360,8 +360,8 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
 	dump_handler("kvm_exit", gebase + 0x2000, vcpu->arch.vcpu_run);
 
 	/* Invalidate the icache for these ranges */
-	local_flush_icache_range((unsigned long)gebase,
-				(unsigned long)gebase + ALIGN(size, PAGE_SIZE));
+	flush_icache_range((unsigned long)gebase,
+			   (unsigned long)gebase + ALIGN(size, PAGE_SIZE));
 
 	/*
 	 * Allocate comm page for guest kernel, a TLB will be reserved for
-- 
git-series 0.8.10

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

* [PATCH 2/2] KVM: MIPS: Flush KVM entry code from icache globally
  2017-01-03 17:43 ` [PATCH 2/2] KVM: MIPS: Flush KVM entry code from icache globally James Hogan
@ 2017-01-03 17:43   ` James Hogan
  0 siblings, 0 replies; 7+ messages in thread
From: James Hogan @ 2017-01-03 17:43 UTC (permalink / raw)
  To: Paolo Bonzini, Radim Krčmář
  Cc: Ralf Baechle, linux-mips, kvm, stable, James Hogan

Flush the KVM entry code from the icache on all CPUs, not just the one
that built the entry code.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
Cc: <stable@vger.kernel.org> # 3.16.x-
---
 arch/mips/kvm/mips.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c
index 06a60b19acfb..29ec9ab3fd55 100644
--- a/arch/mips/kvm/mips.c
+++ b/arch/mips/kvm/mips.c
@@ -360,8 +360,8 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
 	dump_handler("kvm_exit", gebase + 0x2000, vcpu->arch.vcpu_run);
 
 	/* Invalidate the icache for these ranges */
-	local_flush_icache_range((unsigned long)gebase,
-				(unsigned long)gebase + ALIGN(size, PAGE_SIZE));
+	flush_icache_range((unsigned long)gebase,
+			   (unsigned long)gebase + ALIGN(size, PAGE_SIZE));
 
 	/*
 	 * Allocate comm page for guest kernel, a TLB will be reserved for
-- 
git-series 0.8.10

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

* Re: [PATCH 0/2] KVM: MIPS: Misc fixes for 4.10
  2017-01-03 17:42 [PATCH 0/2] KVM: MIPS: Misc fixes for 4.10 James Hogan
                   ` (2 preceding siblings ...)
  2017-01-03 17:43 ` [PATCH 2/2] KVM: MIPS: Flush KVM entry code from icache globally James Hogan
@ 2017-01-05 16:54 ` Radim Krčmář
  3 siblings, 0 replies; 7+ messages in thread
From: Radim Krčmář @ 2017-01-05 16:54 UTC (permalink / raw)
  To: James Hogan; +Cc: Paolo Bonzini, Ralf Baechle, linux-mips, kvm, stable

2017-01-03 17:42+0000, James Hogan:
> This series contains a couple of 4.10 fixes.
> 
> - Patch 1 fixes when KVM is used by a 64-bit (n64) userland program,
>   which can result in a kernel crash when a signal is delivered on the
>   way back out from the guest.
> 
> - Patch 2 fixes flushing of the entry code from the icache to take place
>   on all CPUs rather than only the local one.
> 
> Both are tagged for stable.

Applied to kvm/master, thanks.

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

end of thread, other threads:[~2017-01-05 16:55 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-03 17:42 [PATCH 0/2] KVM: MIPS: Misc fixes for 4.10 James Hogan
2017-01-03 17:42 ` James Hogan
2017-01-03 17:43 ` [PATCH 1/2] KVM: MIPS: Don't clobber CP0_Status.UX James Hogan
2017-01-03 17:43   ` James Hogan
2017-01-03 17:43 ` [PATCH 2/2] KVM: MIPS: Flush KVM entry code from icache globally James Hogan
2017-01-03 17:43   ` James Hogan
2017-01-05 16:54 ` [PATCH 0/2] KVM: MIPS: Misc fixes for 4.10 Radim Krčmář

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).