Statistics
| Branch: | Revision:

root / target-s390x / kvm.c @ 1de7afc9

History | View | Annotate | Download (15.2 kB)

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

    
20
#include <sys/types.h>
21
#include <sys/ioctl.h>
22
#include <sys/mman.h>
23

    
24
#include <linux/kvm.h>
25
#include <asm/ptrace.h>
26

    
27
#include "qemu-common.h"
28
#include "qemu/timer.h"
29
#include "sysemu.h"
30
#include "kvm.h"
31
#include "cpu.h"
32
#include "device_tree.h"
33

    
34
/* #define DEBUG_KVM */
35

    
36
#ifdef DEBUG_KVM
37
#define dprintf(fmt, ...) \
38
    do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
39
#else
40
#define dprintf(fmt, ...) \
41
    do { } while (0)
42
#endif
43

    
44
#define IPA0_DIAG                       0x8300
45
#define IPA0_SIGP                       0xae00
46
#define IPA0_PRIV                       0xb200
47

    
48
#define PRIV_SCLP_CALL                  0x20
49
#define DIAG_KVM_HYPERCALL              0x500
50
#define DIAG_KVM_BREAKPOINT             0x501
51

    
52
#define ICPT_INSTRUCTION                0x04
53
#define ICPT_WAITPSW                    0x1c
54
#define ICPT_SOFT_INTERCEPT             0x24
55
#define ICPT_CPU_STOP                   0x28
56
#define ICPT_IO                         0x40
57

    
58
#define SIGP_RESTART                    0x06
59
#define SIGP_INITIAL_CPU_RESET          0x0b
60
#define SIGP_STORE_STATUS_ADDR          0x0e
61
#define SIGP_SET_ARCH                   0x12
62

    
63
const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
64
    KVM_CAP_LAST_INFO
65
};
66

    
67
static int cap_sync_regs;
68

    
69
int kvm_arch_init(KVMState *s)
70
{
71
    cap_sync_regs = kvm_check_extension(s, KVM_CAP_SYNC_REGS);
72
    return 0;
73
}
74

    
75
int kvm_arch_init_vcpu(CPUS390XState *env)
76
{
77
    int ret = 0;
78

    
79
    if (kvm_vcpu_ioctl(env, KVM_S390_INITIAL_RESET, NULL) < 0) {
80
        perror("cannot init reset vcpu");
81
    }
82

    
83
    return ret;
84
}
85

    
86
void kvm_arch_reset_vcpu(CPUS390XState *env)
87
{
88
    /* FIXME: add code to reset vcpu. */
89
}
90

    
91
int kvm_arch_put_registers(CPUS390XState *env, int level)
92
{
93
    struct kvm_sregs sregs;
94
    struct kvm_regs regs;
95
    int ret;
96
    int i;
97

    
98
    /* always save the PSW  and the GPRS*/
99
    env->kvm_run->psw_addr = env->psw.addr;
100
    env->kvm_run->psw_mask = env->psw.mask;
101

    
102
    if (cap_sync_regs && env->kvm_run->kvm_valid_regs & KVM_SYNC_GPRS) {
103
        for (i = 0; i < 16; i++) {
104
            env->kvm_run->s.regs.gprs[i] = env->regs[i];
105
            env->kvm_run->kvm_dirty_regs |= KVM_SYNC_GPRS;
106
        }
107
    } else {
108
        for (i = 0; i < 16; i++) {
109
            regs.gprs[i] = env->regs[i];
110
        }
111
        ret = kvm_vcpu_ioctl(env, KVM_SET_REGS, &regs);
112
        if (ret < 0) {
113
            return ret;
114
        }
115
    }
116

    
117
    /* Do we need to save more than that? */
118
    if (level == KVM_PUT_RUNTIME_STATE) {
119
        return 0;
120
    }
121

    
122
    if (cap_sync_regs &&
123
        env->kvm_run->kvm_valid_regs & KVM_SYNC_ACRS &&
124
        env->kvm_run->kvm_valid_regs & KVM_SYNC_CRS) {
125
        for (i = 0; i < 16; i++) {
126
            env->kvm_run->s.regs.acrs[i] = env->aregs[i];
127
            env->kvm_run->s.regs.crs[i] = env->cregs[i];
128
        }
129
        env->kvm_run->kvm_dirty_regs |= KVM_SYNC_ACRS;
130
        env->kvm_run->kvm_dirty_regs |= KVM_SYNC_CRS;
131
    } else {
132
        for (i = 0; i < 16; i++) {
133
            sregs.acrs[i] = env->aregs[i];
134
            sregs.crs[i] = env->cregs[i];
135
        }
136
        ret = kvm_vcpu_ioctl(env, KVM_SET_SREGS, &sregs);
137
        if (ret < 0) {
138
            return ret;
139
        }
140
    }
141

    
142
    /* Finally the prefix */
143
    if (cap_sync_regs && env->kvm_run->kvm_valid_regs & KVM_SYNC_PREFIX) {
144
        env->kvm_run->s.regs.prefix = env->psa;
145
        env->kvm_run->kvm_dirty_regs |= KVM_SYNC_PREFIX;
146
    } else {
147
        /* prefix is only supported via sync regs */
148
    }
149
    return 0;
150
}
151

    
152
int kvm_arch_get_registers(CPUS390XState *env)
153
{
154
    struct kvm_sregs sregs;
155
    struct kvm_regs regs;
156
    int ret;
157
    int i;
158

    
159
    /* get the PSW */
160
    env->psw.addr = env->kvm_run->psw_addr;
161
    env->psw.mask = env->kvm_run->psw_mask;
162

    
163
    /* the GPRS */
164
    if (cap_sync_regs && env->kvm_run->kvm_valid_regs & KVM_SYNC_GPRS) {
165
        for (i = 0; i < 16; i++) {
166
            env->regs[i] = env->kvm_run->s.regs.gprs[i];
167
        }
168
    } else {
169
        ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, &regs);
170
        if (ret < 0) {
171
            return ret;
172
        }
173
         for (i = 0; i < 16; i++) {
174
            env->regs[i] = regs.gprs[i];
175
        }
176
    }
177

    
178
    /* The ACRS and CRS */
179
    if (cap_sync_regs &&
180
        env->kvm_run->kvm_valid_regs & KVM_SYNC_ACRS &&
181
        env->kvm_run->kvm_valid_regs & KVM_SYNC_CRS) {
182
        for (i = 0; i < 16; i++) {
183
            env->aregs[i] = env->kvm_run->s.regs.acrs[i];
184
            env->cregs[i] = env->kvm_run->s.regs.crs[i];
185
        }
186
    } else {
187
        ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs);
188
        if (ret < 0) {
189
            return ret;
190
        }
191
         for (i = 0; i < 16; i++) {
192
            env->aregs[i] = sregs.acrs[i];
193
            env->cregs[i] = sregs.crs[i];
194
        }
195
    }
196

    
197
    /* Finally the prefix */
198
    if (cap_sync_regs && env->kvm_run->kvm_valid_regs & KVM_SYNC_PREFIX) {
199
        env->psa = env->kvm_run->s.regs.prefix;
200
    } else {
201
        /* no prefix without sync regs */
202
    }
203

    
204
    return 0;
205
}
206

    
207
/*
208
 * Legacy layout for s390:
209
 * Older S390 KVM requires the topmost vma of the RAM to be
210
 * smaller than an system defined value, which is at least 256GB.
211
 * Larger systems have larger values. We put the guest between
212
 * the end of data segment (system break) and this value. We
213
 * use 32GB as a base to have enough room for the system break
214
 * to grow. We also have to use MAP parameters that avoid
215
 * read-only mapping of guest pages.
216
 */
217
static void *legacy_s390_alloc(ram_addr_t size)
218
{
219
    void *mem;
220

    
221
    mem = mmap((void *) 0x800000000ULL, size,
222
               PROT_EXEC|PROT_READ|PROT_WRITE,
223
               MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
224
    if (mem == MAP_FAILED) {
225
        fprintf(stderr, "Allocating RAM failed\n");
226
        abort();
227
    }
228
    return mem;
229
}
230

    
231
void *kvm_arch_vmalloc(ram_addr_t size)
232
{
233
    /* Can we use the standard allocation ? */
234
    if (kvm_check_extension(kvm_state, KVM_CAP_S390_GMAP) &&
235
        kvm_check_extension(kvm_state, KVM_CAP_S390_COW)) {
236
        return NULL;
237
    } else {
238
        return legacy_s390_alloc(size);
239
    }
240
}
241

    
242
int kvm_arch_insert_sw_breakpoint(CPUS390XState *env, struct kvm_sw_breakpoint *bp)
243
{
244
    static const uint8_t diag_501[] = {0x83, 0x24, 0x05, 0x01};
245

    
246
    if (cpu_memory_rw_debug(env, bp->pc, (uint8_t *)&bp->saved_insn, 4, 0) ||
247
        cpu_memory_rw_debug(env, bp->pc, (uint8_t *)diag_501, 4, 1)) {
248
        return -EINVAL;
249
    }
250
    return 0;
251
}
252

    
253
int kvm_arch_remove_sw_breakpoint(CPUS390XState *env, struct kvm_sw_breakpoint *bp)
254
{
255
    uint8_t t[4];
256
    static const uint8_t diag_501[] = {0x83, 0x24, 0x05, 0x01};
257

    
258
    if (cpu_memory_rw_debug(env, bp->pc, t, 4, 0)) {
259
        return -EINVAL;
260
    } else if (memcmp(t, diag_501, 4)) {
261
        return -EINVAL;
262
    } else if (cpu_memory_rw_debug(env, bp->pc, (uint8_t *)&bp->saved_insn, 1, 1)) {
263
        return -EINVAL;
264
    }
265

    
266
    return 0;
267
}
268

    
269
void kvm_arch_pre_run(CPUS390XState *env, struct kvm_run *run)
270
{
271
}
272

    
273
void kvm_arch_post_run(CPUS390XState *env, struct kvm_run *run)
274
{
275
}
276

    
277
int kvm_arch_process_async_events(CPUS390XState *env)
278
{
279
    return env->halted;
280
}
281

    
282
void kvm_s390_interrupt_internal(CPUS390XState *env, int type, uint32_t parm,
283
                                 uint64_t parm64, int vm)
284
{
285
    struct kvm_s390_interrupt kvmint;
286
    int r;
287

    
288
    if (!env->kvm_state) {
289
        return;
290
    }
291

    
292
    kvmint.type = type;
293
    kvmint.parm = parm;
294
    kvmint.parm64 = parm64;
295

    
296
    if (vm) {
297
        r = kvm_vm_ioctl(env->kvm_state, KVM_S390_INTERRUPT, &kvmint);
298
    } else {
299
        r = kvm_vcpu_ioctl(env, KVM_S390_INTERRUPT, &kvmint);
300
    }
301

    
302
    if (r < 0) {
303
        fprintf(stderr, "KVM failed to inject interrupt\n");
304
        exit(1);
305
    }
306
}
307

    
308
void kvm_s390_virtio_irq(CPUS390XState *env, int config_change, uint64_t token)
309
{
310
    kvm_s390_interrupt_internal(env, KVM_S390_INT_VIRTIO, config_change,
311
                                token, 1);
312
}
313

    
314
void kvm_s390_interrupt(CPUS390XState *env, int type, uint32_t code)
315
{
316
    kvm_s390_interrupt_internal(env, type, code, 0, 0);
317
}
318

    
319
static void enter_pgmcheck(CPUS390XState *env, uint16_t code)
320
{
321
    kvm_s390_interrupt(env, KVM_S390_PROGRAM_INT, code);
322
}
323

    
324
static inline void setcc(CPUS390XState *env, uint64_t cc)
325
{
326
    env->kvm_run->psw_mask &= ~(3ull << 44);
327
    env->kvm_run->psw_mask |= (cc & 3) << 44;
328

    
329
    env->psw.mask &= ~(3ul << 44);
330
    env->psw.mask |= (cc & 3) << 44;
331
}
332

    
333
static int kvm_sclp_service_call(CPUS390XState *env, struct kvm_run *run,
334
                                 uint16_t ipbh0)
335
{
336
    uint32_t sccb;
337
    uint64_t code;
338
    int r = 0;
339

    
340
    cpu_synchronize_state(env);
341
    sccb = env->regs[ipbh0 & 0xf];
342
    code = env->regs[(ipbh0 & 0xf0) >> 4];
343

    
344
    r = sclp_service_call(sccb, code);
345
    if (r < 0) {
346
        enter_pgmcheck(env, -r);
347
    }
348
    setcc(env, r);
349

    
350
    return 0;
351
}
352

    
353
static int handle_priv(CPUS390XState *env, struct kvm_run *run, uint8_t ipa1)
354
{
355
    int r = 0;
356
    uint16_t ipbh0 = (run->s390_sieic.ipb & 0xffff0000) >> 16;
357

    
358
    dprintf("KVM: PRIV: %d\n", ipa1);
359
    switch (ipa1) {
360
        case PRIV_SCLP_CALL:
361
            r = kvm_sclp_service_call(env, run, ipbh0);
362
            break;
363
        default:
364
            dprintf("KVM: unknown PRIV: 0x%x\n", ipa1);
365
            r = -1;
366
            break;
367
    }
368

    
369
    return r;
370
}
371

    
372
static int handle_hypercall(CPUS390XState *env, struct kvm_run *run)
373
{
374
    cpu_synchronize_state(env);
375
    env->regs[2] = s390_virtio_hypercall(env, env->regs[2], env->regs[1]);
376

    
377
    return 0;
378
}
379

    
380
static int handle_diag(CPUS390XState *env, struct kvm_run *run, int ipb_code)
381
{
382
    int r = 0;
383

    
384
    switch (ipb_code) {
385
        case DIAG_KVM_HYPERCALL:
386
            r = handle_hypercall(env, run);
387
            break;
388
        case DIAG_KVM_BREAKPOINT:
389
            sleep(10);
390
            break;
391
        default:
392
            dprintf("KVM: unknown DIAG: 0x%x\n", ipb_code);
393
            r = -1;
394
            break;
395
    }
396

    
397
    return r;
398
}
399

    
400
static int s390_cpu_restart(S390CPU *cpu)
401
{
402
    CPUS390XState *env = &cpu->env;
403

    
404
    kvm_s390_interrupt(env, KVM_S390_RESTART, 0);
405
    s390_add_running_cpu(env);
406
    qemu_cpu_kick(CPU(cpu));
407
    dprintf("DONE: SIGP cpu restart: %p\n", env);
408
    return 0;
409
}
410

    
411
static int s390_store_status(CPUS390XState *env, uint32_t parameter)
412
{
413
    /* XXX */
414
    fprintf(stderr, "XXX SIGP store status\n");
415
    return -1;
416
}
417

    
418
static int s390_cpu_initial_reset(CPUS390XState *env)
419
{
420
    int i;
421

    
422
    s390_del_running_cpu(env);
423
    if (kvm_vcpu_ioctl(env, KVM_S390_INITIAL_RESET, NULL) < 0) {
424
        perror("cannot init reset vcpu");
425
    }
426

    
427
    /* Manually zero out all registers */
428
    cpu_synchronize_state(env);
429
    for (i = 0; i < 16; i++) {
430
        env->regs[i] = 0;
431
    }
432

    
433
    dprintf("DONE: SIGP initial reset: %p\n", env);
434
    return 0;
435
}
436

    
437
static int handle_sigp(CPUS390XState *env, struct kvm_run *run, uint8_t ipa1)
438
{
439
    uint8_t order_code;
440
    uint32_t parameter;
441
    uint16_t cpu_addr;
442
    uint8_t t;
443
    int r = -1;
444
    S390CPU *target_cpu;
445
    CPUS390XState *target_env;
446

    
447
    cpu_synchronize_state(env);
448

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

    
456
    /* get parameters */
457
    t = (ipa1 & 0xf0) >> 4;
458
    if (!(t % 2)) {
459
        t++;
460
    }
461

    
462
    parameter = env->regs[t] & 0x7ffffe00;
463
    cpu_addr = env->regs[ipa1 & 0x0f];
464

    
465
    target_cpu = s390_cpu_addr2state(cpu_addr);
466
    if (target_cpu == NULL) {
467
        goto out;
468
    }
469
    target_env = &target_cpu->env;
470

    
471
    switch (order_code) {
472
        case SIGP_RESTART:
473
            r = s390_cpu_restart(target_cpu);
474
            break;
475
        case SIGP_STORE_STATUS_ADDR:
476
            r = s390_store_status(target_env, parameter);
477
            break;
478
        case SIGP_SET_ARCH:
479
            /* make the caller panic */
480
            return -1;
481
        case SIGP_INITIAL_CPU_RESET:
482
            r = s390_cpu_initial_reset(target_env);
483
            break;
484
        default:
485
            fprintf(stderr, "KVM: unknown SIGP: 0x%x\n", order_code);
486
            break;
487
    }
488

    
489
out:
490
    setcc(env, r ? 3 : 0);
491
    return 0;
492
}
493

    
494
static int handle_instruction(CPUS390XState *env, struct kvm_run *run)
495
{
496
    unsigned int ipa0 = (run->s390_sieic.ipa & 0xff00);
497
    uint8_t ipa1 = run->s390_sieic.ipa & 0x00ff;
498
    int ipb_code = (run->s390_sieic.ipb & 0x0fff0000) >> 16;
499
    int r = -1;
500

    
501
    dprintf("handle_instruction 0x%x 0x%x\n", run->s390_sieic.ipa, run->s390_sieic.ipb);
502
    switch (ipa0) {
503
        case IPA0_PRIV:
504
            r = handle_priv(env, run, ipa1);
505
            break;
506
        case IPA0_DIAG:
507
            r = handle_diag(env, run, ipb_code);
508
            break;
509
        case IPA0_SIGP:
510
            r = handle_sigp(env, run, ipa1);
511
            break;
512
    }
513

    
514
    if (r < 0) {
515
        enter_pgmcheck(env, 0x0001);
516
    }
517
    return 0;
518
}
519

    
520
static bool is_special_wait_psw(CPUS390XState *env)
521
{
522
    /* signal quiesce */
523
    return env->kvm_run->psw_addr == 0xfffUL;
524
}
525

    
526
static int handle_intercept(CPUS390XState *env)
527
{
528
    struct kvm_run *run = env->kvm_run;
529
    int icpt_code = run->s390_sieic.icptcode;
530
    int r = 0;
531

    
532
    dprintf("intercept: 0x%x (at 0x%lx)\n", icpt_code,
533
            (long)env->kvm_run->psw_addr);
534
    switch (icpt_code) {
535
        case ICPT_INSTRUCTION:
536
            r = handle_instruction(env, run);
537
            break;
538
        case ICPT_WAITPSW:
539
            if (s390_del_running_cpu(env) == 0 &&
540
                is_special_wait_psw(env)) {
541
                qemu_system_shutdown_request();
542
            }
543
            r = EXCP_HALTED;
544
            break;
545
        case ICPT_CPU_STOP:
546
            if (s390_del_running_cpu(env) == 0) {
547
                qemu_system_shutdown_request();
548
            }
549
            r = EXCP_HALTED;
550
            break;
551
        case ICPT_SOFT_INTERCEPT:
552
            fprintf(stderr, "KVM unimplemented icpt SOFT\n");
553
            exit(1);
554
            break;
555
        case ICPT_IO:
556
            fprintf(stderr, "KVM unimplemented icpt IO\n");
557
            exit(1);
558
            break;
559
        default:
560
            fprintf(stderr, "Unknown intercept code: %d\n", icpt_code);
561
            exit(1);
562
            break;
563
    }
564

    
565
    return r;
566
}
567

    
568
int kvm_arch_handle_exit(CPUS390XState *env, struct kvm_run *run)
569
{
570
    int ret = 0;
571

    
572
    switch (run->exit_reason) {
573
        case KVM_EXIT_S390_SIEIC:
574
            ret = handle_intercept(env);
575
            break;
576
        case KVM_EXIT_S390_RESET:
577
            qemu_system_reset_request();
578
            break;
579
        default:
580
            fprintf(stderr, "Unknown KVM exit: %d\n", run->exit_reason);
581
            break;
582
    }
583

    
584
    if (ret == 0) {
585
        ret = EXCP_INTERRUPT;
586
    }
587
    return ret;
588
}
589

    
590
bool kvm_arch_stop_on_emulation_error(CPUS390XState *env)
591
{
592
    return true;
593
}
594

    
595
int kvm_arch_on_sigbus_vcpu(CPUS390XState *env, int code, void *addr)
596
{
597
    return 1;
598
}
599

    
600
int kvm_arch_on_sigbus(int code, void *addr)
601
{
602
    return 1;
603
}