kvm.c 23.7 KB
Newer Older
A
Alexander Graf 已提交
1 2 3 4
/*
 * QEMU S390x KVM implementation
 *
 * Copyright (c) 2009 Alexander Graf <agraf@suse.de>
5
 * Copyright IBM Corp. 2012
A
Alexander Graf 已提交
6 7 8 9 10 11 12 13 14 15 16
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
17 18 19 20
 * Contributions after 2012-10-29 are licensed under the terms of the
 * GNU GPL, version 2 or (at your option) any later version.
 *
 * You should have received a copy of the GNU (Lesser) General Public
A
Alexander Graf 已提交
21 22 23 24 25 26 27 28 29 30 31
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */

#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/mman.h>

#include <linux/kvm.h>
#include <asm/ptrace.h>

#include "qemu-common.h"
32
#include "qemu/timer.h"
33 34
#include "sysemu/sysemu.h"
#include "sysemu/kvm.h"
A
Alexander Graf 已提交
35
#include "cpu.h"
36
#include "sysemu/device_tree.h"
37 38
#include "qapi/qmp/qjson.h"
#include "monitor/monitor.h"
A
Alexander Graf 已提交
39 40 41 42

/* #define DEBUG_KVM */

#ifdef DEBUG_KVM
43
#define DPRINTF(fmt, ...) \
A
Alexander Graf 已提交
44 45
    do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
#else
46
#define DPRINTF(fmt, ...) \
A
Alexander Graf 已提交
47 48 49 50 51
    do { } while (0)
#endif

#define IPA0_DIAG                       0x8300
#define IPA0_SIGP                       0xae00
52 53 54
#define IPA0_B2                         0xb200
#define IPA0_B9                         0xb900
#define IPA0_EB                         0xeb00
A
Alexander Graf 已提交
55 56

#define PRIV_SCLP_CALL                  0x20
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
#define PRIV_CSCH                       0x30
#define PRIV_HSCH                       0x31
#define PRIV_MSCH                       0x32
#define PRIV_SSCH                       0x33
#define PRIV_STSCH                      0x34
#define PRIV_TSCH                       0x35
#define PRIV_TPI                        0x36
#define PRIV_SAL                        0x37
#define PRIV_RSCH                       0x38
#define PRIV_STCRW                      0x39
#define PRIV_STCPS                      0x3a
#define PRIV_RCHP                       0x3b
#define PRIV_SCHM                       0x3c
#define PRIV_CHSC                       0x5f
#define PRIV_SIGA                       0x74
#define PRIV_XSCH                       0x76
#define PRIV_SQBS                       0x8a
#define PRIV_EQBS                       0x9c
75
#define DIAG_IPL                        0x308
A
Alexander Graf 已提交
76 77 78 79 80 81 82 83 84
#define DIAG_KVM_HYPERCALL              0x500
#define DIAG_KVM_BREAKPOINT             0x501

#define ICPT_INSTRUCTION                0x04
#define ICPT_WAITPSW                    0x1c
#define ICPT_SOFT_INTERCEPT             0x24
#define ICPT_CPU_STOP                   0x28
#define ICPT_IO                         0x40

85 86 87 88
const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
    KVM_CAP_LAST_INFO
};

89 90
static int cap_sync_regs;

91
static void *legacy_s390_alloc(size_t size);
92

93
int kvm_arch_init(KVMState *s)
A
Alexander Graf 已提交
94
{
95
    cap_sync_regs = kvm_check_extension(s, KVM_CAP_SYNC_REGS);
96 97 98 99
    if (!kvm_check_extension(s, KVM_CAP_S390_GMAP)
        || !kvm_check_extension(s, KVM_CAP_S390_COW)) {
        phys_mem_set_alloc(legacy_s390_alloc);
    }
A
Alexander Graf 已提交
100 101 102
    return 0;
}

103 104 105 106 107
unsigned long kvm_arch_vcpu_id(CPUState *cpu)
{
    return cpu->cpu_index;
}

A
Andreas Färber 已提交
108
int kvm_arch_init_vcpu(CPUState *cpu)
A
Alexander Graf 已提交
109
{
110 111
    /* nothing todo yet */
    return 0;
A
Alexander Graf 已提交
112 113
}

A
Andreas Färber 已提交
114
void kvm_arch_reset_vcpu(CPUState *cpu)
A
Alexander Graf 已提交
115
{
A
Alexander Graf 已提交
116 117 118 119 120
    /* The initial reset call is needed here to reset in-kernel
     * vcpu data that we can't access directly from QEMU
     * (i.e. with older kernels which don't support sync_regs/ONE_REG).
     * Before this ioctl cpu_synchronize_state() is called in common kvm
     * code (kvm-all) */
J
Jens Freimann 已提交
121 122 123
    if (kvm_vcpu_ioctl(cpu, KVM_S390_INITIAL_RESET, NULL)) {
        perror("Can't reset vcpu\n");
    }
A
Alexander Graf 已提交
124 125
}

A
Andreas Färber 已提交
126
int kvm_arch_put_registers(CPUState *cs, int level)
A
Alexander Graf 已提交
127
{
A
Andreas Färber 已提交
128 129
    S390CPU *cpu = S390_CPU(cs);
    CPUS390XState *env = &cpu->env;
130
    struct kvm_one_reg reg;
131
    struct kvm_sregs sregs;
A
Alexander Graf 已提交
132 133 134 135
    struct kvm_regs regs;
    int ret;
    int i;

136
    /* always save the PSW  and the GPRS*/
A
Andreas Färber 已提交
137 138
    cs->kvm_run->psw_addr = env->psw.addr;
    cs->kvm_run->psw_mask = env->psw.mask;
A
Alexander Graf 已提交
139

A
Andreas Färber 已提交
140
    if (cap_sync_regs && cs->kvm_run->kvm_valid_regs & KVM_SYNC_GPRS) {
141
        for (i = 0; i < 16; i++) {
A
Andreas Färber 已提交
142 143
            cs->kvm_run->s.regs.gprs[i] = env->regs[i];
            cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_GPRS;
144 145 146 147 148
        }
    } else {
        for (i = 0; i < 16; i++) {
            regs.gprs[i] = env->regs[i];
        }
149
        ret = kvm_vcpu_ioctl(cs, KVM_SET_REGS, &regs);
150 151 152
        if (ret < 0) {
            return ret;
        }
A
Alexander Graf 已提交
153 154
    }

155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
    if (env->runtime_reg_dirty_mask == KVM_S390_RUNTIME_DIRTY_FULL) {
        reg.id = KVM_REG_S390_CPU_TIMER;
        reg.addr = (__u64)&(env->cputm);
        ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
        if (ret < 0) {
            return ret;
        }

        reg.id = KVM_REG_S390_CLOCK_COMP;
        reg.addr = (__u64)&(env->ckc);
        ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
        if (ret < 0) {
            return ret;
        }

        reg.id = KVM_REG_S390_TODPR;
        reg.addr = (__u64)&(env->todpr);
        ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
        if (ret < 0) {
            return ret;
        }
    }
    env->runtime_reg_dirty_mask = KVM_S390_RUNTIME_DIRTY_NONE;

179 180 181
    /* Do we need to save more than that? */
    if (level == KVM_PUT_RUNTIME_STATE) {
        return 0;
A
Alexander Graf 已提交
182 183
    }

184
    if (cap_sync_regs &&
A
Andreas Färber 已提交
185 186
        cs->kvm_run->kvm_valid_regs & KVM_SYNC_ACRS &&
        cs->kvm_run->kvm_valid_regs & KVM_SYNC_CRS) {
187
        for (i = 0; i < 16; i++) {
A
Andreas Färber 已提交
188 189
            cs->kvm_run->s.regs.acrs[i] = env->aregs[i];
            cs->kvm_run->s.regs.crs[i] = env->cregs[i];
190
        }
A
Andreas Färber 已提交
191 192
        cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_ACRS;
        cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_CRS;
193 194 195 196 197
    } else {
        for (i = 0; i < 16; i++) {
            sregs.acrs[i] = env->aregs[i];
            sregs.crs[i] = env->cregs[i];
        }
198
        ret = kvm_vcpu_ioctl(cs, KVM_SET_SREGS, &sregs);
199 200 201 202
        if (ret < 0) {
            return ret;
        }
    }
A
Alexander Graf 已提交
203

204
    /* Finally the prefix */
A
Andreas Färber 已提交
205 206 207
    if (cap_sync_regs && cs->kvm_run->kvm_valid_regs & KVM_SYNC_PREFIX) {
        cs->kvm_run->s.regs.prefix = env->psa;
        cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_PREFIX;
208 209 210 211
    } else {
        /* prefix is only supported via sync regs */
    }
    return 0;
A
Alexander Graf 已提交
212 213
}

A
Andreas Färber 已提交
214
int kvm_arch_get_registers(CPUState *cs)
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
{
    S390CPU *cpu = S390_CPU(cs);
    CPUS390XState *env = &cpu->env;
    struct kvm_one_reg reg;
    int r;

    r = kvm_s390_get_registers_partial(cs);
    if (r < 0) {
        return r;
    }

    reg.id = KVM_REG_S390_CPU_TIMER;
    reg.addr = (__u64)&(env->cputm);
    r = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
    if (r < 0) {
        return r;
    }

    reg.id = KVM_REG_S390_CLOCK_COMP;
    reg.addr = (__u64)&(env->ckc);
    r = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
    if (r < 0) {
        return r;
    }

    reg.id = KVM_REG_S390_TODPR;
    reg.addr = (__u64)&(env->todpr);
    r = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
    if (r < 0) {
        return r;
    }

    env->runtime_reg_dirty_mask = KVM_S390_RUNTIME_DIRTY_FULL;
    return 0;
}

int kvm_s390_get_registers_partial(CPUState *cs)
A
Alexander Graf 已提交
252
{
A
Andreas Färber 已提交
253 254
    S390CPU *cpu = S390_CPU(cs);
    CPUS390XState *env = &cpu->env;
255
    struct kvm_sregs sregs;
A
Alexander Graf 已提交
256
    struct kvm_regs regs;
257
    int ret;
A
Alexander Graf 已提交
258 259
    int i;

260 261 262 263
    if (env->runtime_reg_dirty_mask) {
        return 0;
    }

264
    /* get the PSW */
A
Andreas Färber 已提交
265 266
    env->psw.addr = cs->kvm_run->psw_addr;
    env->psw.mask = cs->kvm_run->psw_mask;
267 268

    /* the GPRS */
A
Andreas Färber 已提交
269
    if (cap_sync_regs && cs->kvm_run->kvm_valid_regs & KVM_SYNC_GPRS) {
270
        for (i = 0; i < 16; i++) {
A
Andreas Färber 已提交
271
            env->regs[i] = cs->kvm_run->s.regs.gprs[i];
272 273
        }
    } else {
274
        ret = kvm_vcpu_ioctl(cs, KVM_GET_REGS, &regs);
275 276 277 278 279 280
        if (ret < 0) {
            return ret;
        }
         for (i = 0; i < 16; i++) {
            env->regs[i] = regs.gprs[i];
        }
A
Alexander Graf 已提交
281 282
    }

283 284
    /* The ACRS and CRS */
    if (cap_sync_regs &&
A
Andreas Färber 已提交
285 286
        cs->kvm_run->kvm_valid_regs & KVM_SYNC_ACRS &&
        cs->kvm_run->kvm_valid_regs & KVM_SYNC_CRS) {
287
        for (i = 0; i < 16; i++) {
A
Andreas Färber 已提交
288 289
            env->aregs[i] = cs->kvm_run->s.regs.acrs[i];
            env->cregs[i] = cs->kvm_run->s.regs.crs[i];
290 291
        }
    } else {
292
        ret = kvm_vcpu_ioctl(cs, KVM_GET_SREGS, &sregs);
293 294 295 296 297 298 299
        if (ret < 0) {
            return ret;
        }
         for (i = 0; i < 16; i++) {
            env->aregs[i] = sregs.acrs[i];
            env->cregs[i] = sregs.crs[i];
        }
A
Alexander Graf 已提交
300 301
    }

302
    /* Finally the prefix */
A
Andreas Färber 已提交
303 304
    if (cap_sync_regs && cs->kvm_run->kvm_valid_regs & KVM_SYNC_PREFIX) {
        env->psa = cs->kvm_run->s.regs.prefix;
305 306 307
    } else {
        /* no prefix without sync regs */
    }
A
Alexander Graf 已提交
308

309
    env->runtime_reg_dirty_mask = KVM_S390_RUNTIME_DIRTY_PARTIAL;
A
Alexander Graf 已提交
310 311 312
    return 0;
}

313 314 315 316 317 318 319 320 321 322
/*
 * Legacy layout for s390:
 * Older S390 KVM requires the topmost vma of the RAM to be
 * smaller than an system defined value, which is at least 256GB.
 * Larger systems have larger values. We put the guest between
 * the end of data segment (system break) and this value. We
 * use 32GB as a base to have enough room for the system break
 * to grow. We also have to use MAP parameters that avoid
 * read-only mapping of guest pages.
 */
323
static void *legacy_s390_alloc(size_t size)
324 325 326 327 328 329
{
    void *mem;

    mem = mmap((void *) 0x800000000ULL, size,
               PROT_EXEC|PROT_READ|PROT_WRITE,
               MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
330
    return mem == MAP_FAILED ? NULL : mem;
331 332
}

A
Andreas Färber 已提交
333
int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
A
Alexander Graf 已提交
334 335 336
{
    static const uint8_t diag_501[] = {0x83, 0x24, 0x05, 0x01};

337 338
    if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 0) ||
        cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)diag_501, 4, 1)) {
A
Alexander Graf 已提交
339 340 341 342 343
        return -EINVAL;
    }
    return 0;
}

A
Andreas Färber 已提交
344
int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
A
Alexander Graf 已提交
345 346 347 348
{
    uint8_t t[4];
    static const uint8_t diag_501[] = {0x83, 0x24, 0x05, 0x01};

349
    if (cpu_memory_rw_debug(cs, bp->pc, t, 4, 0)) {
A
Alexander Graf 已提交
350 351 352
        return -EINVAL;
    } else if (memcmp(t, diag_501, 4)) {
        return -EINVAL;
353
    } else if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 1, 1)) {
A
Alexander Graf 已提交
354 355 356 357 358 359
        return -EINVAL;
    }

    return 0;
}

A
Andreas Färber 已提交
360
void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run)
A
Alexander Graf 已提交
361 362 363
{
}

A
Andreas Färber 已提交
364
void kvm_arch_post_run(CPUState *cpu, struct kvm_run *run)
A
Alexander Graf 已提交
365 366 367
{
}

A
Andreas Färber 已提交
368
int kvm_arch_process_async_events(CPUState *cs)
M
Marcelo Tosatti 已提交
369
{
370
    return cs->halted;
M
Marcelo Tosatti 已提交
371 372
}

373
void kvm_s390_interrupt_internal(S390CPU *cpu, int type, uint32_t parm,
374
                                 uint64_t parm64, int vm)
A
Alexander Graf 已提交
375
{
376
    CPUState *cs = CPU(cpu);
A
Alexander Graf 已提交
377 378 379
    struct kvm_s390_interrupt kvmint;
    int r;

380
    if (!cs->kvm_state) {
A
Alexander Graf 已提交
381 382 383 384 385 386 387 388
        return;
    }

    kvmint.type = type;
    kvmint.parm = parm;
    kvmint.parm64 = parm64;

    if (vm) {
389
        r = kvm_vm_ioctl(cs->kvm_state, KVM_S390_INTERRUPT, &kvmint);
A
Alexander Graf 已提交
390
    } else {
391
        r = kvm_vcpu_ioctl(cs, KVM_S390_INTERRUPT, &kvmint);
A
Alexander Graf 已提交
392 393 394 395 396 397 398 399
    }

    if (r < 0) {
        fprintf(stderr, "KVM failed to inject interrupt\n");
        exit(1);
    }
}

400
void kvm_s390_virtio_irq(S390CPU *cpu, int config_change, uint64_t token)
A
Alexander Graf 已提交
401
{
402
    kvm_s390_interrupt_internal(cpu, KVM_S390_INT_VIRTIO, config_change,
A
Alexander Graf 已提交
403 404 405
                                token, 1);
}

406
void kvm_s390_interrupt(S390CPU *cpu, int type, uint32_t code)
A
Alexander Graf 已提交
407
{
408
    kvm_s390_interrupt_internal(cpu, type, code, 0, 0);
A
Alexander Graf 已提交
409 410
}

411
static void enter_pgmcheck(S390CPU *cpu, uint16_t code)
A
Alexander Graf 已提交
412
{
413
    kvm_s390_interrupt(cpu, KVM_S390_PROGRAM_INT, code);
A
Alexander Graf 已提交
414 415
}

416
static int kvm_sclp_service_call(S390CPU *cpu, struct kvm_run *run,
417
                                 uint16_t ipbh0)
A
Alexander Graf 已提交
418
{
419
    CPUS390XState *env = &cpu->env;
A
Alexander Graf 已提交
420 421 422 423
    uint32_t sccb;
    uint64_t code;
    int r = 0;

424
    cpu_synchronize_state(CPU(cpu));
425 426 427 428
    if (env->psw.mask & PSW_MASK_PSTATE) {
        enter_pgmcheck(cpu, PGM_PRIVILEGED);
        return 0;
    }
A
Alexander Graf 已提交
429 430 431
    sccb = env->regs[ipbh0 & 0xf];
    code = env->regs[(ipbh0 & 0xf0) >> 4];

H
Heinz Graalfs 已提交
432
    r = sclp_service_call(sccb, code);
433
    if (r < 0) {
434
        enter_pgmcheck(cpu, -r);
A
Alexander Graf 已提交
435
    }
A
Andreas Färber 已提交
436
    setcc(cpu, r);
A
Alexander Graf 已提交
437

A
Alexander Graf 已提交
438 439 440
    return 0;
}

441 442 443 444
static int kvm_handle_css_inst(S390CPU *cpu, struct kvm_run *run,
                               uint8_t ipa0, uint8_t ipa1, uint8_t ipb)
{
    CPUS390XState *env = &cpu->env;
445
    CPUState *cs = CPU(cpu);
446 447 448 449 450

    if (ipa0 != 0xb2) {
        /* Not handled for now. */
        return -1;
    }
451 452 453 454

    kvm_s390_get_registers_partial(cs);
    cs->kvm_vcpu_dirty = true;

455 456
    switch (ipa1) {
    case PRIV_XSCH:
457
        ioinst_handle_xsch(cpu, env->regs[1]);
458 459
        break;
    case PRIV_CSCH:
460
        ioinst_handle_csch(cpu, env->regs[1]);
461 462
        break;
    case PRIV_HSCH:
463
        ioinst_handle_hsch(cpu, env->regs[1]);
464 465
        break;
    case PRIV_MSCH:
466
        ioinst_handle_msch(cpu, env->regs[1], run->s390_sieic.ipb);
467 468
        break;
    case PRIV_SSCH:
469
        ioinst_handle_ssch(cpu, env->regs[1], run->s390_sieic.ipb);
470 471
        break;
    case PRIV_STCRW:
472
        ioinst_handle_stcrw(cpu, run->s390_sieic.ipb);
473 474
        break;
    case PRIV_STSCH:
475
        ioinst_handle_stsch(cpu, env->regs[1], run->s390_sieic.ipb);
476 477 478 479 480 481
        break;
    case PRIV_TSCH:
        /* We should only get tsch via KVM_EXIT_S390_TSCH. */
        fprintf(stderr, "Spurious tsch intercept\n");
        break;
    case PRIV_CHSC:
482
        ioinst_handle_chsc(cpu, run->s390_sieic.ipb);
483 484 485 486 487 488
        break;
    case PRIV_TPI:
        /* This should have been handled by kvm already. */
        fprintf(stderr, "Spurious tpi intercept\n");
        break;
    case PRIV_SCHM:
489 490
        ioinst_handle_schm(cpu, env->regs[1], env->regs[2],
                           run->s390_sieic.ipb);
491 492
        break;
    case PRIV_RSCH:
493
        ioinst_handle_rsch(cpu, env->regs[1]);
494 495
        break;
    case PRIV_RCHP:
496
        ioinst_handle_rchp(cpu, env->regs[1]);
497 498 499 500 501
        break;
    case PRIV_STCPS:
        /* We do not provide this instruction, it is suppressed. */
        break;
    case PRIV_SAL:
502
        ioinst_handle_sal(cpu, env->regs[1]);
503
        break;
504 505
    case PRIV_SIGA:
        /* Not provided, set CC = 3 for subchannel not operational */
506
        setcc(cpu, 3);
507
        break;
508 509
    default:
        return -1;
510 511
    }

512
    return 0;
513 514 515 516
}

static int handle_priv(S390CPU *cpu, struct kvm_run *run,
                       uint8_t ipa0, uint8_t ipa1)
A
Alexander Graf 已提交
517 518 519
{
    int r = 0;
    uint16_t ipbh0 = (run->s390_sieic.ipb & 0xffff0000) >> 16;
520
    uint8_t ipb = run->s390_sieic.ipb & 0xff;
A
Alexander Graf 已提交
521

522
    DPRINTF("KVM: PRIV: %d\n", ipa1);
A
Alexander Graf 已提交
523 524
    switch (ipa1) {
        case PRIV_SCLP_CALL:
525
            r = kvm_sclp_service_call(cpu, run, ipbh0);
A
Alexander Graf 已提交
526 527
            break;
        default:
528 529 530
            r = kvm_handle_css_inst(cpu, run, ipa0, ipa1, ipb);
            if (r == -1) {
                DPRINTF("KVM: unhandled PRIV: 0x%x\n", ipa1);
531
            }
A
Alexander Graf 已提交
532 533 534 535 536 537
            break;
    }

    return r;
}

538
static int handle_hypercall(S390CPU *cpu, struct kvm_run *run)
A
Alexander Graf 已提交
539
{
540 541
    CPUState *cs = CPU(cpu);
    CPUS390XState *env = &cpu->env;
542 543 544

    kvm_s390_get_registers_partial(cs);
    cs->kvm_vcpu_dirty = true;
545
    env->regs[2] = s390_virtio_hypercall(env);
A
Alexander Graf 已提交
546

547
    return 0;
A
Alexander Graf 已提交
548 549
}

550 551 552 553 554 555 556 557 558 559
static void kvm_handle_diag_308(S390CPU *cpu, struct kvm_run *run)
{
    uint64_t r1, r3;

    cpu_synchronize_state(CPU(cpu));
    r1 = (run->s390_sieic.ipa & 0x00f0) >> 8;
    r3 = run->s390_sieic.ipa & 0x000f;
    handle_diag_308(&cpu->env, r1, r3);
}

C
Cornelia Huck 已提交
560 561 562
#define DIAG_KVM_CODE_MASK 0x000000000000ffff

static int handle_diag(S390CPU *cpu, struct kvm_run *run, uint32_t ipb)
A
Alexander Graf 已提交
563 564
{
    int r = 0;
C
Cornelia Huck 已提交
565 566 567 568 569 570 571 572
    uint16_t func_code;

    /*
     * For any diagnose call we support, bits 48-63 of the resulting
     * address specify the function code; the remainder is ignored.
     */
    func_code = decode_basedisp_rs(&cpu->env, ipb) & DIAG_KVM_CODE_MASK;
    switch (func_code) {
573 574 575
    case DIAG_IPL:
        kvm_handle_diag_308(cpu, run);
        break;
576 577 578 579 580 581 582
    case DIAG_KVM_HYPERCALL:
        r = handle_hypercall(cpu, run);
        break;
    case DIAG_KVM_BREAKPOINT:
        sleep(10);
        break;
    default:
C
Cornelia Huck 已提交
583
        DPRINTF("KVM: unknown DIAG: 0x%x\n", func_code);
584 585
        r = -1;
        break;
A
Alexander Graf 已提交
586 587 588 589 590
    }

    return r;
}

591
int kvm_s390_cpu_restart(S390CPU *cpu)
A
Alexander Graf 已提交
592
{
593
    kvm_s390_interrupt(cpu, KVM_S390_RESTART, 0);
594
    s390_add_running_cpu(cpu);
595
    qemu_cpu_kick(CPU(cpu));
596
    DPRINTF("DONE: KVM cpu restart: %p\n", &cpu->env);
A
Alexander Graf 已提交
597 598 599
    return 0;
}

600
static int s390_cpu_initial_reset(S390CPU *cpu)
A
Alexander Graf 已提交
601
{
602
    CPUState *cs = CPU(cpu);
603
    CPUS390XState *env = &cpu->env;
604 605
    int i;

606
    s390_del_running_cpu(cpu);
607
    if (kvm_vcpu_ioctl(cs, KVM_S390_INITIAL_RESET, NULL) < 0) {
608 609 610 611
        perror("cannot init reset vcpu");
    }

    /* Manually zero out all registers */
612
    cpu_synchronize_state(cs);
613 614 615 616
    for (i = 0; i < 16; i++) {
        env->regs[i] = 0;
    }

617
    DPRINTF("DONE: SIGP initial reset: %p\n", env);
618
    return 0;
A
Alexander Graf 已提交
619 620
}

A
Andreas Färber 已提交
621
static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
A
Alexander Graf 已提交
622
{
A
Andreas Färber 已提交
623
    CPUS390XState *env = &cpu->env;
A
Alexander Graf 已提交
624 625 626
    uint8_t order_code;
    uint16_t cpu_addr;
    int r = -1;
627
    S390CPU *target_cpu;
A
Alexander Graf 已提交
628

629
    cpu_synchronize_state(CPU(cpu));
A
Alexander Graf 已提交
630 631 632 633 634 635 636 637 638

    /* get order code */
    order_code = run->s390_sieic.ipb >> 28;
    if (order_code > 0) {
        order_code = env->regs[order_code];
    }
    order_code += (run->s390_sieic.ipb & 0x0fff0000) >> 16;

    cpu_addr = env->regs[ipa1 & 0x0f];
639 640
    target_cpu = s390_cpu_addr2state(cpu_addr);
    if (target_cpu == NULL) {
A
Alexander Graf 已提交
641 642 643 644 645
        goto out;
    }

    switch (order_code) {
        case SIGP_RESTART:
646
            r = kvm_s390_cpu_restart(target_cpu);
A
Alexander Graf 已提交
647 648 649 650 651
            break;
        case SIGP_SET_ARCH:
            /* make the caller panic */
            return -1;
        case SIGP_INITIAL_CPU_RESET:
652
            r = s390_cpu_initial_reset(target_cpu);
A
Alexander Graf 已提交
653 654
            break;
        default:
655
            fprintf(stderr, "KVM: unknown SIGP: 0x%x\n", order_code);
A
Alexander Graf 已提交
656 657 658 659
            break;
    }

out:
A
Andreas Färber 已提交
660
    setcc(cpu, r ? 3 : 0);
A
Alexander Graf 已提交
661 662 663
    return 0;
}

664
static void handle_instruction(S390CPU *cpu, struct kvm_run *run)
A
Alexander Graf 已提交
665 666 667
{
    unsigned int ipa0 = (run->s390_sieic.ipa & 0xff00);
    uint8_t ipa1 = run->s390_sieic.ipa & 0x00ff;
668
    int r = -1;
A
Alexander Graf 已提交
669

670 671
    DPRINTF("handle_instruction 0x%x 0x%x\n",
            run->s390_sieic.ipa, run->s390_sieic.ipb);
A
Alexander Graf 已提交
672
    switch (ipa0) {
673 674 675 676 677 678
    case IPA0_B2:
    case IPA0_B9:
    case IPA0_EB:
        r = handle_priv(cpu, run, ipa0 >> 8, ipa1);
        break;
    case IPA0_DIAG:
C
Cornelia Huck 已提交
679
        r = handle_diag(cpu, run, run->s390_sieic.ipb);
680 681 682 683
        break;
    case IPA0_SIGP:
        r = handle_sigp(cpu, run, ipa1);
        break;
A
Alexander Graf 已提交
684 685 686
    }

    if (r < 0) {
687
        enter_pgmcheck(cpu, 0x0001);
A
Alexander Graf 已提交
688 689 690
    }
}

A
Andreas Färber 已提交
691
static bool is_special_wait_psw(CPUState *cs)
692 693
{
    /* signal quiesce */
A
Andreas Färber 已提交
694
    return cs->kvm_run->psw_addr == 0xfffUL;
695 696
}

697
static int handle_intercept(S390CPU *cpu)
A
Alexander Graf 已提交
698
{
A
Andreas Färber 已提交
699 700
    CPUState *cs = CPU(cpu);
    struct kvm_run *run = cs->kvm_run;
A
Alexander Graf 已提交
701 702 703
    int icpt_code = run->s390_sieic.icptcode;
    int r = 0;

704
    DPRINTF("intercept: 0x%x (at 0x%lx)\n", icpt_code,
A
Andreas Färber 已提交
705
            (long)cs->kvm_run->psw_addr);
A
Alexander Graf 已提交
706 707
    switch (icpt_code) {
        case ICPT_INSTRUCTION:
708
            handle_instruction(cpu, run);
A
Alexander Graf 已提交
709 710
            break;
        case ICPT_WAITPSW:
711 712 713 714 715 716 717 718 719 720 721 722
            /* disabled wait, since enabled wait is handled in kernel */
            if (s390_del_running_cpu(cpu) == 0) {
                if (is_special_wait_psw(cs)) {
                    qemu_system_shutdown_request();
                } else {
                    QObject *data;

                    data = qobject_from_jsonf("{ 'action': %s }", "pause");
                    monitor_protocol_event(QEVENT_GUEST_PANICKED, data);
                    qobject_decref(data);
                    vm_stop(RUN_STATE_GUEST_PANICKED);
                }
723 724 725
            }
            r = EXCP_HALTED;
            break;
726
        case ICPT_CPU_STOP:
727
            if (s390_del_running_cpu(cpu) == 0) {
728 729 730
                qemu_system_shutdown_request();
            }
            r = EXCP_HALTED;
A
Alexander Graf 已提交
731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748
            break;
        case ICPT_SOFT_INTERCEPT:
            fprintf(stderr, "KVM unimplemented icpt SOFT\n");
            exit(1);
            break;
        case ICPT_IO:
            fprintf(stderr, "KVM unimplemented icpt IO\n");
            exit(1);
            break;
        default:
            fprintf(stderr, "Unknown intercept code: %d\n", icpt_code);
            exit(1);
            break;
    }

    return r;
}

749 750 751 752 753 754 755
static int handle_tsch(S390CPU *cpu)
{
    CPUS390XState *env = &cpu->env;
    CPUState *cs = CPU(cpu);
    struct kvm_run *run = cs->kvm_run;
    int ret;

756 757 758
    kvm_s390_get_registers_partial(cs);
    cs->kvm_vcpu_dirty = true;

759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787
    ret = ioinst_handle_tsch(env, env->regs[1], run->s390_tsch.ipb);
    if (ret >= 0) {
        /* Success; set condition code. */
        setcc(cpu, ret);
        ret = 0;
    } else if (ret < -1) {
        /*
         * Failure.
         * If an I/O interrupt had been dequeued, we have to reinject it.
         */
        if (run->s390_tsch.dequeued) {
            uint16_t subchannel_id = run->s390_tsch.subchannel_id;
            uint16_t subchannel_nr = run->s390_tsch.subchannel_nr;
            uint32_t io_int_parm = run->s390_tsch.io_int_parm;
            uint32_t io_int_word = run->s390_tsch.io_int_word;
            uint32_t type = ((subchannel_id & 0xff00) << 24) |
                ((subchannel_id & 0x00060) << 22) | (subchannel_nr << 16);

            kvm_s390_interrupt_internal(cpu, type,
                                        ((uint32_t)subchannel_id << 16)
                                        | subchannel_nr,
                                        ((uint64_t)io_int_parm << 32)
                                        | io_int_word, 1);
        }
        ret = 0;
    }
    return ret;
}

A
Andreas Färber 已提交
788
int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
A
Alexander Graf 已提交
789
{
A
Andreas Färber 已提交
790
    S390CPU *cpu = S390_CPU(cs);
A
Alexander Graf 已提交
791 792 793 794
    int ret = 0;

    switch (run->exit_reason) {
        case KVM_EXIT_S390_SIEIC:
795
            ret = handle_intercept(cpu);
A
Alexander Graf 已提交
796 797
            break;
        case KVM_EXIT_S390_RESET:
798
            qemu_system_reset_request();
A
Alexander Graf 已提交
799
            break;
800 801 802
        case KVM_EXIT_S390_TSCH:
            ret = handle_tsch(cpu);
            break;
A
Alexander Graf 已提交
803 804 805 806 807
        default:
            fprintf(stderr, "Unknown KVM exit: %d\n", run->exit_reason);
            break;
    }

808 809 810
    if (ret == 0) {
        ret = EXCP_INTERRUPT;
    }
A
Alexander Graf 已提交
811 812
    return ret;
}
813

A
Andreas Färber 已提交
814
bool kvm_arch_stop_on_emulation_error(CPUState *cpu)
815 816 817
{
    return true;
}
818

A
Andreas Färber 已提交
819
int kvm_arch_on_sigbus_vcpu(CPUState *cpu, int code, void *addr)
820 821 822 823 824 825 826 827
{
    return 1;
}

int kvm_arch_on_sigbus(int code, void *addr)
{
    return 1;
}
828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857

void kvm_s390_io_interrupt(S390CPU *cpu, uint16_t subchannel_id,
                           uint16_t subchannel_nr, uint32_t io_int_parm,
                           uint32_t io_int_word)
{
    uint32_t type;

    type = ((subchannel_id & 0xff00) << 24) |
        ((subchannel_id & 0x00060) << 22) | (subchannel_nr << 16);
    kvm_s390_interrupt_internal(cpu, type,
                                ((uint32_t)subchannel_id << 16) | subchannel_nr,
                                ((uint64_t)io_int_parm << 32) | io_int_word, 1);
}

void kvm_s390_crw_mchk(S390CPU *cpu)
{
    kvm_s390_interrupt_internal(cpu, KVM_S390_MCHK, 1 << 28,
                                0x00400f1d40330000, 1);
}

void kvm_s390_enable_css_support(S390CPU *cpu)
{
    struct kvm_enable_cap cap = {};
    int r;

    /* Activate host kernel channel subsystem support. */
    cap.cap = KVM_CAP_S390_CSS_SUPPORT;
    r = kvm_vcpu_ioctl(CPU(cpu), KVM_ENABLE_CAP, &cap);
    assert(r == 0);
}
858 859 860 861

void kvm_arch_init_irq_routing(KVMState *s)
{
}
C
Cornelia Huck 已提交
862

863 864
int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
                                    int vq, bool assign)
C
Cornelia Huck 已提交
865 866 867 868
{
    struct kvm_ioeventfd kick = {
        .flags = KVM_IOEVENTFD_FLAG_VIRTIO_CCW_NOTIFY |
        KVM_IOEVENTFD_FLAG_DATAMATCH,
869
        .fd = event_notifier_get_fd(notifier),
C
Cornelia Huck 已提交
870 871 872 873 874 875 876 877 878 879 880 881
        .datamatch = vq,
        .addr = sch,
        .len = 8,
    };
    if (!kvm_check_extension(kvm_state, KVM_CAP_IOEVENTFD)) {
        return -ENOSYS;
    }
    if (!assign) {
        kick.flags |= KVM_IOEVENTFD_FLAG_DEASSIGN;
    }
    return kvm_vm_ioctl(kvm_state, KVM_IOEVENTFD, &kick);
}