mirror of https://github.com/proxmox/mirror_qemu
s390x/pci: Rework memory access in zpci instruction
Change zpci instructions to use the new logical memory access functions. Signed-off-by: Frank Blaschka <blaschka@linux.vnet.ibm.com> Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>master
parent
7781a492fa
commit
63ceef61ac
|
@ -155,7 +155,9 @@ int clp_service_call(S390CPU *cpu, uint8_t r2)
|
|||
return 0;
|
||||
}
|
||||
|
||||
cpu_physical_memory_read(env->regs[r2], buffer, sizeof(*reqh));
|
||||
if (s390_cpu_virt_mem_read(cpu, env->regs[r2], buffer, sizeof(*reqh))) {
|
||||
return 0;
|
||||
}
|
||||
reqh = (ClpReqHdr *)buffer;
|
||||
req_len = lduw_p(&reqh->len);
|
||||
if (req_len < 16 || req_len > 8184 || (req_len % 8 != 0)) {
|
||||
|
@ -163,7 +165,10 @@ int clp_service_call(S390CPU *cpu, uint8_t r2)
|
|||
return 0;
|
||||
}
|
||||
|
||||
cpu_physical_memory_read(env->regs[r2], buffer, req_len + sizeof(*resh));
|
||||
if (s390_cpu_virt_mem_read(cpu, env->regs[r2], buffer,
|
||||
req_len + sizeof(*resh))) {
|
||||
return 0;
|
||||
}
|
||||
resh = (ClpRspHdr *)(buffer + req_len);
|
||||
res_len = lduw_p(&resh->len);
|
||||
if (res_len < 8 || res_len > 8176 || (res_len % 8 != 0)) {
|
||||
|
@ -175,7 +180,10 @@ int clp_service_call(S390CPU *cpu, uint8_t r2)
|
|||
return 0;
|
||||
}
|
||||
|
||||
cpu_physical_memory_read(env->regs[r2], buffer, req_len + res_len);
|
||||
if (s390_cpu_virt_mem_read(cpu, env->regs[r2], buffer,
|
||||
req_len + res_len)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (req_len != 32) {
|
||||
stw_p(&resh->rsp, CLP_RC_LEN);
|
||||
|
@ -269,7 +277,10 @@ int clp_service_call(S390CPU *cpu, uint8_t r2)
|
|||
}
|
||||
|
||||
out:
|
||||
cpu_physical_memory_write(env->regs[r2], buffer, req_len + res_len);
|
||||
if (s390_cpu_virt_mem_write(cpu, env->regs[r2], buffer,
|
||||
req_len + res_len)) {
|
||||
return 0;
|
||||
}
|
||||
setcc(cpu, cc);
|
||||
return 0;
|
||||
}
|
||||
|
@ -539,10 +550,10 @@ int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr)
|
|||
S390PCIBusDevice *pbdev;
|
||||
MemoryRegion *mr;
|
||||
int i;
|
||||
uint64_t val;
|
||||
uint32_t fh;
|
||||
uint8_t pcias;
|
||||
uint8_t len;
|
||||
uint8_t buffer[128];
|
||||
|
||||
if (env->psw.mask & PSW_MASK_PSTATE) {
|
||||
program_interrupt(env, PGM_PRIVILEGED, 6);
|
||||
|
@ -590,9 +601,12 @@ int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (s390_cpu_virt_mem_read(cpu, gaddr, buffer, len)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < len / 8; i++) {
|
||||
val = ldq_phys(&address_space_memory, gaddr + i * 8);
|
||||
io_mem_write(mr, env->regs[r3] + i * 8, val, 8);
|
||||
io_mem_write(mr, env->regs[r3] + i * 8, ldq_p(buffer + i * 8), 8);
|
||||
}
|
||||
|
||||
setcc(cpu, ZPCI_PCI_LS_OK);
|
||||
|
@ -709,7 +723,9 @@ int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba)
|
|||
return 0;
|
||||
}
|
||||
|
||||
cpu_physical_memory_read(fiba, (uint8_t *)&fib, sizeof(fib));
|
||||
if (s390_cpu_virt_mem_read(cpu, fiba, (uint8_t *)&fib, sizeof(fib))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (oc) {
|
||||
case ZPCI_MOD_FC_REG_INT:
|
||||
|
@ -809,7 +825,10 @@ int stpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba)
|
|||
fib.fc |= 0x10;
|
||||
}
|
||||
|
||||
cpu_physical_memory_write(fiba, (uint8_t *)&fib, sizeof(fib));
|
||||
if (s390_cpu_virt_mem_write(cpu, fiba, (uint8_t *)&fib, sizeof(fib))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
setcc(cpu, cc);
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue