aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-s390/kvm_host.h
diff options
context:
space:
mode:
authorCarsten Otte <cotte@de.ibm.com>2008-03-25 13:47:26 -0400
committerAvi Kivity <avi@qumranet.com>2008-04-27 05:00:44 -0400
commitba5c1e9b6ceebdc39343cc03eb39f077abd3c571 (patch)
treeab07e763ad7d9aad2ef189def5537e73a50c7503 /include/asm-s390/kvm_host.h
parent8f2abe6a1e525e878bdf58f68ccd146d543fde84 (diff)
KVM: s390: interrupt subsystem, cpu timer, waitpsw
This patch contains the s390 interrupt subsystem (similar to in kernel apic) including timer interrupts (similar to in-kernel-pit) and enabled wait (similar to in kernel hlt). In order to achieve that, this patch also introduces intercept handling for instruction intercepts, and it implements load control instructions. This patch introduces an ioctl KVM_S390_INTERRUPT which is valid for both the vm file descriptors and the vcpu file descriptors. In case this ioctl is issued against a vm file descriptor, the interrupt is considered floating. Floating interrupts may be delivered to any virtual cpu in the configuration. The following interrupts are supported: SIGP STOP - interprocessor signal that stops a remote cpu SIGP SET PREFIX - interprocessor signal that sets the prefix register of a (stopped) remote cpu INT EMERGENCY - interprocessor interrupt, usually used to signal need_reshed and for smp_call_function() in the guest. PROGRAM INT - exception during program execution such as page fault, illegal instruction and friends RESTART - interprocessor signal that starts a stopped cpu INT VIRTIO - floating interrupt for virtio signalisation INT SERVICE - floating interrupt for signalisations from the system service processor struct kvm_s390_interrupt, which is submitted as ioctl parameter when injecting an interrupt, also carrys parameter data for interrupts along with the interrupt type. Interrupts on s390 usually have a state that represents the current operation, or identifies which device has caused the interruption on s390. kvm_s390_handle_wait() does handle waitpsw in two flavors: in case of a disabled wait (that is, disabled for interrupts), we exit to userspace. In case of an enabled wait we set up a timer that equals the cpu clock comparator value and sleep on a wait queue. [christian: change virtio interrupt to 0x2603] Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Carsten Otte <cotte@de.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'include/asm-s390/kvm_host.h')
-rw-r--r--include/asm-s390/kvm_host.h75
1 files changed, 75 insertions, 0 deletions
diff --git a/include/asm-s390/kvm_host.h b/include/asm-s390/kvm_host.h
index 8965b38d0a32..4fe19305888a 100644
--- a/include/asm-s390/kvm_host.h
+++ b/include/asm-s390/kvm_host.h
@@ -70,6 +70,7 @@ struct sie_block {
70 __u64 ckc; /* 0x0030 */ 70 __u64 ckc; /* 0x0030 */
71 __u64 epoch; /* 0x0038 */ 71 __u64 epoch; /* 0x0038 */
72 __u8 reserved40[4]; /* 0x0040 */ 72 __u8 reserved40[4]; /* 0x0040 */
73#define LCTL_CR0 0x8000
73 __u16 lctl; /* 0x0044 */ 74 __u16 lctl; /* 0x0044 */
74 __s16 icpua; /* 0x0046 */ 75 __s16 icpua; /* 0x0046 */
75 __u32 ictl; /* 0x0048 */ 76 __u32 ictl; /* 0x0048 */
@@ -105,8 +106,79 @@ struct kvm_vcpu_stat {
105 u32 exit_external_interrupt; 106 u32 exit_external_interrupt;
106 u32 exit_stop_request; 107 u32 exit_stop_request;
107 u32 exit_validity; 108 u32 exit_validity;
109 u32 exit_instruction;
110 u32 instruction_lctl;
111 u32 instruction_lctg;
112 u32 exit_program_interruption;
113 u32 exit_instr_and_program;
114 u32 deliver_emergency_signal;
115 u32 deliver_service_signal;
116 u32 deliver_virtio_interrupt;
117 u32 deliver_stop_signal;
118 u32 deliver_prefix_signal;
119 u32 deliver_restart_signal;
120 u32 deliver_program_int;
121 u32 exit_wait_state;
108}; 122};
109 123
124struct io_info {
125 __u16 subchannel_id; /* 0x0b8 */
126 __u16 subchannel_nr; /* 0x0ba */
127 __u32 io_int_parm; /* 0x0bc */
128 __u32 io_int_word; /* 0x0c0 */
129};
130
131struct ext_info {
132 __u32 ext_params;
133 __u64 ext_params2;
134};
135
136#define PGM_OPERATION 0x01
137#define PGM_PRIVILEGED_OPERATION 0x02
138#define PGM_EXECUTE 0x03
139#define PGM_PROTECTION 0x04
140#define PGM_ADDRESSING 0x05
141#define PGM_SPECIFICATION 0x06
142#define PGM_DATA 0x07
143
144struct pgm_info {
145 __u16 code;
146};
147
148struct prefix_info {
149 __u32 address;
150};
151
152struct interrupt_info {
153 struct list_head list;
154 u64 type;
155 union {
156 struct io_info io;
157 struct ext_info ext;
158 struct pgm_info pgm;
159 struct prefix_info prefix;
160 };
161};
162
163struct local_interrupt {
164 spinlock_t lock;
165 struct list_head list;
166 atomic_t active;
167 struct float_interrupt *float_int;
168 int timer_due; /* event indicator for waitqueue below */
169 wait_queue_head_t wq;
170};
171
172struct float_interrupt {
173 spinlock_t lock;
174 struct list_head list;
175 atomic_t active;
176 int next_rr_cpu;
177 unsigned long idle_mask [(64 + sizeof(long) - 1) / sizeof(long)];
178 struct local_interrupt *local_int[64];
179};
180
181
110struct kvm_vcpu_arch { 182struct kvm_vcpu_arch {
111 struct sie_block *sie_block; 183 struct sie_block *sie_block;
112 unsigned long guest_gprs[16]; 184 unsigned long guest_gprs[16];
@@ -114,6 +186,8 @@ struct kvm_vcpu_arch {
114 unsigned int host_acrs[NUM_ACRS]; 186 unsigned int host_acrs[NUM_ACRS];
115 s390_fp_regs guest_fpregs; 187 s390_fp_regs guest_fpregs;
116 unsigned int guest_acrs[NUM_ACRS]; 188 unsigned int guest_acrs[NUM_ACRS];
189 struct local_interrupt local_int;
190 struct timer_list ckc_timer;
117}; 191};
118 192
119struct kvm_vm_stat { 193struct kvm_vm_stat {
@@ -125,6 +199,7 @@ struct kvm_arch{
125 unsigned long guest_memsize; 199 unsigned long guest_memsize;
126 struct sca_block *sca; 200 struct sca_block *sca;
127 debug_info_t *dbf; 201 debug_info_t *dbf;
202 struct float_interrupt float_int;
128}; 203};
129 204
130extern int sie64a(struct sie_block *, __u64 *); 205extern int sie64a(struct sie_block *, __u64 *);