aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/booke.c
diff options
context:
space:
mode:
authorBharat Bhushan <r65777@freescale.com>2013-02-24 13:57:12 -0500
committerAlexander Graf <agraf@suse.de>2013-03-21 20:21:06 -0400
commit78accda4f888c77122cf3da6185f905d4677eb07 (patch)
treee40f2b976f423830f9de074af923e19e3b0a230a /arch/powerpc/kvm/booke.c
parentd26f22c9cdfa935e674b2ff747dbcfaf9fa048f8 (diff)
KVM: PPC: Added one_reg interface for timer registers
If userspace wants to change some specific bits of TSR (timer status register) then it uses GET/SET_SREGS ioctl interface. So the steps will be: i) user-space will make get ioctl, ii) change TSR in userspace iii) then make set ioctl. It can happen that TSR gets changed by kernel after step i) and before step iii). To avoid this we have added below one_reg ioctls for oring and clearing specific bits in TSR. This patch adds one registerface for: 1) setting specific bit in TSR (timer status register) 2) clearing specific bit in TSR (timer status register) 3) setting/getting the TCR register. There are cases where we want to only change TCR and not TSR. Although we can uses SREGS without KVM_SREGS_E_UPDATE_TSR flag but I think one reg is better. I am open if someone feels we should use SREGS only here. 4) getting/setting TSR register Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'arch/powerpc/kvm/booke.c')
-rw-r--r--arch/powerpc/kvm/booke.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index f2fd47d35ab5..11825539e2b1 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -1442,6 +1442,12 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
1442 r = put_user(vcpu->arch.epcr, (u32 __user *)(long)reg->addr); 1442 r = put_user(vcpu->arch.epcr, (u32 __user *)(long)reg->addr);
1443 break; 1443 break;
1444#endif 1444#endif
1445 case KVM_REG_PPC_TCR:
1446 r = put_user(vcpu->arch.tcr, (u32 __user *)(long)reg->addr);
1447 break;
1448 case KVM_REG_PPC_TSR:
1449 r = put_user(vcpu->arch.tsr, (u32 __user *)(long)reg->addr);
1450 break;
1445 default: 1451 default:
1446 break; 1452 break;
1447 } 1453 }
@@ -1485,6 +1491,30 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
1485 break; 1491 break;
1486 } 1492 }
1487#endif 1493#endif
1494 case KVM_REG_PPC_OR_TSR: {
1495 u32 tsr_bits;
1496 r = get_user(tsr_bits, (u32 __user *)(long)reg->addr);
1497 kvmppc_set_tsr_bits(vcpu, tsr_bits);
1498 break;
1499 }
1500 case KVM_REG_PPC_CLEAR_TSR: {
1501 u32 tsr_bits;
1502 r = get_user(tsr_bits, (u32 __user *)(long)reg->addr);
1503 kvmppc_clr_tsr_bits(vcpu, tsr_bits);
1504 break;
1505 }
1506 case KVM_REG_PPC_TSR: {
1507 u32 tsr;
1508 r = get_user(tsr, (u32 __user *)(long)reg->addr);
1509 kvmppc_set_tsr(vcpu, tsr);
1510 break;
1511 }
1512 case KVM_REG_PPC_TCR: {
1513 u32 tcr;
1514 r = get_user(tcr, (u32 __user *)(long)reg->addr);
1515 kvmppc_set_tcr(vcpu, tcr);
1516 break;
1517 }
1488 default: 1518 default:
1489 break; 1519 break;
1490 } 1520 }