kvm.c 25.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"
39
#include "trace.h"
A
Alexander Graf 已提交
40 41 42 43

/* #define DEBUG_KVM */

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

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

57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
#define PRIV_B2_SCLP_CALL               0x20
#define PRIV_B2_CSCH                    0x30
#define PRIV_B2_HSCH                    0x31
#define PRIV_B2_MSCH                    0x32
#define PRIV_B2_SSCH                    0x33
#define PRIV_B2_STSCH                   0x34
#define PRIV_B2_TSCH                    0x35
#define PRIV_B2_TPI                     0x36
#define PRIV_B2_SAL                     0x37
#define PRIV_B2_RSCH                    0x38
#define PRIV_B2_STCRW                   0x39
#define PRIV_B2_STCPS                   0x3a
#define PRIV_B2_RCHP                    0x3b
#define PRIV_B2_SCHM                    0x3c
#define PRIV_B2_CHSC                    0x5f
#define PRIV_B2_SIGA                    0x74
#define PRIV_B2_XSCH                    0x76

#define PRIV_EB_SQBS                    0x8a

#define PRIV_B9_EQBS                    0x9c

79
#define DIAG_IPL                        0x308
A
Alexander Graf 已提交
80 81 82 83 84 85 86 87 88
#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

89 90 91 92
const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
    KVM_CAP_LAST_INFO
};

93
static int cap_sync_regs;
94
static int cap_async_pf;
95

96
static void *legacy_s390_alloc(size_t size);
97

98
int kvm_arch_init(KVMState *s)
A
Alexander Graf 已提交
99
{
100
    cap_sync_regs = kvm_check_extension(s, KVM_CAP_SYNC_REGS);
101
    cap_async_pf = kvm_check_extension(s, KVM_CAP_ASYNC_PF);
102 103 104 105
    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 已提交
106 107 108
    return 0;
}

109 110 111 112 113
unsigned long kvm_arch_vcpu_id(CPUState *cpu)
{
    return cpu->cpu_index;
}

A
Andreas Färber 已提交
114
int kvm_arch_init_vcpu(CPUState *cpu)
A
Alexander Graf 已提交
115
{
116 117
    /* nothing todo yet */
    return 0;
A
Alexander Graf 已提交
118 119
}

A
Andreas Färber 已提交
120
void kvm_arch_reset_vcpu(CPUState *cpu)
A
Alexander Graf 已提交
121
{
A
Alexander Graf 已提交
122 123 124 125 126
    /* 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 已提交
127 128 129
    if (kvm_vcpu_ioctl(cpu, KVM_S390_INITIAL_RESET, NULL)) {
        perror("Can't reset vcpu\n");
    }
A
Alexander Graf 已提交
130 131
}

132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
static int kvm_set_one_reg(CPUState *cs, uint64_t id, void *source)
{
    struct kvm_one_reg reg;
    int r;

    reg.id = id;
    reg.addr = (uint64_t) source;
    r = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
    if (r) {
        trace_kvm_failed_reg_set(id, strerror(errno));
    }
    return r;
}

static int kvm_get_one_reg(CPUState *cs, uint64_t id, void *target)
{
    struct kvm_one_reg reg;
    int r;

    reg.id = id;
    reg.addr = (uint64_t) target;
    r = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
    if (r) {
        trace_kvm_failed_reg_get(id, strerror(errno));
    }
    return r;
}


A
Andreas Färber 已提交
161
int kvm_arch_put_registers(CPUState *cs, int level)
A
Alexander Graf 已提交
162
{
A
Andreas Färber 已提交
163 164
    S390CPU *cpu = S390_CPU(cs);
    CPUS390XState *env = &cpu->env;
165
    struct kvm_sregs sregs;
A
Alexander Graf 已提交
166
    struct kvm_regs regs;
167
    int r;
A
Alexander Graf 已提交
168 169
    int i;

170
    /* always save the PSW  and the GPRS*/
A
Andreas Färber 已提交
171 172
    cs->kvm_run->psw_addr = env->psw.addr;
    cs->kvm_run->psw_mask = env->psw.mask;
A
Alexander Graf 已提交
173

A
Andreas Färber 已提交
174
    if (cap_sync_regs && cs->kvm_run->kvm_valid_regs & KVM_SYNC_GPRS) {
175
        for (i = 0; i < 16; i++) {
A
Andreas Färber 已提交
176 177
            cs->kvm_run->s.regs.gprs[i] = env->regs[i];
            cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_GPRS;
178 179 180 181 182
        }
    } else {
        for (i = 0; i < 16; i++) {
            regs.gprs[i] = env->regs[i];
        }
183 184 185
        r = kvm_vcpu_ioctl(cs, KVM_SET_REGS, &regs);
        if (r < 0) {
            return r;
186
        }
A
Alexander Graf 已提交
187 188
    }

189 190 191 192
    /* Do we need to save more than that? */
    if (level == KVM_PUT_RUNTIME_STATE) {
        return 0;
    }
193

194 195 196 197 198 199 200 201
    /*
     * These ONE_REGS are not protected by a capability. As they are only
     * necessary for migration we just trace a possible error, but don't
     * return with an error return code.
     */
    kvm_set_one_reg(cs, KVM_REG_S390_CPU_TIMER, &env->cputm);
    kvm_set_one_reg(cs, KVM_REG_S390_CLOCK_COMP, &env->ckc);
    kvm_set_one_reg(cs, KVM_REG_S390_TODPR, &env->todpr);
202 203
    kvm_set_one_reg(cs, KVM_REG_S390_GBEA, &env->gbea);
    kvm_set_one_reg(cs, KVM_REG_S390_PP, &env->pp);
A
Alexander Graf 已提交
204

205
    if (cap_async_pf) {
206 207 208
        r = kvm_set_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token);
        if (r < 0) {
            return r;
209
        }
210 211 212
        r = kvm_set_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare);
        if (r < 0) {
            return r;
213
        }
214 215 216
        r = kvm_set_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select);
        if (r < 0) {
            return r;
217 218 219
        }
    }

220
    if (cap_sync_regs &&
A
Andreas Färber 已提交
221 222
        cs->kvm_run->kvm_valid_regs & KVM_SYNC_ACRS &&
        cs->kvm_run->kvm_valid_regs & KVM_SYNC_CRS) {
223
        for (i = 0; i < 16; i++) {
A
Andreas Färber 已提交
224 225
            cs->kvm_run->s.regs.acrs[i] = env->aregs[i];
            cs->kvm_run->s.regs.crs[i] = env->cregs[i];
226
        }
A
Andreas Färber 已提交
227 228
        cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_ACRS;
        cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_CRS;
229 230 231 232 233
    } else {
        for (i = 0; i < 16; i++) {
            sregs.acrs[i] = env->aregs[i];
            sregs.crs[i] = env->cregs[i];
        }
234 235 236
        r = kvm_vcpu_ioctl(cs, KVM_SET_SREGS, &sregs);
        if (r < 0) {
            return r;
237 238
        }
    }
A
Alexander Graf 已提交
239

240
    /* Finally the prefix */
A
Andreas Färber 已提交
241 242 243
    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;
244 245 246 247
    } else {
        /* prefix is only supported via sync regs */
    }
    return 0;
A
Alexander Graf 已提交
248 249
}

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

258
    /* get the PSW */
A
Andreas Färber 已提交
259 260
    env->psw.addr = cs->kvm_run->psw_addr;
    env->psw.mask = cs->kvm_run->psw_mask;
261 262

    /* the GPRS */
A
Andreas Färber 已提交
263
    if (cap_sync_regs && cs->kvm_run->kvm_valid_regs & KVM_SYNC_GPRS) {
264
        for (i = 0; i < 16; i++) {
A
Andreas Färber 已提交
265
            env->regs[i] = cs->kvm_run->s.regs.gprs[i];
266 267
        }
    } else {
268 269 270
        r = kvm_vcpu_ioctl(cs, KVM_GET_REGS, &regs);
        if (r < 0) {
            return r;
271 272 273 274
        }
         for (i = 0; i < 16; i++) {
            env->regs[i] = regs.gprs[i];
        }
A
Alexander Graf 已提交
275 276
    }

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

296
    /* The prefix */
A
Andreas Färber 已提交
297 298
    if (cap_sync_regs && cs->kvm_run->kvm_valid_regs & KVM_SYNC_PREFIX) {
        env->psa = cs->kvm_run->s.regs.prefix;
299
    }
A
Alexander Graf 已提交
300

301 302 303 304 305 306 307 308
    /*
     * These ONE_REGS are not protected by a capability. As they are only
     * necessary for migration we just trace a possible error, but don't
     * return with an error return code.
     */
    kvm_get_one_reg(cs, KVM_REG_S390_CPU_TIMER, &env->cputm);
    kvm_get_one_reg(cs, KVM_REG_S390_CLOCK_COMP, &env->ckc);
    kvm_get_one_reg(cs, KVM_REG_S390_TODPR, &env->todpr);
309 310
    kvm_get_one_reg(cs, KVM_REG_S390_GBEA, &env->gbea);
    kvm_get_one_reg(cs, KVM_REG_S390_PP, &env->pp);
311

312
    if (cap_async_pf) {
313
        r = kvm_get_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token);
314 315 316
        if (r < 0) {
            return r;
        }
317
        r = kvm_get_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare);
318 319 320
        if (r < 0) {
            return r;
        }
321
        r = kvm_get_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select);
322 323 324 325 326
        if (r < 0) {
            return r;
        }
    }

A
Alexander Graf 已提交
327 328 329
    return 0;
}

330 331 332 333 334 335 336 337 338 339
/*
 * 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.
 */
340
static void *legacy_s390_alloc(size_t size)
341 342 343 344 345 346
{
    void *mem;

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

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

354 355
    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 已提交
356 357 358 359 360
        return -EINVAL;
    }
    return 0;
}

A
Andreas Färber 已提交
361
int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
A
Alexander Graf 已提交
362 363 364 365
{
    uint8_t t[4];
    static const uint8_t diag_501[] = {0x83, 0x24, 0x05, 0x01};

366
    if (cpu_memory_rw_debug(cs, bp->pc, t, 4, 0)) {
A
Alexander Graf 已提交
367 368 369
        return -EINVAL;
    } else if (memcmp(t, diag_501, 4)) {
        return -EINVAL;
370
    } else if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 1, 1)) {
A
Alexander Graf 已提交
371 372 373 374 375 376
        return -EINVAL;
    }

    return 0;
}

377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
int kvm_arch_insert_hw_breakpoint(target_ulong addr,
                                  target_ulong len, int type)
{
    return -ENOSYS;
}

int kvm_arch_remove_hw_breakpoint(target_ulong addr,
                                  target_ulong len, int type)
{
    return -ENOSYS;
}

void kvm_arch_remove_all_hw_breakpoints(void)
{
}

void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg)
{
}

A
Andreas Färber 已提交
397
void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run)
A
Alexander Graf 已提交
398 399 400
{
}

A
Andreas Färber 已提交
401
void kvm_arch_post_run(CPUState *cpu, struct kvm_run *run)
A
Alexander Graf 已提交
402 403 404
{
}

A
Andreas Färber 已提交
405
int kvm_arch_process_async_events(CPUState *cs)
M
Marcelo Tosatti 已提交
406
{
407
    return cs->halted;
M
Marcelo Tosatti 已提交
408 409
}

410
void kvm_s390_interrupt_internal(S390CPU *cpu, int type, uint32_t parm,
411
                                 uint64_t parm64, int vm)
A
Alexander Graf 已提交
412
{
413
    CPUState *cs = CPU(cpu);
A
Alexander Graf 已提交
414 415 416
    struct kvm_s390_interrupt kvmint;
    int r;

417
    if (!cs->kvm_state) {
A
Alexander Graf 已提交
418 419 420 421 422 423 424 425
        return;
    }

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

    if (vm) {
426
        r = kvm_vm_ioctl(cs->kvm_state, KVM_S390_INTERRUPT, &kvmint);
A
Alexander Graf 已提交
427
    } else {
428
        r = kvm_vcpu_ioctl(cs, KVM_S390_INTERRUPT, &kvmint);
A
Alexander Graf 已提交
429 430 431 432 433 434 435 436
    }

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

437
void kvm_s390_virtio_irq(S390CPU *cpu, int config_change, uint64_t token)
A
Alexander Graf 已提交
438
{
439
    kvm_s390_interrupt_internal(cpu, KVM_S390_INT_VIRTIO, config_change,
A
Alexander Graf 已提交
440 441 442
                                token, 1);
}

443
void kvm_s390_interrupt(S390CPU *cpu, int type, uint32_t code)
A
Alexander Graf 已提交
444
{
445
    kvm_s390_interrupt_internal(cpu, type, code, 0, 0);
A
Alexander Graf 已提交
446 447
}

448
static void enter_pgmcheck(S390CPU *cpu, uint16_t code)
A
Alexander Graf 已提交
449
{
450
    kvm_s390_interrupt(cpu, KVM_S390_PROGRAM_INT, code);
A
Alexander Graf 已提交
451 452
}

453
static int kvm_sclp_service_call(S390CPU *cpu, struct kvm_run *run,
454
                                 uint16_t ipbh0)
A
Alexander Graf 已提交
455
{
456
    CPUS390XState *env = &cpu->env;
457 458
    uint64_t sccb;
    uint32_t code;
A
Alexander Graf 已提交
459 460
    int r = 0;

461
    cpu_synchronize_state(CPU(cpu));
A
Alexander Graf 已提交
462 463 464
    sccb = env->regs[ipbh0 & 0xf];
    code = env->regs[(ipbh0 & 0xf0) >> 4];

465
    r = sclp_service_call(env, sccb, code);
466
    if (r < 0) {
467
        enter_pgmcheck(cpu, -r);
468 469
    } else {
        setcc(cpu, r);
A
Alexander Graf 已提交
470
    }
A
Alexander Graf 已提交
471

A
Alexander Graf 已提交
472 473 474
    return 0;
}

475
static int handle_b2(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
476 477
{
    CPUS390XState *env = &cpu->env;
478 479
    int rc = 0;
    uint16_t ipbh0 = (run->s390_sieic.ipb & 0xffff0000) >> 16;
480

481
    cpu_synchronize_state(CPU(cpu));
482

483
    switch (ipa1) {
484
    case PRIV_B2_XSCH:
485
        ioinst_handle_xsch(cpu, env->regs[1]);
486
        break;
487
    case PRIV_B2_CSCH:
488
        ioinst_handle_csch(cpu, env->regs[1]);
489
        break;
490
    case PRIV_B2_HSCH:
491
        ioinst_handle_hsch(cpu, env->regs[1]);
492
        break;
493
    case PRIV_B2_MSCH:
494
        ioinst_handle_msch(cpu, env->regs[1], run->s390_sieic.ipb);
495
        break;
496
    case PRIV_B2_SSCH:
497
        ioinst_handle_ssch(cpu, env->regs[1], run->s390_sieic.ipb);
498
        break;
499
    case PRIV_B2_STCRW:
500
        ioinst_handle_stcrw(cpu, run->s390_sieic.ipb);
501
        break;
502
    case PRIV_B2_STSCH:
503
        ioinst_handle_stsch(cpu, env->regs[1], run->s390_sieic.ipb);
504
        break;
505
    case PRIV_B2_TSCH:
506 507 508
        /* We should only get tsch via KVM_EXIT_S390_TSCH. */
        fprintf(stderr, "Spurious tsch intercept\n");
        break;
509
    case PRIV_B2_CHSC:
510
        ioinst_handle_chsc(cpu, run->s390_sieic.ipb);
511
        break;
512
    case PRIV_B2_TPI:
513 514 515
        /* This should have been handled by kvm already. */
        fprintf(stderr, "Spurious tpi intercept\n");
        break;
516
    case PRIV_B2_SCHM:
517 518
        ioinst_handle_schm(cpu, env->regs[1], env->regs[2],
                           run->s390_sieic.ipb);
519
        break;
520
    case PRIV_B2_RSCH:
521
        ioinst_handle_rsch(cpu, env->regs[1]);
522
        break;
523
    case PRIV_B2_RCHP:
524
        ioinst_handle_rchp(cpu, env->regs[1]);
525
        break;
526
    case PRIV_B2_STCPS:
527 528
        /* We do not provide this instruction, it is suppressed. */
        break;
529
    case PRIV_B2_SAL:
530
        ioinst_handle_sal(cpu, env->regs[1]);
531
        break;
532
    case PRIV_B2_SIGA:
533
        /* Not provided, set CC = 3 for subchannel not operational */
534
        setcc(cpu, 3);
535
        break;
536 537 538
    case PRIV_B2_SCLP_CALL:
        rc = kvm_sclp_service_call(cpu, run, ipbh0);
        break;
539
    default:
540 541 542
        rc = -1;
        DPRINTF("KVM: unhandled PRIV: 0xb2%x\n", ipa1);
        break;
543 544
    }

545
    return rc;
546 547
}

548
static int handle_b9(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
A
Alexander Graf 已提交
549 550 551 552
{
    int r = 0;

    switch (ipa1) {
553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578
    case PRIV_B9_EQBS:
        /* just inject exception */
        r = -1;
        break;
    default:
        r = -1;
        DPRINTF("KVM: unhandled PRIV: 0xb9%x\n", ipa1);
        break;
    }

    return r;
}

static int handle_eb(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
{
    int r = 0;

    switch (ipa1) {
    case PRIV_EB_SQBS:
        /* just inject exception */
        r = -1;
        break;
    default:
        r = -1;
        DPRINTF("KVM: unhandled PRIV: 0xeb%x\n", ipa1);
        break;
A
Alexander Graf 已提交
579 580 581 582 583
    }

    return r;
}

584
static int handle_hypercall(S390CPU *cpu, struct kvm_run *run)
A
Alexander Graf 已提交
585
{
586
    CPUS390XState *env = &cpu->env;
587
    int ret;
588

589
    cpu_synchronize_state(CPU(cpu));
590 591 592 593 594
    ret = s390_virtio_hypercall(env);
    if (ret == -EINVAL) {
        enter_pgmcheck(cpu, PGM_SPECIFICATION);
        return 0;
    }
A
Alexander Graf 已提交
595

596
    return ret;
A
Alexander Graf 已提交
597 598
}

599 600 601 602 603 604 605 606 607 608
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 已提交
609 610 611
#define DIAG_KVM_CODE_MASK 0x000000000000ffff

static int handle_diag(S390CPU *cpu, struct kvm_run *run, uint32_t ipb)
A
Alexander Graf 已提交
612 613
{
    int r = 0;
C
Cornelia Huck 已提交
614 615 616 617 618 619 620 621
    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) {
622 623 624
    case DIAG_IPL:
        kvm_handle_diag_308(cpu, run);
        break;
625 626 627 628 629 630 631
    case DIAG_KVM_HYPERCALL:
        r = handle_hypercall(cpu, run);
        break;
    case DIAG_KVM_BREAKPOINT:
        sleep(10);
        break;
    default:
C
Cornelia Huck 已提交
632
        DPRINTF("KVM: unknown DIAG: 0x%x\n", func_code);
633 634
        r = -1;
        break;
A
Alexander Graf 已提交
635 636 637 638 639
    }

    return r;
}

T
Thomas Huth 已提交
640 641 642 643 644 645 646 647
static int kvm_s390_cpu_start(S390CPU *cpu)
{
    s390_add_running_cpu(cpu);
    qemu_cpu_kick(CPU(cpu));
    DPRINTF("DONE: KVM cpu start: %p\n", &cpu->env);
    return 0;
}

648
int kvm_s390_cpu_restart(S390CPU *cpu)
A
Alexander Graf 已提交
649
{
650
    kvm_s390_interrupt(cpu, KVM_S390_RESTART, 0);
651
    s390_add_running_cpu(cpu);
652
    qemu_cpu_kick(CPU(cpu));
653
    DPRINTF("DONE: KVM cpu restart: %p\n", &cpu->env);
A
Alexander Graf 已提交
654 655 656
    return 0;
}

657
static void sigp_initial_cpu_reset(void *arg)
A
Alexander Graf 已提交
658
{
659 660
    CPUState *cpu = arg;
    S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
661

662 663
    cpu_synchronize_state(cpu);
    scc->initial_cpu_reset(cpu);
A
Alexander Graf 已提交
664 665
}

666 667 668 669 670 671 672 673 674
static void sigp_cpu_reset(void *arg)
{
    CPUState *cpu = arg;
    S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);

    cpu_synchronize_state(cpu);
    scc->cpu_reset(cpu);
}

675 676
#define SIGP_ORDER_MASK 0x000000ff

A
Andreas Färber 已提交
677
static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
A
Alexander Graf 已提交
678
{
A
Andreas Färber 已提交
679
    CPUS390XState *env = &cpu->env;
A
Alexander Graf 已提交
680 681
    uint8_t order_code;
    uint16_t cpu_addr;
682
    S390CPU *target_cpu;
683 684
    uint64_t *statusreg = &env->regs[ipa1 >> 4];
    int cc;
A
Alexander Graf 已提交
685

686
    cpu_synchronize_state(CPU(cpu));
A
Alexander Graf 已提交
687 688

    /* get order code */
689
    order_code = decode_basedisp_rs(env, run->s390_sieic.ipb) & SIGP_ORDER_MASK;
A
Alexander Graf 已提交
690 691

    cpu_addr = env->regs[ipa1 & 0x0f];
692 693
    target_cpu = s390_cpu_addr2state(cpu_addr);
    if (target_cpu == NULL) {
694
        cc = 3;    /* not operational */
A
Alexander Graf 已提交
695 696 697 698
        goto out;
    }

    switch (order_code) {
T
Thomas Huth 已提交
699
    case SIGP_START:
700
        cc = kvm_s390_cpu_start(target_cpu);
T
Thomas Huth 已提交
701
        break;
702
    case SIGP_RESTART:
703
        cc = kvm_s390_cpu_restart(target_cpu);
704 705
        break;
    case SIGP_SET_ARCH:
706 707 708 709
        *statusreg &= 0xffffffff00000000UL;
        *statusreg |= SIGP_STAT_INVALID_PARAMETER;
        cc = 1;   /* status stored */
        break;
710
    case SIGP_INITIAL_CPU_RESET:
711 712
        run_on_cpu(CPU(target_cpu), sigp_initial_cpu_reset, CPU(target_cpu));
        cc = 0;
713
        break;
714 715 716 717
    case SIGP_CPU_RESET:
        run_on_cpu(CPU(target_cpu), sigp_cpu_reset, CPU(target_cpu));
        cc = 0;
        break;
718
    default:
719 720 721 722
        DPRINTF("KVM: unknown SIGP: 0x%x\n", order_code);
        *statusreg &= 0xffffffff00000000UL;
        *statusreg |= SIGP_STAT_INVALID_ORDER;
        cc = 1;   /* status stored */
723
        break;
A
Alexander Graf 已提交
724 725 726
    }

out:
727
    setcc(cpu, cc);
A
Alexander Graf 已提交
728 729 730
    return 0;
}

731
static void handle_instruction(S390CPU *cpu, struct kvm_run *run)
A
Alexander Graf 已提交
732 733 734
{
    unsigned int ipa0 = (run->s390_sieic.ipa & 0xff00);
    uint8_t ipa1 = run->s390_sieic.ipa & 0x00ff;
735
    int r = -1;
A
Alexander Graf 已提交
736

737 738
    DPRINTF("handle_instruction 0x%x 0x%x\n",
            run->s390_sieic.ipa, run->s390_sieic.ipb);
A
Alexander Graf 已提交
739
    switch (ipa0) {
740
    case IPA0_B2:
741 742
        r = handle_b2(cpu, run, ipa1);
        break;
743
    case IPA0_B9:
744 745
        r = handle_b9(cpu, run, ipa1);
        break;
746
    case IPA0_EB:
747
        r = handle_eb(cpu, run, ipa1);
748 749
        break;
    case IPA0_DIAG:
C
Cornelia Huck 已提交
750
        r = handle_diag(cpu, run, run->s390_sieic.ipb);
751 752 753 754
        break;
    case IPA0_SIGP:
        r = handle_sigp(cpu, run, ipa1);
        break;
A
Alexander Graf 已提交
755 756 757
    }

    if (r < 0) {
758
        enter_pgmcheck(cpu, 0x0001);
A
Alexander Graf 已提交
759 760 761
    }
}

A
Andreas Färber 已提交
762
static bool is_special_wait_psw(CPUState *cs)
763 764
{
    /* signal quiesce */
A
Andreas Färber 已提交
765
    return cs->kvm_run->psw_addr == 0xfffUL;
766 767
}

768
static int handle_intercept(S390CPU *cpu)
A
Alexander Graf 已提交
769
{
A
Andreas Färber 已提交
770 771
    CPUState *cs = CPU(cpu);
    struct kvm_run *run = cs->kvm_run;
A
Alexander Graf 已提交
772 773 774
    int icpt_code = run->s390_sieic.icptcode;
    int r = 0;

775
    DPRINTF("intercept: 0x%x (at 0x%lx)\n", icpt_code,
A
Andreas Färber 已提交
776
            (long)cs->kvm_run->psw_addr);
A
Alexander Graf 已提交
777 778
    switch (icpt_code) {
        case ICPT_INSTRUCTION:
779
            handle_instruction(cpu, run);
A
Alexander Graf 已提交
780 781
            break;
        case ICPT_WAITPSW:
782 783 784 785 786 787 788 789 790 791 792 793
            /* 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);
                }
794 795 796
            }
            r = EXCP_HALTED;
            break;
797
        case ICPT_CPU_STOP:
798
            if (s390_del_running_cpu(cpu) == 0) {
799 800 801
                qemu_system_shutdown_request();
            }
            r = EXCP_HALTED;
A
Alexander Graf 已提交
802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819
            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;
}

820 821 822 823 824 825 826
static int handle_tsch(S390CPU *cpu)
{
    CPUS390XState *env = &cpu->env;
    CPUState *cs = CPU(cpu);
    struct kvm_run *run = cs->kvm_run;
    int ret;

827
    cpu_synchronize_state(cs);
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
    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;
}

858 859 860 861 862
static int kvm_arch_handle_debug_exit(S390CPU *cpu)
{
    return -ENOSYS;
}

A
Andreas Färber 已提交
863
int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
A
Alexander Graf 已提交
864
{
A
Andreas Färber 已提交
865
    S390CPU *cpu = S390_CPU(cs);
A
Alexander Graf 已提交
866 867 868 869
    int ret = 0;

    switch (run->exit_reason) {
        case KVM_EXIT_S390_SIEIC:
870
            ret = handle_intercept(cpu);
A
Alexander Graf 已提交
871 872
            break;
        case KVM_EXIT_S390_RESET:
873
            qemu_system_reset_request();
A
Alexander Graf 已提交
874
            break;
875 876 877
        case KVM_EXIT_S390_TSCH:
            ret = handle_tsch(cpu);
            break;
878 879 880
        case KVM_EXIT_DEBUG:
            ret = kvm_arch_handle_debug_exit(cpu);
            break;
A
Alexander Graf 已提交
881 882 883 884 885
        default:
            fprintf(stderr, "Unknown KVM exit: %d\n", run->exit_reason);
            break;
    }

886 887 888
    if (ret == 0) {
        ret = EXCP_INTERRUPT;
    }
A
Alexander Graf 已提交
889 890
    return ret;
}
891

A
Andreas Färber 已提交
892
bool kvm_arch_stop_on_emulation_error(CPUState *cpu)
893 894 895
{
    return true;
}
896

A
Andreas Färber 已提交
897
int kvm_arch_on_sigbus_vcpu(CPUState *cpu, int code, void *addr)
898 899 900 901 902 903 904 905
{
    return 1;
}

int kvm_arch_on_sigbus(int code, void *addr)
{
    return 1;
}
906 907 908 909 910 911 912

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;

913 914 915 916 917 918
    if (io_int_word & IO_INT_WORD_AI) {
        type = KVM_S390_INT_IO(1, 0, 0, 0);
    } else {
        type = ((subchannel_id & 0xff00) << 24) |
            ((subchannel_id & 0x00060) << 22) | (subchannel_nr << 16);
    }
919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939
    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);
}
940 941 942 943

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

945 946
int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
                                    int vq, bool assign)
C
Cornelia Huck 已提交
947 948 949 950
{
    struct kvm_ioeventfd kick = {
        .flags = KVM_IOEVENTFD_FLAG_VIRTIO_CCW_NOTIFY |
        KVM_IOEVENTFD_FLAG_DATAMATCH,
951
        .fd = event_notifier_get_fd(notifier),
C
Cornelia Huck 已提交
952 953 954 955 956 957 958 959 960 961 962 963
        .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);
}