On Fri, 29 Nov 2019 04:48:08 -0500 Janosch Frank <fran...@linux.ibm.com> wrote:
> 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 <fran...@linux.ibm.com> > --- > target/s390x/ioinst.c | 26 +++++++++++++++++++------- > 1 file changed, 19 insertions(+), 7 deletions(-) > > diff --git a/target/s390x/ioinst.c b/target/s390x/ioinst.c > index c437a1d8c6..e4102430aa 100644 > --- a/target/s390x/ioinst.c > +++ b/target/s390x/ioinst.c > @@ -17,6 +17,16 @@ > #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) Would like to keep the ioinst_* pattern here (even though this is an internal function). ioinst_decode_addr()? > +{ > + if (env->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) > { (...) > @@ -601,7 +611,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 +620,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 (!env->pv) { > + addr = env->regs[reg]; > + } addr = env->pv ? 0 : env->regs[reg]; ? > /* Page boundary? */ > if (addr & 0xfff) { > s390_program_interrupt(env, PGM_SPECIFICATION, ra);