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, ®s); |
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