aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2014-04-29 07:36:21 -0400
committerAlexander Graf <agraf@suse.de>2014-05-30 08:26:23 -0400
commit2e23f544135e7b5fc2f0bcb6fa935c4b4f5058b2 (patch)
tree30e0d6ad02fdcc8433617b8d0889a41a380ac480
parente14e7a1e537d6e18f9c511f25c25c5efb7799fb5 (diff)
KVM: PPC: Book3S PR: Expose EBB registers
POWER8 introduces a new facility called the "Event Based Branch" facility. It contains of a few registers that indicate where a guest should branch to when a defined event occurs and it's in PR mode. We don't want to really enable EBB as it will create a big mess with !PR guest mode while hardware is in PR and we don't really emulate the PMU anyway. So instead, let's just leave it at emulation of all its registers. Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r--arch/powerpc/kvm/book3s.c18
-rw-r--r--arch/powerpc/kvm/book3s_emulate.c22
-rw-r--r--arch/powerpc/kvm/book3s_hv.c18
3 files changed, 40 insertions, 18 deletions
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index 4046a1a91a75..52c654dbd41a 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -637,6 +637,15 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
637 case KVM_REG_PPC_TAR: 637 case KVM_REG_PPC_TAR:
638 val = get_reg_val(reg->id, vcpu->arch.tar); 638 val = get_reg_val(reg->id, vcpu->arch.tar);
639 break; 639 break;
640 case KVM_REG_PPC_EBBHR:
641 val = get_reg_val(reg->id, vcpu->arch.ebbhr);
642 break;
643 case KVM_REG_PPC_EBBRR:
644 val = get_reg_val(reg->id, vcpu->arch.ebbrr);
645 break;
646 case KVM_REG_PPC_BESCR:
647 val = get_reg_val(reg->id, vcpu->arch.bescr);
648 break;
640 default: 649 default:
641 r = -EINVAL; 650 r = -EINVAL;
642 break; 651 break;
@@ -732,6 +741,15 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
732 case KVM_REG_PPC_TAR: 741 case KVM_REG_PPC_TAR:
733 vcpu->arch.tar = set_reg_val(reg->id, val); 742 vcpu->arch.tar = set_reg_val(reg->id, val);
734 break; 743 break;
744 case KVM_REG_PPC_EBBHR:
745 vcpu->arch.ebbhr = set_reg_val(reg->id, val);
746 break;
747 case KVM_REG_PPC_EBBRR:
748 vcpu->arch.ebbrr = set_reg_val(reg->id, val);
749 break;
750 case KVM_REG_PPC_BESCR:
751 vcpu->arch.bescr = set_reg_val(reg->id, val);
752 break;
735 default: 753 default:
736 r = -EINVAL; 754 r = -EINVAL;
737 break; 755 break;
diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c
index e8133e5e89c6..e1165bae693a 100644
--- a/arch/powerpc/kvm/book3s_emulate.c
+++ b/arch/powerpc/kvm/book3s_emulate.c
@@ -441,6 +441,17 @@ int kvmppc_core_emulate_mtspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
441 case SPRN_FSCR: 441 case SPRN_FSCR:
442 vcpu->arch.fscr = spr_val; 442 vcpu->arch.fscr = spr_val;
443 break; 443 break;
444#ifdef CONFIG_PPC_BOOK3S_64
445 case SPRN_BESCR:
446 vcpu->arch.bescr = spr_val;
447 break;
448 case SPRN_EBBHR:
449 vcpu->arch.ebbhr = spr_val;
450 break;
451 case SPRN_EBBRR:
452 vcpu->arch.ebbrr = spr_val;
453 break;
454#endif
444 case SPRN_ICTC: 455 case SPRN_ICTC:
445 case SPRN_THRM1: 456 case SPRN_THRM1:
446 case SPRN_THRM2: 457 case SPRN_THRM2:
@@ -551,6 +562,17 @@ int kvmppc_core_emulate_mfspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val
551 case SPRN_FSCR: 562 case SPRN_FSCR:
552 *spr_val = vcpu->arch.fscr; 563 *spr_val = vcpu->arch.fscr;
553 break; 564 break;
565#ifdef CONFIG_PPC_BOOK3S_64
566 case SPRN_BESCR:
567 *spr_val = vcpu->arch.bescr;
568 break;
569 case SPRN_EBBHR:
570 *spr_val = vcpu->arch.ebbhr;
571 break;
572 case SPRN_EBBRR:
573 *spr_val = vcpu->arch.ebbrr;
574 break;
575#endif
554 case SPRN_THRM1: 576 case SPRN_THRM1:
555 case SPRN_THRM2: 577 case SPRN_THRM2:
556 case SPRN_THRM3: 578 case SPRN_THRM3:
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index ee1d8ee5f1a7..3a9456165224 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -882,15 +882,6 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
882 case KVM_REG_PPC_PSPB: 882 case KVM_REG_PPC_PSPB:
883 *val = get_reg_val(id, vcpu->arch.pspb); 883 *val = get_reg_val(id, vcpu->arch.pspb);
884 break; 884 break;
885 case KVM_REG_PPC_EBBHR:
886 *val = get_reg_val(id, vcpu->arch.ebbhr);
887 break;
888 case KVM_REG_PPC_EBBRR:
889 *val = get_reg_val(id, vcpu->arch.ebbrr);
890 break;
891 case KVM_REG_PPC_BESCR:
892 *val = get_reg_val(id, vcpu->arch.bescr);
893 break;
894 case KVM_REG_PPC_DPDES: 885 case KVM_REG_PPC_DPDES:
895 *val = get_reg_val(id, vcpu->arch.vcore->dpdes); 886 *val = get_reg_val(id, vcpu->arch.vcore->dpdes);
896 break; 887 break;
@@ -1088,15 +1079,6 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
1088 case KVM_REG_PPC_PSPB: 1079 case KVM_REG_PPC_PSPB:
1089 vcpu->arch.pspb = set_reg_val(id, *val); 1080 vcpu->arch.pspb = set_reg_val(id, *val);
1090 break; 1081 break;
1091 case KVM_REG_PPC_EBBHR:
1092 vcpu->arch.ebbhr = set_reg_val(id, *val);
1093 break;
1094 case KVM_REG_PPC_EBBRR:
1095 vcpu->arch.ebbrr = set_reg_val(id, *val);
1096 break;
1097 case KVM_REG_PPC_BESCR:
1098 vcpu->arch.bescr = set_reg_val(id, *val);
1099 break;
1100 case KVM_REG_PPC_DPDES: 1082 case KVM_REG_PPC_DPDES:
1101 vcpu->arch.vcore->dpdes = set_reg_val(id, *val); 1083 vcpu->arch.vcore->dpdes = set_reg_val(id, *val);
1102 break; 1084 break;