[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v8 11/15] s390x: protvirt: Disable address checks for PV guest IO
From: |
Janosch Frank |
Subject: |
[PATCH v8 11/15] s390x: protvirt: Disable address checks for PV guest IO emulation |
Date: |
Tue, 10 Mar 2020 09:40:04 -0400 |
IO instruction data is routed through SIDAD for protected guests, so
adresses do not need to be checked, as this is kernel memory.
Signed-off-by: Janosch Frank <address@hidden>
Reviewed-by: Thomas Huth <address@hidden>
Reviewed-by: David Hildenbrand <address@hidden>
---
target/s390x/ioinst.c | 32 +++++++++++++++++++++++++-------
1 file changed, 25 insertions(+), 7 deletions(-)
diff --git a/target/s390x/ioinst.c b/target/s390x/ioinst.c
index c437a1d8c6..34afd2ee64 100644
--- a/target/s390x/ioinst.c
+++ b/target/s390x/ioinst.c
@@ -17,6 +17,22 @@
#include "trace.h"
#include "hw/s390x/s390-pci-bus.h"
+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 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 +130,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 +187,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 +219,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 +250,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 +319,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 +617,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 +626,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.20.1
- [PATCH v8 15/15] s390x: Add unpack facility feature to GA1, (continued)
- [PATCH v8 15/15] s390x: Add unpack facility feature to GA1, Janosch Frank, 2020/03/10
- [PATCH v8 06/15] s390x: Add SIDA memory ops, Janosch Frank, 2020/03/10
- [PATCH v8 01/15] Sync pv, Janosch Frank, 2020/03/10
- [PATCH v8 02/15] s390x: protvirt: Support unpack facility, Janosch Frank, 2020/03/10
- [PATCH v8 07/15] s390x: protvirt: Move STSI data over SIDAD, Janosch Frank, 2020/03/10
- [PATCH v8 11/15] s390x: protvirt: Disable address checks for PV guest IO emulation,
Janosch Frank <=
- [PATCH v8 03/15] s390x: protvirt: Add migration blocker, Janosch Frank, 2020/03/10
- Re: [PATCH v8 03/15] s390x: protvirt: Add migration blocker, David Hildenbrand, 2020/03/10
- Re: [PATCH v8 03/15] s390x: protvirt: Add migration blocker, Janosch Frank, 2020/03/10
- Re: [PATCH v8 03/15] s390x: protvirt: Add migration blocker, David Hildenbrand, 2020/03/10
- Re: [PATCH v8 03/15] s390x: protvirt: Add migration blocker, Janosch Frank, 2020/03/10
- [PATCH v9] s390x: protvirt: Add migration blocker, Janosch Frank, 2020/03/10
- Re: [PATCH v9] s390x: protvirt: Add migration blocker, David Hildenbrand, 2020/03/10
[PATCH v8 08/15] s390x: protvirt: SCLP interpretation, Janosch Frank, 2020/03/10
[PATCH v8 04/15] s390x: protvirt: Inhibit balloon when switching to protected mode, Janosch Frank, 2020/03/10
[PATCH v8 12/15] s390x: protvirt: Move IO control structures over SIDA, Janosch Frank, 2020/03/10