Annotation of qemu/target-ppc/kvm.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * PowerPC implementation of KVM hooks
                      3:  *
                      4:  * Copyright IBM Corp. 2007
                      5:  *
                      6:  * Authors:
                      7:  *  Jerone Young <[email protected]>
                      8:  *  Christian Ehrhardt <[email protected]>
                      9:  *  Hollis Blanchard <[email protected]>
                     10:  *
                     11:  * This work is licensed under the terms of the GNU GPL, version 2 or later.
                     12:  * See the COPYING file in the top-level directory.
                     13:  *
                     14:  */
                     15: 
                     16: #include <sys/types.h>
                     17: #include <sys/ioctl.h>
                     18: #include <sys/mman.h>
                     19: 
                     20: #include <linux/kvm.h>
                     21: 
                     22: #include "qemu-common.h"
                     23: #include "qemu-timer.h"
                     24: #include "sysemu.h"
                     25: #include "kvm.h"
                     26: #include "kvm_ppc.h"
                     27: #include "cpu.h"
                     28: #include "device_tree.h"
                     29: 
                     30: //#define DEBUG_KVM
                     31: 
                     32: #ifdef DEBUG_KVM
                     33: #define dprintf(fmt, ...) \
                     34:     do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
                     35: #else
                     36: #define dprintf(fmt, ...) \
                     37:     do { } while (0)
                     38: #endif
                     39: 
                     40: int kvm_arch_init(KVMState *s, int smp_cpus)
                     41: {
                     42:     return 0;
                     43: }
                     44: 
                     45: int kvm_arch_init_vcpu(CPUState *cenv)
                     46: {
                     47:     return 0;
                     48: }
                     49: 
                     50: int kvm_arch_put_registers(CPUState *env)
                     51: {
                     52:     struct kvm_regs regs;
                     53:     int ret;
                     54:     int i;
                     55: 
                     56:     ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, &regs);
                     57:     if (ret < 0)
                     58:         return ret;
                     59: 
                     60:     regs.ctr = env->ctr;
                     61:     regs.lr  = env->lr;
                     62:     regs.xer = env->xer;
                     63:     regs.msr = env->msr;
                     64:     regs.pc = env->nip;
                     65: 
                     66:     regs.srr0 = env->spr[SPR_SRR0];
                     67:     regs.srr1 = env->spr[SPR_SRR1];
                     68: 
                     69:     regs.sprg0 = env->spr[SPR_SPRG0];
                     70:     regs.sprg1 = env->spr[SPR_SPRG1];
                     71:     regs.sprg2 = env->spr[SPR_SPRG2];
                     72:     regs.sprg3 = env->spr[SPR_SPRG3];
                     73:     regs.sprg4 = env->spr[SPR_SPRG4];
                     74:     regs.sprg5 = env->spr[SPR_SPRG5];
                     75:     regs.sprg6 = env->spr[SPR_SPRG6];
                     76:     regs.sprg7 = env->spr[SPR_SPRG7];
                     77: 
                     78:     for (i = 0;i < 32; i++)
                     79:         regs.gpr[i] = env->gpr[i];
                     80: 
                     81:     ret = kvm_vcpu_ioctl(env, KVM_SET_REGS, &regs);
                     82:     if (ret < 0)
                     83:         return ret;
                     84: 
                     85:     return ret;
                     86: }
                     87: 
                     88: int kvm_arch_get_registers(CPUState *env)
                     89: {
                     90:     struct kvm_regs regs;
                     91:     uint32_t i, ret;
                     92: 
                     93:     ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, &regs);
                     94:     if (ret < 0)
                     95:         return ret;
                     96: 
                     97:     env->ctr = regs.ctr;
                     98:     env->lr = regs.lr;
                     99:     env->xer = regs.xer;
                    100:     env->msr = regs.msr;
                    101:     env->nip = regs.pc;
                    102: 
                    103:     env->spr[SPR_SRR0] = regs.srr0;
                    104:     env->spr[SPR_SRR1] = regs.srr1;
                    105: 
                    106:     env->spr[SPR_SPRG0] = regs.sprg0;
                    107:     env->spr[SPR_SPRG1] = regs.sprg1;
                    108:     env->spr[SPR_SPRG2] = regs.sprg2;
                    109:     env->spr[SPR_SPRG3] = regs.sprg3;
                    110:     env->spr[SPR_SPRG4] = regs.sprg4;
                    111:     env->spr[SPR_SPRG5] = regs.sprg5;
                    112:     env->spr[SPR_SPRG6] = regs.sprg6;
                    113:     env->spr[SPR_SPRG7] = regs.sprg7;
                    114: 
                    115:     for (i = 0;i < 32; i++)
                    116:         env->gpr[i] = regs.gpr[i];
                    117: 
                    118:     return 0;
                    119: }
                    120: 
                    121: int kvm_arch_pre_run(CPUState *env, struct kvm_run *run)
                    122: {
                    123:     int r;
                    124:     unsigned irq;
                    125: 
                    126:     /* PowerPC Qemu tracks the various core input pins (interrupt, critical
                    127:      * interrupt, reset, etc) in PPC-specific env->irq_input_state. */
                    128:     if (run->ready_for_interrupt_injection &&
                    129:         (env->interrupt_request & CPU_INTERRUPT_HARD) &&
                    130:         (env->irq_input_state & (1<<PPC40x_INPUT_INT)))
                    131:     {
                    132:         /* For now KVM disregards the 'irq' argument. However, in the
                    133:          * future KVM could cache it in-kernel to avoid a heavyweight exit
                    134:          * when reading the UIC.
                    135:          */
                    136:         irq = -1U;
                    137: 
                    138:         dprintf("injected interrupt %d\n", irq);
                    139:         r = kvm_vcpu_ioctl(env, KVM_INTERRUPT, &irq);
                    140:         if (r < 0)
                    141:             printf("cpu %d fail inject %x\n", env->cpu_index, irq);
                    142:     }
                    143: 
                    144:     /* We don't know if there are more interrupts pending after this. However,
                    145:      * the guest will return to userspace in the course of handling this one
                    146:      * anyways, so we will get a chance to deliver the rest. */
                    147:     return 0;
                    148: }
                    149: 
                    150: int kvm_arch_post_run(CPUState *env, struct kvm_run *run)
                    151: {
                    152:     return 0;
                    153: }
                    154: 
                    155: static int kvmppc_handle_halt(CPUState *env)
                    156: {
                    157:     if (!(env->interrupt_request & CPU_INTERRUPT_HARD) && (msr_ee)) {
                    158:         env->halted = 1;
                    159:         env->exception_index = EXCP_HLT;
                    160:     }
                    161: 
                    162:     return 1;
                    163: }
                    164: 
                    165: /* map dcr access to existing qemu dcr emulation */
                    166: static int kvmppc_handle_dcr_read(CPUState *env, uint32_t dcrn, uint32_t *data)
                    167: {
                    168:     if (ppc_dcr_read(env->dcr_env, dcrn, data) < 0)
                    169:         fprintf(stderr, "Read to unhandled DCR (0x%x)\n", dcrn);
                    170: 
                    171:     return 1;
                    172: }
                    173: 
                    174: static int kvmppc_handle_dcr_write(CPUState *env, uint32_t dcrn, uint32_t data)
                    175: {
                    176:     if (ppc_dcr_write(env->dcr_env, dcrn, data) < 0)
                    177:         fprintf(stderr, "Write to unhandled DCR (0x%x)\n", dcrn);
                    178: 
                    179:     return 1;
                    180: }
                    181: 
                    182: int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run)
                    183: {
                    184:     int ret = 0;
                    185: 
                    186:     switch (run->exit_reason) {
                    187:     case KVM_EXIT_DCR:
                    188:         if (run->dcr.is_write) {
                    189:             dprintf("handle dcr write\n");
                    190:             ret = kvmppc_handle_dcr_write(env, run->dcr.dcrn, run->dcr.data);
                    191:         } else {
                    192:             dprintf("handle dcr read\n");
                    193:             ret = kvmppc_handle_dcr_read(env, run->dcr.dcrn, &run->dcr.data);
                    194:         }
                    195:         break;
                    196:     case KVM_EXIT_HLT:
                    197:         dprintf("handle halt\n");
                    198:         ret = kvmppc_handle_halt(env);
                    199:         break;
                    200:     }
                    201: 
                    202:     return ret;
                    203: }
                    204: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.