On 19.03.2013, at 18:26, Scott Wood wrote:

> On 03/19/2013 12:17:11 PM, Mihai Caraman wrote:
>> diff --git a/arch/powerpc/kvm/e500_mmu.c b/arch/powerpc/kvm/e500_mmu.c
>> index 66b6e31..b77b855 100644
>> --- a/arch/powerpc/kvm/e500_mmu.c
>> +++ b/arch/powerpc/kvm/e500_mmu.c
>> @@ -596,6 +596,95 @@ int kvmppc_set_sregs_e500_tlb(struct kvm_vcpu *vcpu, 
>> struct kvm_sregs *sregs)
>>      return 0;
>> }
>> +int kvmppc_get_one_reg_500_tlb(struct kvm_vcpu *vcpu, u64 id,
>> +                            union kvmppc_one_reg *val)
> 
> s/500/e500/
> 
>> +int kvmppc_set_one_reg_500_tlb(struct kvm_vcpu *vcpu, u64 id,
>> +                           union kvmppc_one_reg *val)
>> +{
>> +    int r = 0;
>> +    long int i;
>> +
>> +    switch (id) {
>> +    case KVM_REG_PPC_MAS0:
>> +            vcpu->arch.shared->mas0 = set_reg_val(id, *val);
>> +            break;
>> +    case KVM_REG_PPC_MAS1:
>> +            vcpu->arch.shared->mas1 = set_reg_val(id, *val);
>> +            break;
>> +    case KVM_REG_PPC_MAS2:
>> +            vcpu->arch.shared->mas2 = set_reg_val(id, *val);
>> +            break;
>> +    case KVM_REG_PPC_MAS7_3:
>> +            vcpu->arch.shared->mas7_3 = set_reg_val(id, *val);
>> +            break;
>> +    case KVM_REG_PPC_MAS4:
>> +            vcpu->arch.shared->mas4 = set_reg_val(id, *val);
>> +            break;
>> +    case KVM_REG_PPC_MAS6:
>> +            vcpu->arch.shared->mas6 = set_reg_val(id, *val);
>> +            break;
>> +    case KVM_REG_PPC_MMUCFG: {
>> +            u32 mmucfg = set_reg_val(id, *val);
>> +            vcpu->arch.mmucfg = mmucfg & ~MMUCFG_LPIDSIZE;
>> +            break;
>> +    }
> 
> Do we really want to allow arbitrary MMUCFG changes?  It won't magically make 
> us able to support larger RAs, PIDs, different MAVN, etc.

Only if we update the actual shadow mmu configuration as well.

> 
>> +    case KVM_REG_PPC_TLB0CFG:
>> +    case KVM_REG_PPC_TLB1CFG:
>> +    case KVM_REG_PPC_TLB2CFG:
>> +    case KVM_REG_PPC_TLB3CFG: {
>> +            u32 tlbncfg = set_reg_val(id, *val);                            
>> +            u32 geometry_mask = TLBnCFG_N_ENTRY | TLBnCFG_ASSOC;
>> +            i = id - KVM_REG_PPC_TLB0CFG;
>> +
>> +            /* MMU geometry (way/size) can be set only using SW_TLB */
>> +            if ((vcpu->arch.tlbcfg[i] & geometry_mask) !=
>> +                (tlbncfg & geometry_mask))
>> +                    r = -EINVAL;
>> +
>> +            vcpu->arch.tlbcfg[i] = set_reg_val(id, *val);
>> +            break;
>> +    }
> 
> Likewise -- just because QEMU sets a bit here doesn't mean KVM can support it.
> 
> I thought the initial plan for setting these config registers was to accept 
> it if it exactly matches what KVM already has, and give an error otherwise -- 
> thus allowing for the possibliity of accepting certain specific updates in 
> the future.

Yes, that was the idea :).


Alex

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to