s390: Use s390_cpu_physical_memory_map for tpi.

Map the I/O interruption code before calling into css.

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
Cornelia Huck 2013-01-27 23:59:26 +00:00 committed by Alexander Graf
parent 2e788490d8
commit 50c8d9bfc6
4 changed files with 24 additions and 8 deletions

View file

@ -852,7 +852,7 @@ int css_do_stcrw(CRW *crw)
return ret; return ret;
} }
int css_do_tpi(uint64_t addr, int lowcore) int css_do_tpi(IOIntCode *int_code, int lowcore)
{ {
/* No pending interrupts for !KVM. */ /* No pending interrupts for !KVM. */
return 0; return 0;

View file

@ -413,7 +413,7 @@ int css_do_hsch(SubchDev *sch);
int css_do_ssch(SubchDev *sch, ORB *orb); int css_do_ssch(SubchDev *sch, ORB *orb);
int css_do_tsch(SubchDev *sch, IRB *irb); int css_do_tsch(SubchDev *sch, IRB *irb);
int css_do_stcrw(CRW *crw); int css_do_stcrw(CRW *crw);
int css_do_tpi(uint64_t addr, int lowcore); int css_do_tpi(IOIntCode *int_code, int lowcore);
int css_collect_chp_desc(int m, uint8_t cssid, uint8_t f_chpid, uint8_t l_chpid, int css_collect_chp_desc(int m, uint8_t cssid, uint8_t f_chpid, uint8_t l_chpid,
int rfmt, void *buf); int rfmt, void *buf);
void css_do_schm(uint8_t mbk, int update, int dct, uint64_t mbo); void css_do_schm(uint8_t mbk, int update, int dct, uint64_t mbo);
@ -471,7 +471,7 @@ static inline int css_do_stcrw(CRW *crw)
{ {
return 1; return 1;
} }
static inline int css_do_tpi(uint64_t addr, int lowcore) static inline int css_do_tpi(IOIntCode *int_code, int lowcore)
{ {
return 0; return 0;
} }

View file

@ -619,16 +619,25 @@ int ioinst_handle_tpi(CPUS390XState *env, uint32_t ipb)
{ {
uint64_t addr; uint64_t addr;
int lowcore; int lowcore;
IOIntCode *int_code;
hwaddr len, orig_len;
int ret;
trace_ioinst("tpi"); trace_ioinst("tpi");
addr = decode_basedisp_s(env, ipb); addr = decode_basedisp_s(env, ipb);
lowcore = addr ? 0 : 1; lowcore = addr ? 0 : 1;
if (addr < 8192) { len = lowcore ? 8 /* two words */ : 12 /* three words */;
addr += env->psa; orig_len = len;
} else if ((env->psa <= addr) && (addr < env->psa + 8192)) { int_code = s390_cpu_physical_memory_map(env, addr, &len, 1);
addr -= env->psa; if (!int_code || (len != orig_len)) {
program_interrupt(env, PGM_SPECIFICATION, 2);
ret = -EIO;
goto out;
} }
return css_do_tpi(addr, lowcore); ret = css_do_tpi(int_code, lowcore);
out:
s390_cpu_physical_memory_unmap(env, int_code, len, 1);
return ret;
} }
#define SCHM_REG1_RES(_reg) (_reg & 0x000000000ffffffc) #define SCHM_REG1_RES(_reg) (_reg & 0x000000000ffffffc)

View file

@ -195,6 +195,13 @@ typedef struct CRW {
#define CRW_RSC_SUBCH 0x3 #define CRW_RSC_SUBCH 0x3
#define CRW_RSC_CHP 0x4 #define CRW_RSC_CHP 0x4
/* I/O interruption code */
typedef struct IOIntCode {
uint32_t subsys_id;
uint32_t intparm;
uint32_t interrupt_id;
} QEMU_PACKED IOIntCode;
/* schid disintegration */ /* schid disintegration */
#define IOINST_SCHID_ONE(_schid) ((_schid & 0x00010000) >> 16) #define IOINST_SCHID_ONE(_schid) ((_schid & 0x00010000) >> 16)
#define IOINST_SCHID_M(_schid) ((_schid & 0x00080000) >> 19) #define IOINST_SCHID_M(_schid) ((_schid & 0x00080000) >> 19)