Re: [bug report] KVM: s390: vsie: support transactional execution

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 30.04.2018 16:29, Cornelia Huck wrote:
> On Mon, 30 Apr 2018 17:04:35 +0300
> Dan Carpenter <dan.carpenter@xxxxxxxxxx> wrote:
> 
> [sent to David's current address]
> 
>> [ Old warnings because this is non-x86 - dan ]
>>
>> Hello David Hildenbrand,
>>
>> The patch 166ecb3d3cfe: "KVM: s390: vsie: support transactional
>> execution" from Nov 25, 2015, leads to the following static checker
>> warning:
>>
>> 	arch/s390/kvm/vsie.c:581 pin_blocks()
>> 	warn: was expecting a 64 bit value instead of '~8191'
>>
>> arch/s390/kvm/vsie.c
>>    548  static int pin_blocks(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
>>    549  {
>>    550          struct kvm_s390_sie_block *scb_o = vsie_page->scb_o;
>>    551          struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s;
>>    552          hpa_t hpa;
>>    553          gpa_t gpa;
>>                 ^^^^^
>> gpa_t is a u64.
>>
>>    554          int rc = 0;
>>    555  
>>    556          gpa = READ_ONCE(scb_o->scaol) & ~0xfUL;
>>    557          if (test_kvm_cpu_feat(vcpu->kvm, KVM_S390_VM_CPU_FEAT_64BSCAO))
>>    558                  gpa |= (u64) READ_ONCE(scb_o->scaoh) << 32;
>>    559          if (gpa) {
>>    560                  if (!(gpa & ~0x1fffUL))
>>    561                          rc = set_validity_icpt(scb_s, 0x0038U);
>>    562                  else if ((gpa & ~0x1fffUL) == kvm_s390_get_prefix(vcpu))
>>    563                          rc = set_validity_icpt(scb_s, 0x0011U);
>>    564                  else if ((gpa & PAGE_MASK) !=
>>    565                           ((gpa + sizeof(struct bsca_block) - 1) & PAGE_MASK))
>>    566                          rc = set_validity_icpt(scb_s, 0x003bU);
>>    567                  if (!rc) {
>>    568                          rc = pin_guest_page(vcpu->kvm, gpa, &hpa);
>>    569                          if (rc)
>>    570                                  rc = set_validity_icpt(scb_s, 0x0034U);
>>    571                  }
>>    572                  if (rc)
>>    573                          goto unpin;
>>    574                  vsie_page->sca_gpa = gpa;
>>    575                  scb_s->scaoh = (u32)((u64)hpa >> 32);
>>    576                  scb_s->scaol = (u32)(u64)hpa;
>>    577          }
>>    578  
>>    579          gpa = READ_ONCE(scb_o->itdba) & ~0xffUL;
>>                                                  ^^^^^
>> Here it's UL.
>>
>>    580          if (gpa && (scb_s->ecb & ECB_TE)) {
>>    581                  if (!(gpa & ~0x1fffU)) {
>>                                    ^^^^^^^^^
>> But here it's u32.  So the high 32 bits are not considered.  Possibly it
>> doesn't matter?

/me trying to remember what the young David wanted to achieve here

(Christian, can you double check in the SIE documentation, I assume the
last 13 bits of the address must not be set because of alignment, right?
Unfortunately I don't remember)

0x1fffU ->  0x0000000000001fffULL
~0x1fffU -> 0x00000000ffffe000ULL

Now, if we have an address like 100001fff

gpa = 100001fff
!(gpa & ~0x1fffU) -> 1
!(gpa & ~0x1fffUL) -> 0

So we would not get equal results.

Three years later, I would simply have written this as
if (gpa & 0x1fffUL)

Then, also the mussing "L" would not have mattered.

But anyhow: While this looks like a BUG, I expect it to not be
triggerable (is that a word?) because we have a safety net: We forward
the offset in the page to the SIE. The SIE will perform the same check
again on our calculated address. It will trigger a validity intercept
for us that we silently forward.

Dan, whatever tool you're using, nice work! Thanks a lot!


>>
>>    582                          rc = set_validity_icpt(scb_s, 0x0080U);
>>    583                          goto unpin;
>>    584                  }
>>    585                  /* 256 bytes cannot cross page boundaries */
>>    586                  rc = pin_guest_page(vcpu->kvm, gpa, &hpa);
>>    587                  if (rc) {
>>    588                          rc = set_validity_icpt(scb_s, 0x0080U);
>>    589                          goto unpin;
>>    590                  }
>>    591                  vsie_page->itdba_gpa = gpa;
>>    592                  scb_s->itdba = hpa;
>>
>> regards,
>> dan carpenter
> 


-- 

Thanks,

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



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Kernel Development]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Info]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Linux Media]     [Device Mapper]

  Powered by Linux