Revision ba5e5090 target-ppc/kvm.c

b/target-ppc/kvm.c
98 98
int kvm_arch_get_registers(CPUState *env)
99 99
{
100 100
    struct kvm_regs regs;
101
    struct kvm_sregs sregs;
101 102
    uint32_t i, ret;
102 103

  
103 104
    ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, &regs);
104 105
    if (ret < 0)
105 106
        return ret;
106 107

  
108
    ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs);
109
    if (ret < 0)
110
        return ret;
111

  
107 112
    env->ctr = regs.ctr;
108 113
    env->lr = regs.lr;
109 114
    env->xer = regs.xer;
......
125 130
    for (i = 0;i < 32; i++)
126 131
        env->gpr[i] = regs.gpr[i];
127 132

  
133
#ifdef KVM_CAP_PPC_SEGSTATE
134
    if (kvm_check_extension(env->kvm_state, KVM_CAP_PPC_SEGSTATE)) {
135
        env->sdr1 = sregs.u.s.sdr1;
136

  
137
        /* Sync SLB */
138
        for (i = 0; i < 64; i++) {
139
            ppc_store_slb(env, sregs.u.s.ppc64.slb[i].slbe,
140
                               sregs.u.s.ppc64.slb[i].slbv);
141
        }
142

  
143
        /* Sync SRs */
144
        for (i = 0; i < 16; i++) {
145
            env->sr[i] = sregs.u.s.ppc32.sr[i];
146
        }
147

  
148
        /* Sync BATs */
149
        for (i = 0; i < 8; i++) {
150
            env->DBAT[0][i] = sregs.u.s.ppc32.dbat[i] & 0xffffffff;
151
            env->DBAT[1][i] = sregs.u.s.ppc32.dbat[i] >> 32;
152
            env->IBAT[0][i] = sregs.u.s.ppc32.ibat[i] & 0xffffffff;
153
            env->IBAT[1][i] = sregs.u.s.ppc32.ibat[i] >> 32;
154
        }
155
    }
156
#endif
157

  
128 158
    return 0;
129 159
}
130 160

  

Also available in: Unified diff