diff options
Diffstat (limited to 'arch/ia64/kvm/vcpu.c')
-rw-r--r-- | arch/ia64/kvm/vcpu.c | 71 |
1 files changed, 66 insertions, 5 deletions
diff --git a/arch/ia64/kvm/vcpu.c b/arch/ia64/kvm/vcpu.c index a528d70a820..ecd526b5532 100644 --- a/arch/ia64/kvm/vcpu.c +++ b/arch/ia64/kvm/vcpu.c | |||
@@ -1651,7 +1651,8 @@ void vcpu_set_psr(struct kvm_vcpu *vcpu, unsigned long val) | |||
1651 | * Otherwise panic | 1651 | * Otherwise panic |
1652 | */ | 1652 | */ |
1653 | if (val & (IA64_PSR_PK | IA64_PSR_IS | IA64_PSR_VM)) | 1653 | if (val & (IA64_PSR_PK | IA64_PSR_IS | IA64_PSR_VM)) |
1654 | panic_vm(vcpu); | 1654 | panic_vm(vcpu, "Only support guests with vpsr.pk =0 \ |
1655 | & vpsr.is=0\n"); | ||
1655 | 1656 | ||
1656 | /* | 1657 | /* |
1657 | * For those IA64_PSR bits: id/da/dd/ss/ed/ia | 1658 | * For those IA64_PSR bits: id/da/dd/ss/ed/ia |
@@ -2104,7 +2105,7 @@ void kvm_init_all_rr(struct kvm_vcpu *vcpu) | |||
2104 | 2105 | ||
2105 | if (is_physical_mode(vcpu)) { | 2106 | if (is_physical_mode(vcpu)) { |
2106 | if (vcpu->arch.mode_flags & GUEST_PHY_EMUL) | 2107 | if (vcpu->arch.mode_flags & GUEST_PHY_EMUL) |
2107 | panic_vm(vcpu); | 2108 | panic_vm(vcpu, "Machine Status conflicts!\n"); |
2108 | 2109 | ||
2109 | ia64_set_rr((VRN0 << VRN_SHIFT), vcpu->arch.metaphysical_rr0); | 2110 | ia64_set_rr((VRN0 << VRN_SHIFT), vcpu->arch.metaphysical_rr0); |
2110 | ia64_dv_serialize_data(); | 2111 | ia64_dv_serialize_data(); |
@@ -2153,10 +2154,70 @@ int vmm_entry(void) | |||
2153 | return 0; | 2154 | return 0; |
2154 | } | 2155 | } |
2155 | 2156 | ||
2156 | void panic_vm(struct kvm_vcpu *v) | 2157 | static void kvm_show_registers(struct kvm_pt_regs *regs) |
2157 | { | 2158 | { |
2159 | unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri; | ||
2160 | |||
2161 | struct kvm_vcpu *vcpu = current_vcpu; | ||
2162 | if (vcpu != NULL) | ||
2163 | printk("vcpu 0x%p vcpu %d\n", | ||
2164 | vcpu, vcpu->vcpu_id); | ||
2165 | |||
2166 | printk("psr : %016lx ifs : %016lx ip : [<%016lx>]\n", | ||
2167 | regs->cr_ipsr, regs->cr_ifs, ip); | ||
2168 | |||
2169 | printk("unat: %016lx pfs : %016lx rsc : %016lx\n", | ||
2170 | regs->ar_unat, regs->ar_pfs, regs->ar_rsc); | ||
2171 | printk("rnat: %016lx bspstore: %016lx pr : %016lx\n", | ||
2172 | regs->ar_rnat, regs->ar_bspstore, regs->pr); | ||
2173 | printk("ldrs: %016lx ccv : %016lx fpsr: %016lx\n", | ||
2174 | regs->loadrs, regs->ar_ccv, regs->ar_fpsr); | ||
2175 | printk("csd : %016lx ssd : %016lx\n", regs->ar_csd, regs->ar_ssd); | ||
2176 | printk("b0 : %016lx b6 : %016lx b7 : %016lx\n", regs->b0, | ||
2177 | regs->b6, regs->b7); | ||
2178 | printk("f6 : %05lx%016lx f7 : %05lx%016lx\n", | ||
2179 | regs->f6.u.bits[1], regs->f6.u.bits[0], | ||
2180 | regs->f7.u.bits[1], regs->f7.u.bits[0]); | ||
2181 | printk("f8 : %05lx%016lx f9 : %05lx%016lx\n", | ||
2182 | regs->f8.u.bits[1], regs->f8.u.bits[0], | ||
2183 | regs->f9.u.bits[1], regs->f9.u.bits[0]); | ||
2184 | printk("f10 : %05lx%016lx f11 : %05lx%016lx\n", | ||
2185 | regs->f10.u.bits[1], regs->f10.u.bits[0], | ||
2186 | regs->f11.u.bits[1], regs->f11.u.bits[0]); | ||
2187 | |||
2188 | printk("r1 : %016lx r2 : %016lx r3 : %016lx\n", regs->r1, | ||
2189 | regs->r2, regs->r3); | ||
2190 | printk("r8 : %016lx r9 : %016lx r10 : %016lx\n", regs->r8, | ||
2191 | regs->r9, regs->r10); | ||
2192 | printk("r11 : %016lx r12 : %016lx r13 : %016lx\n", regs->r11, | ||
2193 | regs->r12, regs->r13); | ||
2194 | printk("r14 : %016lx r15 : %016lx r16 : %016lx\n", regs->r14, | ||
2195 | regs->r15, regs->r16); | ||
2196 | printk("r17 : %016lx r18 : %016lx r19 : %016lx\n", regs->r17, | ||
2197 | regs->r18, regs->r19); | ||
2198 | printk("r20 : %016lx r21 : %016lx r22 : %016lx\n", regs->r20, | ||
2199 | regs->r21, regs->r22); | ||
2200 | printk("r23 : %016lx r24 : %016lx r25 : %016lx\n", regs->r23, | ||
2201 | regs->r24, regs->r25); | ||
2202 | printk("r26 : %016lx r27 : %016lx r28 : %016lx\n", regs->r26, | ||
2203 | regs->r27, regs->r28); | ||
2204 | printk("r29 : %016lx r30 : %016lx r31 : %016lx\n", regs->r29, | ||
2205 | regs->r30, regs->r31); | ||
2206 | |||
2207 | } | ||
2208 | |||
2209 | void panic_vm(struct kvm_vcpu *v, const char *fmt, ...) | ||
2210 | { | ||
2211 | va_list args; | ||
2212 | char buf[256]; | ||
2213 | |||
2214 | struct kvm_pt_regs *regs = vcpu_regs(v); | ||
2158 | struct exit_ctl_data *p = &v->arch.exit_data; | 2215 | struct exit_ctl_data *p = &v->arch.exit_data; |
2159 | 2216 | va_start(args, fmt); | |
2217 | vsnprintf(buf, sizeof(buf), fmt, args); | ||
2218 | va_end(args); | ||
2219 | printk(buf); | ||
2220 | kvm_show_registers(regs); | ||
2160 | p->exit_reason = EXIT_REASON_VM_PANIC; | 2221 | p->exit_reason = EXIT_REASON_VM_PANIC; |
2161 | vmm_transition(v); | 2222 | vmm_transition(v); |
2162 | /*Never to return*/ | 2223 | /*Never to return*/ |