[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v11 12/16] s390x: protvirt: Disable address checks for PV guest I
From: |
Janosch Frank |
Subject: |
[PATCH v11 12/16] s390x: protvirt: Disable address checks for PV guest IO emulation |
Date: |
Thu, 19 Mar 2020 09:19:17 -0400 |
IO instruction data is routed through SIDAD for protected guests, so
adresses do not need to be checked, as this is kernel memory which is
always available.
Also the instruction data always starts at offset 0 of the SIDAD.
Signed-off-by: Janosch Frank <address@hidden>
Reviewed-by: Thomas Huth <address@hidden>
Reviewed-by: David Hildenbrand <address@hidden>
Reviewed-by: Christian Borntraeger <address@hidden>
Reviewed-by: Claudio Imbrenda <address@hidden>
Reviewed-by: Cornelia Huck <address@hidden>
---
target/s390x/ioinst.c | 35 ++++++++++++++++++++++++++++-------
1 file changed, 28 insertions(+), 7 deletions(-)
diff --git a/target/s390x/ioinst.c b/target/s390x/ioinst.c
index 0e840cc5792afe02..8828482eec306a2b 100644
--- a/target/s390x/ioinst.c
+++ b/target/s390x/ioinst.c
@@ -16,6 +16,25 @@
#include "hw/s390x/ioinst.h"
#include "trace.h"
#include "hw/s390x/s390-pci-bus.h"
+#include "hw/s390x/pv.h"
+
+/* All I/O instructions but chsc use the s format */
+static uint64_t get_address_from_regs(CPUS390XState *env, uint32_t ipb,
+ uint8_t *ar)
+{
+ /*
+ * Addresses for protected guests are all offsets into the
+ * satellite block which holds the IO control structures. Those
+ * control structures are always starting at offset 0 and are
+ * always aligned and accessible. So we can return 0 here which
+ * will pass the following address checks.
+ */
+ if (s390_is_pv()) {
+ *ar = 0;
+ return 0;
+ }
+ return decode_basedisp_s(env, ipb, ar);
+}
int ioinst_disassemble_sch_ident(uint32_t value, int *m, int *cssid, int *ssid,
int *schid)
@@ -114,7 +133,7 @@ void ioinst_handle_msch(S390CPU *cpu, uint64_t reg1,
uint32_t ipb, uintptr_t ra)
CPUS390XState *env = &cpu->env;
uint8_t ar;
- addr = decode_basedisp_s(env, ipb, &ar);
+ addr = get_address_from_regs(env, ipb, &ar);
if (addr & 3) {
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
return;
@@ -171,7 +190,7 @@ void ioinst_handle_ssch(S390CPU *cpu, uint64_t reg1,
uint32_t ipb, uintptr_t ra)
CPUS390XState *env = &cpu->env;
uint8_t ar;
- addr = decode_basedisp_s(env, ipb, &ar);
+ addr = get_address_from_regs(env, ipb, &ar);
if (addr & 3) {
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
return;
@@ -203,7 +222,7 @@ void ioinst_handle_stcrw(S390CPU *cpu, uint32_t ipb,
uintptr_t ra)
CPUS390XState *env = &cpu->env;
uint8_t ar;
- addr = decode_basedisp_s(env, ipb, &ar);
+ addr = get_address_from_regs(env, ipb, &ar);
if (addr & 3) {
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
return;
@@ -234,7 +253,7 @@ void ioinst_handle_stsch(S390CPU *cpu, uint64_t reg1,
uint32_t ipb,
CPUS390XState *env = &cpu->env;
uint8_t ar;
- addr = decode_basedisp_s(env, ipb, &ar);
+ addr = get_address_from_regs(env, ipb, &ar);
if (addr & 3) {
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
return;
@@ -303,7 +322,7 @@ int ioinst_handle_tsch(S390CPU *cpu, uint64_t reg1,
uint32_t ipb, uintptr_t ra)
return -EIO;
}
trace_ioinst_sch_id("tsch", cssid, ssid, schid);
- addr = decode_basedisp_s(env, ipb, &ar);
+ addr = get_address_from_regs(env, ipb, &ar);
if (addr & 3) {
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
return -EIO;
@@ -601,7 +620,7 @@ void ioinst_handle_chsc(S390CPU *cpu, uint32_t ipb,
uintptr_t ra)
{
ChscReq *req;
ChscResp *res;
- uint64_t addr;
+ uint64_t addr = 0;
int reg;
uint16_t len;
uint16_t command;
@@ -610,7 +629,9 @@ void ioinst_handle_chsc(S390CPU *cpu, uint32_t ipb,
uintptr_t ra)
trace_ioinst("chsc");
reg = (ipb >> 20) & 0x00f;
- addr = env->regs[reg];
+ if (!s390_is_pv()) {
+ addr = env->regs[reg];
+ }
/* Page boundary? */
if (addr & 0xfff) {
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
--
2.25.1
- Re: [PATCH v11 03/16] s390x: protvirt: Support unpack facility, (continued)
[PATCH v12] s390x: protvirt: Support unpack facility, Janosch Frank, 2020/03/23
[PATCH v11 06/16] s390x: protvirt: KVM intercept changes, Janosch Frank, 2020/03/19
[PATCH v11 08/16] s390x: protvirt: Move STSI data over SIDAD, Janosch Frank, 2020/03/19
[PATCH v11 10/16] s390x: protvirt: Set guest IPL PSW, Janosch Frank, 2020/03/19
[PATCH v11 07/16] s390x: Add SIDA memory ops, Janosch Frank, 2020/03/19
[PATCH v11 09/16] s390x: protvirt: SCLP interpretation, Janosch Frank, 2020/03/19
[PATCH v11 13/16] s390x: protvirt: Move IO control structures over SIDA, Janosch Frank, 2020/03/19
[PATCH v11 12/16] s390x: protvirt: Disable address checks for PV guest IO emulation,
Janosch Frank <=
[PATCH v11 11/16] s390x: protvirt: Move diag 308 data over SIDA, Janosch Frank, 2020/03/19
[PATCH v11 14/16] s390x: protvirt: Handle SIGP store status correctly, Janosch Frank, 2020/03/19
[PATCH v11 16/16] s390x: Add unpack facility feature to GA1, Janosch Frank, 2020/03/19
[PATCH v11 15/16] docs: system: Add protvirt docs, Janosch Frank, 2020/03/19
Re: [PATCH v11 00/16] s390x: Protected Virtualization support, Cornelia Huck, 2020/03/23
Re: [PATCH v11 00/16] s390x: Protected Virtualization support, no-reply, 2020/03/23