[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [Patch/RFC 05/16] s390x/kvm: Rework SIGP INITIAL CPU RESET
From: |
Christian Borntraeger |
Subject: |
[Qemu-devel] [Patch/RFC 05/16] s390x/kvm: Rework SIGP INITIAL CPU RESET handler |
Date: |
Fri, 7 Feb 2014 18:16:14 +0100 |
From: Thomas Huth <address@hidden>
The s390_cpu_initial_reset() function had two deficiencies: First, it
used an ioctl for the destination CPU, and this ioctl could block
nearly forever, as long as the destination CPU was running in the SIE
loop. Second, it also cleared the general purpose registers - something
it should not do according to the Principles of Operations.
Since we've already got another function for the initial CPU reset in
cpu.c, we can also use that function instead. And by using run_on_cpu()
for executing this code, we make sure that the destination CPU is
correctly kicked out of kernel mode now.
Suggested-by: Christian Borntraeger <address@hidden>
Signed-off-by: Thomas Huth <address@hidden>
Reviewed-by: Cornelia Huck <address@hidden>
Signed-off-by: Christian Borntraeger <address@hidden>
---
target-s390x/kvm.c | 25 +++++++------------------
1 file changed, 7 insertions(+), 18 deletions(-)
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index b93fe84..1f89a89 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -624,25 +624,13 @@ int kvm_s390_cpu_restart(S390CPU *cpu)
return 0;
}
-static int s390_cpu_initial_reset(S390CPU *cpu)
+static void sigp_initial_cpu_reset(void *arg)
{
- CPUState *cs = CPU(cpu);
- CPUS390XState *env = &cpu->env;
- int i;
-
- s390_del_running_cpu(cpu);
- if (kvm_vcpu_ioctl(cs, KVM_S390_INITIAL_RESET, NULL) < 0) {
- perror("cannot init reset vcpu");
- }
+ CPUState *cpu = arg;
+ S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
- /* Manually zero out all registers */
- cpu_synchronize_state(cs);
- for (i = 0; i < 16; i++) {
- env->regs[i] = 0;
- }
-
- DPRINTF("DONE: SIGP initial reset: %p\n", env);
- return 0;
+ cpu_synchronize_state(cpu);
+ scc->initial_cpu_reset(cpu);
}
#define SIGP_ORDER_MASK 0x000000ff
@@ -681,7 +669,8 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run,
uint8_t ipa1)
cc = 1; /* status stored */
break;
case SIGP_INITIAL_CPU_RESET:
- cc = s390_cpu_initial_reset(target_cpu);
+ run_on_cpu(CPU(target_cpu), sigp_initial_cpu_reset, CPU(target_cpu));
+ cc = 0;
break;
default:
DPRINTF("KVM: unknown SIGP: 0x%x\n", order_code);
--
1.8.4.2
- [Qemu-devel] [Patch/RFC 00/16] s390x/kvm features and fixes, Christian Borntraeger, 2014/02/07
- [Qemu-devel] [Patch/RFC 05/16] s390x/kvm: Rework SIGP INITIAL CPU RESET handler,
Christian Borntraeger <=
- [Qemu-devel] [Patch/RFC 09/16] s390x/eventfacility: mask out commands, Christian Borntraeger, 2014/02/07
- [Qemu-devel] [Patch/RFC 02/16] s390x/kvm: implement floating-interrupt controller device, Christian Borntraeger, 2014/02/07
- [Qemu-devel] [Patch/RFC 04/16] s390x/kvm: Fixed bad SIGP SET-ARCHITECTURE handler, Christian Borntraeger, 2014/02/07
- [Qemu-devel] [Patch/RFC 03/16] s390x/async_pf: Check for apf extension and enable pfault, Christian Borntraeger, 2014/02/07
- [Qemu-devel] [Patch/RFC 07/16] s390x/virtio-hcall: Add range check for hypervisor call, Christian Borntraeger, 2014/02/07
- [Qemu-devel] [Patch/RFC 11/16] s390x/sclp: Add missing checks to SCLP handler, Christian Borntraeger, 2014/02/07
- [Qemu-devel] [Patch/RFC 15/16] s390x/event-facility: add support for live migration, Christian Borntraeger, 2014/02/07
- [Qemu-devel] [Patch/RFC 16/16] s390x/event-facility: exploit realize/unrealize, Christian Borntraeger, 2014/02/07
- [Qemu-devel] [Patch/RFC 14/16] s390x/event-facility: code restructure, Christian Borntraeger, 2014/02/07
- [Qemu-devel] [Patch/RFC 10/16] s390x/sclp: Fixed the size of sccb and code parameter, Christian Borntraeger, 2014/02/07