From 5288fbf0ef041ba0e8b4dcb2df4536b5e3a48b32 Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Tue, 25 Mar 2008 18:47:31 +0100 Subject: KVM: s390: interprocessor communication via sigp This patch introduces in-kernel handling of _some_ sigp interprocessor signals (similar to ipi). kvm_s390_handle_sigp() decodes the sigp instruction and calls individual handlers depending on the operation requested: - sigp sense tries to retrieve information such as existence or running state of the remote cpu - sigp emergency sends an external interrupt to the remove cpu - sigp stop stops a remove cpu - sigp stop store status stops a remote cpu, and stores its entire internal state to the cpus lowcore - sigp set arch sets the architecture mode of the remote cpu. setting to ESAME (s390x 64bit) is accepted, setting to ESA/S390 (s390, 31 or 24 bit) is denied, all others are passed to userland - sigp set prefix sets the prefix register of a remote cpu For implementation of this, the stop intercept indication starts to get reused on purpose: a set of action bits defines what to do once a cpu gets stopped: ACTION_STOP_ON_STOP really stops the cpu when a stop intercept is recognized ACTION_STORE_ON_STOP stores the cpu status to lowcore when a stop intercept is recognized Acked-by: Martin Schwidefsky Signed-off-by: Christian Borntraeger Signed-off-by: Carsten Otte Signed-off-by: Carsten Otte Signed-off-by: Avi Kivity --- include/asm-s390/kvm_host.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'include/asm-s390/kvm_host.h') diff --git a/include/asm-s390/kvm_host.h b/include/asm-s390/kvm_host.h index 2eaf6fede02..1c829bdf588 100644 --- a/include/asm-s390/kvm_host.h +++ b/include/asm-s390/kvm_host.h @@ -128,6 +128,12 @@ struct kvm_vcpu_stat { u32 instruction_chsc; u32 instruction_stsi; u32 instruction_stfl; + u32 instruction_sigp_sense; + u32 instruction_sigp_emergency; + u32 instruction_sigp_stop; + u32 instruction_sigp_arch; + u32 instruction_sigp_prefix; + u32 instruction_sigp_restart; }; struct io_info { @@ -169,6 +175,10 @@ struct interrupt_info { }; }; +/* for local_interrupt.action_flags */ +#define ACTION_STORE_ON_STOP 1 +#define ACTION_STOP_ON_STOP 2 + struct local_interrupt { spinlock_t lock; struct list_head list; @@ -176,6 +186,8 @@ struct local_interrupt { struct float_interrupt *float_int; int timer_due; /* event indicator for waitqueue below */ wait_queue_head_t wq; + atomic_t *cpuflags; + unsigned int action_bits; }; struct float_interrupt { -- cgit v1.2.3-70-g09d2