sigp.c 11.2 KB
Newer Older
1
/*
2
 * handling interprocessor communication
3
 *
4
 * Copyright IBM Corp. 2008, 2009
5 6 7 8 9 10 11
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License (version 2 only)
 * as published by the Free Software Foundation.
 *
 *    Author(s): Carsten Otte <cotte@de.ibm.com>
 *               Christian Borntraeger <borntraeger@de.ibm.com>
12
 *               Christian Ehrhardt <ehrhardt@de.ibm.com>
13 14 15 16
 */

#include <linux/kvm.h>
#include <linux/kvm_host.h>
17
#include <linux/slab.h>
18
#include <asm/sigp.h>
19 20
#include "gaccess.h"
#include "kvm-s390.h"
21
#include "trace.h"
22

23
static int __sigp_sense(struct kvm_vcpu *vcpu, u16 cpu_addr,
24
			u64 *reg)
25
{
26
	struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
27 28 29
	int rc;

	if (cpu_addr >= KVM_MAX_VCPUS)
30
		return SIGP_CC_NOT_OPERATIONAL;
31

32
	spin_lock(&fi->lock);
33
	if (fi->local_int[cpu_addr] == NULL)
34
		rc = SIGP_CC_NOT_OPERATIONAL;
35
	else if (!(atomic_read(fi->local_int[cpu_addr]->cpuflags)
36 37 38
		   & (CPUSTAT_ECALL_PEND | CPUSTAT_STOPPED)))
		rc = SIGP_CC_ORDER_CODE_ACCEPTED;
	else {
39
		*reg &= 0xffffffff00000000UL;
40 41 42 43 44 45
		if (atomic_read(fi->local_int[cpu_addr]->cpuflags)
		    & CPUSTAT_ECALL_PEND)
			*reg |= SIGP_STATUS_EXT_CALL_PENDING;
		if (atomic_read(fi->local_int[cpu_addr]->cpuflags)
		    & CPUSTAT_STOPPED)
			*reg |= SIGP_STATUS_STOPPED;
46
		rc = SIGP_CC_STATUS_STORED;
47
	}
48
	spin_unlock(&fi->lock);
49 50 51 52 53 54 55

	VCPU_EVENT(vcpu, 4, "sensed status of cpu %x rc %x", cpu_addr, rc);
	return rc;
}

static int __sigp_emergency(struct kvm_vcpu *vcpu, u16 cpu_addr)
{
56 57 58
	struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
	struct kvm_s390_local_interrupt *li;
	struct kvm_s390_interrupt_info *inti;
59 60 61
	int rc;

	if (cpu_addr >= KVM_MAX_VCPUS)
62
		return SIGP_CC_NOT_OPERATIONAL;
63 64 65 66 67 68

	inti = kzalloc(sizeof(*inti), GFP_KERNEL);
	if (!inti)
		return -ENOMEM;

	inti->type = KVM_S390_INT_EMERGENCY;
69
	inti->emerg.code = vcpu->vcpu_id;
70

71
	spin_lock(&fi->lock);
72 73
	li = fi->local_int[cpu_addr];
	if (li == NULL) {
74
		rc = SIGP_CC_NOT_OPERATIONAL;
75 76 77 78 79 80 81
		kfree(inti);
		goto unlock;
	}
	spin_lock_bh(&li->lock);
	list_add_tail(&inti->list, &li->list);
	atomic_set(&li->active, 1);
	atomic_set_mask(CPUSTAT_EXT_INT, li->cpuflags);
82 83
	if (waitqueue_active(li->wq))
		wake_up_interruptible(li->wq);
84
	spin_unlock_bh(&li->lock);
85
	rc = SIGP_CC_ORDER_CODE_ACCEPTED;
86 87 88 89 90 91 92 93 94 95 96 97 98 99
	VCPU_EVENT(vcpu, 4, "sent sigp emerg to cpu %x", cpu_addr);
unlock:
	spin_unlock(&fi->lock);
	return rc;
}

static int __sigp_external_call(struct kvm_vcpu *vcpu, u16 cpu_addr)
{
	struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
	struct kvm_s390_local_interrupt *li;
	struct kvm_s390_interrupt_info *inti;
	int rc;

	if (cpu_addr >= KVM_MAX_VCPUS)
100
		return SIGP_CC_NOT_OPERATIONAL;
101 102 103 104 105 106 107 108 109 110 111

	inti = kzalloc(sizeof(*inti), GFP_KERNEL);
	if (!inti)
		return -ENOMEM;

	inti->type = KVM_S390_INT_EXTERNAL_CALL;
	inti->extcall.code = vcpu->vcpu_id;

	spin_lock(&fi->lock);
	li = fi->local_int[cpu_addr];
	if (li == NULL) {
112
		rc = SIGP_CC_NOT_OPERATIONAL;
113 114 115 116 117 118 119
		kfree(inti);
		goto unlock;
	}
	spin_lock_bh(&li->lock);
	list_add_tail(&inti->list, &li->list);
	atomic_set(&li->active, 1);
	atomic_set_mask(CPUSTAT_EXT_INT, li->cpuflags);
120 121
	if (waitqueue_active(li->wq))
		wake_up_interruptible(li->wq);
122
	spin_unlock_bh(&li->lock);
123
	rc = SIGP_CC_ORDER_CODE_ACCEPTED;
124
	VCPU_EVENT(vcpu, 4, "sent sigp ext call to cpu %x", cpu_addr);
125
unlock:
126
	spin_unlock(&fi->lock);
127 128 129
	return rc;
}

130
static int __inject_sigp_stop(struct kvm_s390_local_interrupt *li, int action)
131
{
132
	struct kvm_s390_interrupt_info *inti;
133
	int rc = SIGP_CC_ORDER_CODE_ACCEPTED;
134

135
	inti = kzalloc(sizeof(*inti), GFP_ATOMIC);
136 137 138 139 140
	if (!inti)
		return -ENOMEM;
	inti->type = KVM_S390_SIGP_STOP;

	spin_lock_bh(&li->lock);
141 142
	if ((atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) {
		kfree(inti);
143 144
		if ((action & ACTION_STORE_ON_STOP) != 0)
			rc = -ESHUTDOWN;
145
		goto out;
146
	}
147 148 149
	list_add_tail(&inti->list, &li->list);
	atomic_set(&li->active, 1);
	atomic_set_mask(CPUSTAT_STOP_INT, li->cpuflags);
150
	li->action_bits |= action;
151 152
	if (waitqueue_active(li->wq))
		wake_up_interruptible(li->wq);
153
out:
154
	spin_unlock_bh(&li->lock);
155

156
	return rc;
157 158 159 160 161 162 163 164 165
}

static int __sigp_stop(struct kvm_vcpu *vcpu, u16 cpu_addr, int action)
{
	struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
	struct kvm_s390_local_interrupt *li;
	int rc;

	if (cpu_addr >= KVM_MAX_VCPUS)
166
		return SIGP_CC_NOT_OPERATIONAL;
167 168 169 170

	spin_lock(&fi->lock);
	li = fi->local_int[cpu_addr];
	if (li == NULL) {
171
		rc = SIGP_CC_NOT_OPERATIONAL;
172 173 174 175 176
		goto unlock;
	}

	rc = __inject_sigp_stop(li, action);

177
unlock:
178
	spin_unlock(&fi->lock);
179
	VCPU_EVENT(vcpu, 4, "sent sigp stop to cpu %x", cpu_addr);
180 181 182 183 184 185 186 187 188 189

	if ((action & ACTION_STORE_ON_STOP) != 0 && rc == -ESHUTDOWN) {
		/* If the CPU has already been stopped, we still have
		 * to save the status when doing stop-and-store. This
		 * has to be done after unlocking all spinlocks. */
		struct kvm_vcpu *dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr);
		rc = kvm_s390_store_status_unloaded(dst_vcpu,
						KVM_S390_STORE_STATUS_NOADDR);
	}

190 191 192
	return rc;
}

193 194 195 196 197 198
int kvm_s390_inject_sigp_stop(struct kvm_vcpu *vcpu, int action)
{
	struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
	return __inject_sigp_stop(li, action);
}

199 200 201 202 203 204
static int __sigp_set_arch(struct kvm_vcpu *vcpu, u32 parameter)
{
	int rc;

	switch (parameter & 0xff) {
	case 0:
205
		rc = SIGP_CC_NOT_OPERATIONAL;
206 207 208
		break;
	case 1:
	case 2:
209
		rc = SIGP_CC_ORDER_CODE_ACCEPTED;
210 211
		break;
	default:
212
		rc = -EOPNOTSUPP;
213 214 215 216 217
	}
	return rc;
}

static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address,
218
			     u64 *reg)
219
{
220
	struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
R
Roel Kluin 已提交
221
	struct kvm_s390_local_interrupt *li = NULL;
222
	struct kvm_s390_interrupt_info *inti;
223 224 225 226 227
	int rc;
	u8 tmp;

	/* make sure that the new value is valid memory */
	address = address & 0x7fffe000u;
228 229
	if (copy_from_guest_absolute(vcpu, &tmp, address, 1) ||
	   copy_from_guest_absolute(vcpu, &tmp, address + PAGE_SIZE, 1)) {
230
		*reg &= 0xffffffff00000000UL;
231
		*reg |= SIGP_STATUS_INVALID_PARAMETER;
232
		return SIGP_CC_STATUS_STORED;
233 234 235 236
	}

	inti = kzalloc(sizeof(*inti), GFP_KERNEL);
	if (!inti)
237
		return SIGP_CC_BUSY;
238

239
	spin_lock(&fi->lock);
R
Roel Kluin 已提交
240 241
	if (cpu_addr < KVM_MAX_VCPUS)
		li = fi->local_int[cpu_addr];
242

R
Roel Kluin 已提交
243
	if (li == NULL) {
244 245
		*reg &= 0xffffffff00000000UL;
		*reg |= SIGP_STATUS_INCORRECT_STATE;
246
		rc = SIGP_CC_STATUS_STORED;
247 248 249 250 251 252
		kfree(inti);
		goto out_fi;
	}

	spin_lock_bh(&li->lock);
	/* cpu must be in stopped state */
253
	if (!(atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) {
254 255
		*reg &= 0xffffffff00000000UL;
		*reg |= SIGP_STATUS_INCORRECT_STATE;
256
		rc = SIGP_CC_STATUS_STORED;
257 258 259 260 261 262 263 264 265
		kfree(inti);
		goto out_li;
	}

	inti->type = KVM_S390_SIGP_SET_PREFIX;
	inti->prefix.address = address;

	list_add_tail(&inti->list, &li->list);
	atomic_set(&li->active, 1);
266 267
	if (waitqueue_active(li->wq))
		wake_up_interruptible(li->wq);
268
	rc = SIGP_CC_ORDER_CODE_ACCEPTED;
269 270 271 272 273

	VCPU_EVENT(vcpu, 4, "set prefix of cpu %02x to %x", cpu_addr, address);
out_li:
	spin_unlock_bh(&li->lock);
out_fi:
274
	spin_unlock(&fi->lock);
275 276 277
	return rc;
}

278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
static int __sigp_store_status_at_addr(struct kvm_vcpu *vcpu, u16 cpu_id,
					u32 addr, u64 *reg)
{
	struct kvm_vcpu *dst_vcpu = NULL;
	int flags;
	int rc;

	if (cpu_id < KVM_MAX_VCPUS)
		dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_id);
	if (!dst_vcpu)
		return SIGP_CC_NOT_OPERATIONAL;

	spin_lock_bh(&dst_vcpu->arch.local_int.lock);
	flags = atomic_read(dst_vcpu->arch.local_int.cpuflags);
	spin_unlock_bh(&dst_vcpu->arch.local_int.lock);
	if (!(flags & CPUSTAT_STOPPED)) {
		*reg &= 0xffffffff00000000UL;
		*reg |= SIGP_STATUS_INCORRECT_STATE;
		return SIGP_CC_STATUS_STORED;
	}

	addr &= 0x7ffffe00;
	rc = kvm_s390_store_status_unloaded(dst_vcpu, addr);
	if (rc == -EFAULT) {
		*reg &= 0xffffffff00000000UL;
		*reg |= SIGP_STATUS_INVALID_PARAMETER;
		rc = SIGP_CC_STATUS_STORED;
	}
	return rc;
}

309
static int __sigp_sense_running(struct kvm_vcpu *vcpu, u16 cpu_addr,
310
				u64 *reg)
311 312 313 314 315
{
	int rc;
	struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;

	if (cpu_addr >= KVM_MAX_VCPUS)
316
		return SIGP_CC_NOT_OPERATIONAL;
317 318 319

	spin_lock(&fi->lock);
	if (fi->local_int[cpu_addr] == NULL)
320
		rc = SIGP_CC_NOT_OPERATIONAL;
321 322 323 324
	else {
		if (atomic_read(fi->local_int[cpu_addr]->cpuflags)
		    & CPUSTAT_RUNNING) {
			/* running */
325
			rc = SIGP_CC_ORDER_CODE_ACCEPTED;
326 327 328
		} else {
			/* not running */
			*reg &= 0xffffffff00000000UL;
329
			*reg |= SIGP_STATUS_NOT_RUNNING;
330
			rc = SIGP_CC_STATUS_STORED;
331 332 333 334 335 336 337 338 339 340
		}
	}
	spin_unlock(&fi->lock);

	VCPU_EVENT(vcpu, 4, "sensed running status of cpu %x rc %x", cpu_addr,
		   rc);

	return rc;
}

341 342 343 344
static int __sigp_restart(struct kvm_vcpu *vcpu, u16 cpu_addr)
{
	struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
	struct kvm_s390_local_interrupt *li;
345
	int rc = SIGP_CC_ORDER_CODE_ACCEPTED;
346 347

	if (cpu_addr >= KVM_MAX_VCPUS)
348
		return SIGP_CC_NOT_OPERATIONAL;
349 350 351 352

	spin_lock(&fi->lock);
	li = fi->local_int[cpu_addr];
	if (li == NULL) {
353
		rc = SIGP_CC_NOT_OPERATIONAL;
354 355 356 357 358
		goto out;
	}

	spin_lock_bh(&li->lock);
	if (li->action_bits & ACTION_STOP_ON_STOP)
359
		rc = SIGP_CC_BUSY;
360 361 362 363 364 365 366 367 368
	else
		VCPU_EVENT(vcpu, 4, "sigp restart %x to handle userspace",
			cpu_addr);
	spin_unlock_bh(&li->lock);
out:
	spin_unlock(&fi->lock);
	return rc;
}

369 370 371 372 373
int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu)
{
	int r1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4;
	int r3 = vcpu->arch.sie_block->ipa & 0x000f;
	u32 parameter;
374
	u16 cpu_addr = vcpu->run->s.regs.gprs[r3];
375 376 377
	u8 order_code;
	int rc;

378 379
	/* sigp in userspace can exit */
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
380
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
381

382
	order_code = kvm_s390_get_base_disp_rs(vcpu);
383 384

	if (r1 % 2)
385
		parameter = vcpu->run->s.regs.gprs[r1];
386
	else
387
		parameter = vcpu->run->s.regs.gprs[r1 + 1];
388

389
	trace_kvm_s390_handle_sigp(vcpu, order_code, cpu_addr, parameter);
390 391 392 393
	switch (order_code) {
	case SIGP_SENSE:
		vcpu->stat.instruction_sigp_sense++;
		rc = __sigp_sense(vcpu, cpu_addr,
394
				  &vcpu->run->s.regs.gprs[r1]);
395
		break;
396 397 398 399
	case SIGP_EXTERNAL_CALL:
		vcpu->stat.instruction_sigp_external_call++;
		rc = __sigp_external_call(vcpu, cpu_addr);
		break;
400
	case SIGP_EMERGENCY_SIGNAL:
401 402 403 404 405
		vcpu->stat.instruction_sigp_emergency++;
		rc = __sigp_emergency(vcpu, cpu_addr);
		break;
	case SIGP_STOP:
		vcpu->stat.instruction_sigp_stop++;
406
		rc = __sigp_stop(vcpu, cpu_addr, ACTION_STOP_ON_STOP);
407
		break;
408
	case SIGP_STOP_AND_STORE_STATUS:
409
		vcpu->stat.instruction_sigp_stop++;
410 411
		rc = __sigp_stop(vcpu, cpu_addr, ACTION_STORE_ON_STOP |
						 ACTION_STOP_ON_STOP);
412
		break;
413 414 415 416
	case SIGP_STORE_STATUS_AT_ADDRESS:
		rc = __sigp_store_status_at_addr(vcpu, cpu_addr, parameter,
						 &vcpu->run->s.regs.gprs[r1]);
		break;
417
	case SIGP_SET_ARCHITECTURE:
418 419 420 421 422 423
		vcpu->stat.instruction_sigp_arch++;
		rc = __sigp_set_arch(vcpu, parameter);
		break;
	case SIGP_SET_PREFIX:
		vcpu->stat.instruction_sigp_prefix++;
		rc = __sigp_set_prefix(vcpu, cpu_addr, parameter,
424
				       &vcpu->run->s.regs.gprs[r1]);
425
		break;
426 427 428
	case SIGP_SENSE_RUNNING:
		vcpu->stat.instruction_sigp_sense_running++;
		rc = __sigp_sense_running(vcpu, cpu_addr,
429
					  &vcpu->run->s.regs.gprs[r1]);
430
		break;
431 432
	case SIGP_RESTART:
		vcpu->stat.instruction_sigp_restart++;
433
		rc = __sigp_restart(vcpu, cpu_addr);
434
		if (rc == SIGP_CC_BUSY)
435
			break;
436 437
		/* user space must know about restart */
	default:
438
		return -EOPNOTSUPP;
439 440 441 442 443 444 445 446 447
	}

	if (rc < 0)
		return rc;

	vcpu->arch.sie_block->gpsw.mask &= ~(3ul << 44);
	vcpu->arch.sie_block->gpsw.mask |= (rc & 3ul) << 44;
	return 0;
}