RE: [PATCH v1 0/2] TM field check failed

2019-10-11 Thread Zhang, Qi1
Hello, everyone

May I know you have comments on this patch set? Thank you!

BRs
Qi Zhang
> -Original Message-
> From: Zhang, Qi1 
> Sent: Tuesday, October 8, 2019 10:35 AM
> To: qemu-devel@nongnu.org
> Cc: m...@redhat.com; marcel.apfelb...@gmail.com; pbonz...@redhat.com;
> r...@twiddle.net; ehabk...@redhat.com; Zhang, Qi1 ;
> Qi, Yadong 
> Subject: [PATCH v1 0/2] TM field check failed
> 
> From: "Zhang, Qi" 
> 
> spilt the reserved fields arrays and remove TM field from reserved bits
> 
> Changelog V1:
>   add descriptons
> 
> Zhang, Qi (2):
>   intel_iommu: split the resevred fields arrays into two ones
>   intel_iommu: TM field should not be in reserved bits
> 
>  hw/i386/intel_iommu.c  | 35 --
>  hw/i386/intel_iommu_internal.h | 17 +
>  2 files changed, 34 insertions(+), 18 deletions(-)
> 
> --
> 2.20.1




RE: [PATCH v4] intel_iommu: TM field should not be in reserved bits

2019-10-07 Thread Zhang, Qi1
Thank you! I formatted the patch with cover-letter and submitted them again. 

> -Original Message-
> From: Michael S. Tsirkin 
> Sent: Sunday, October 6, 2019 5:50 AM
> To: Zhang, Qi1 
> Cc: qemu-devel@nongnu.org; marcel.apfelb...@gmail.com;
> pbonz...@redhat.com; r...@twiddle.net; ehabk...@redhat.com; Qi, Yadong
> 
> Subject: Re: [PATCH v4] intel_iommu: TM field should not be in reserved bits
> 
> On Mon, Sep 30, 2019 at 01:04:51PM +0800, qi1.zh...@intel.com wrote:
> > From: "Zhang, Qi" 
> >
> > When dt is supported, TM field should not be Reserved(0).
> >
> > Refer to VT-d Spec 9.8
> >
> > Signed-off-by: Zhang, Qi 
> > Signed-off-by: Qi, Yadong 
> 
> I am guessing this is really a 2 patch series right?
> So you need to format it as such with
> git format-patch --cover-letter --thread=shallow
> 
> > ---
> >  hw/i386/intel_iommu.c  | 12 
> >  hw/i386/intel_iommu_internal.h | 17 +
> >  2 files changed, 21 insertions(+), 8 deletions(-)
> > ---
> > Changelog V2:
> >  move dt_supported flag to VTD_SPTE_PAGE_LX_RSVD_MASK and
> > VTD_SPTE_LPAGE_LX_RSVD_MASK Changelog V3:
> >  based on the change to split the arrays into two ones Changelog V4:
> >  style error check
> >
> > diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index
> > a118efaeaf..d62604ece3 100644
> > --- a/hw/i386/intel_iommu.c
> > +++ b/hw/i386/intel_iommu.c
> > @@ -3549,15 +3549,19 @@ static void vtd_init(IntelIOMMUState *s)
> >   * Rsvd field masks for spte
> >   */
> >  vtd_spte_rsvd[0] = ~0ULL;
> > -vtd_spte_rsvd[1] = VTD_SPTE_PAGE_L1_RSVD_MASK(s->aw_bits);
> > +vtd_spte_rsvd[1] = VTD_SPTE_PAGE_L1_RSVD_MASK(s->aw_bits,
> > +
> > + x86_iommu->dt_supported);
> >  vtd_spte_rsvd[2] = VTD_SPTE_PAGE_L2_RSVD_MASK(s->aw_bits);
> >  vtd_spte_rsvd[3] = VTD_SPTE_PAGE_L3_RSVD_MASK(s->aw_bits);
> >  vtd_spte_rsvd[4] = VTD_SPTE_PAGE_L4_RSVD_MASK(s->aw_bits);
> >
> >  vtd_spte_rsvd_large[0] = ~0ULL;
> > -vtd_spte_rsvd_large[1] = VTD_SPTE_LPAGE_L1_RSVD_MASK(s-
> >aw_bits);
> > -vtd_spte_rsvd_large[2] = VTD_SPTE_LPAGE_L2_RSVD_MASK(s-
> >aw_bits);
> > -vtd_spte_rsvd_large[3] = VTD_SPTE_LPAGE_L3_RSVD_MASK(s-
> >aw_bits);
> > +vtd_spte_rsvd_large[1] = VTD_SPTE_LPAGE_L1_RSVD_MASK(s-
> >aw_bits,
> > + 
> > x86_iommu->dt_supported);
> > +vtd_spte_rsvd_large[2] = VTD_SPTE_LPAGE_L2_RSVD_MASK(s-
> >aw_bits,
> > + 
> > x86_iommu->dt_supported);
> > +vtd_spte_rsvd_large[3] = VTD_SPTE_LPAGE_L3_RSVD_MASK(s-
> >aw_bits,
> > +
> > + x86_iommu->dt_supported);
> >  vtd_spte_rsvd_large[4] = VTD_SPTE_LPAGE_L4_RSVD_MASK(s-
> >aw_bits);
> >
> >  if (x86_iommu_ir_supported(x86_iommu)) { diff --git
> > a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
> > index c1235a7063..3a839a8925 100644
> > --- a/hw/i386/intel_iommu_internal.h
> > +++ b/hw/i386/intel_iommu_internal.h
> > @@ -387,7 +387,9 @@ typedef union VTDInvDesc VTDInvDesc;  #define
> > VTD_INV_DESC_DEVICE_IOTLB_RSVD_LO 0xffe0fff8
> >
> >  /* Rsvd field masks for spte */
> > -#define VTD_SPTE_PAGE_L1_RSVD_MASK(aw) \
> > +#define VTD_SPTE_PAGE_L1_RSVD_MASK(aw, dt_supported) \
> > +dt_supported ? \
> > +(0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM |
> VTD_SL_TM))
> > +: \
> >  (0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM))  #define
> > VTD_SPTE_PAGE_L2_RSVD_MASK(aw) \
> >  (0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM)) @@ -
> 395,11
> > +397,17 @@ typedef union VTDInvDesc VTDInvDesc;
> >  (0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM))  #define
> > VTD_SPTE_PAGE_L4_RSVD_MASK(aw) \
> >  (0x880ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM)) -#define
> > VTD_SPTE_LPAGE_L1_RSVD_MASK(aw) \
> > +#define VTD_SPTE_LPAGE_L1_RSVD_MASK(aw, dt_supported) \
> > +dt_supported ? \
> > +(0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM |
> VTD_SL_TM))
> > +: \
> >  (0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM)) -#define
> > VTD_SPTE_LPAGE_L2_RSVD_MASK(aw) \
> > +#define VTD_SPTE_LPAGE_L2_RSVD_MASK(aw, dt_supported) \
> > +dt_supported ? \
> > +(0x1ff800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM |
> > +VTD_SL_TM)) : \
> >  (0x1ff800ULL | ~(VTD_HAW_MASK(aw) 

RE: [PATCH V2] intel_iommu: TM field should not be in reserved bits

2019-09-28 Thread Zhang, Qi1


> -Original Message-
> From: Peter Xu 
> Sent: Sunday, September 29, 2019 10:02 AM
> To: Zhang, Qi1 
> Cc: qemu-devel@nongnu.org; ehabk...@redhat.com; m...@redhat.com;
> pbonz...@redhat.com; r...@twiddle.net; Qi, Yadong 
> Subject: Re: [PATCH V2] intel_iommu: TM field should not be in reserved bits
> 
> On Sun, Sep 29, 2019 at 01:11:12AM +, Zhang, Qi1 wrote:
> >
> >
> > > -Original Message-
> > > From: Peter Xu 
> > > Sent: Friday, September 27, 2019 5:32 PM
> > > To: Zhang, Qi1 
> > > Cc: qemu-devel@nongnu.org; ehabk...@redhat.com; m...@redhat.com;
> > > pbonz...@redhat.com; r...@twiddle.net; Qi, Yadong
> > > 
> > > Subject: Re: [PATCH V2] intel_iommu: TM field should not be in
> > > reserved bits
> > >
> > > On Fri, Sep 27, 2019 at 08:03:21AM +, Zhang, Qi1 wrote:
> > > >
> > > >
> > > > > -Original Message-
> > > > > From: Peter Xu 
> > > > > Sent: Friday, September 27, 2019 2:10 PM
> > > > > To: Zhang, Qi1 
> > > > > Cc: qemu-devel@nongnu.org; ehabk...@redhat.com;
> m...@redhat.com;
> > > > > pbonz...@redhat.com; r...@twiddle.net
> > > > > Subject: Re: [PATCH V2] intel_iommu: TM field should not be in
> > > > > reserved bits
> > > > >
> > > > > On Fri, Sep 27, 2019 at 12:58:38PM +0800, qi1.zh...@intel.com wrote:
> > > > > > From: "Zhang, Qi" 
> > > > > >
> > > > > > When dt is supported, TM field should not be Reserved(0).
> > > > > >
> > > > > > Refer to VT-d Spec 9.8
> > > > > >
> > > > > > Signed-off-by: Zhang, Qi 
> > > > > > Signed-off-by: Qi, Yadong 
> > > > > > ---
> > > > > >  hw/i386/intel_iommu.c  | 12 ++--
> > > > > >  hw/i386/intel_iommu_internal.h | 25 +++--
> > > > > >  2 files changed, 25 insertions(+), 12 deletions(-)
> > > > > > ---
> > > VTD_SPTE_PAGE_L2_RSVD_MASK(s-
> > > > > >aw_bits);
> > > > > > -vtd_paging_entry_rsvd_field[3] =
> > > > > >aw_bits);
> > > > > > +vtd_paging_entry_rsvd_field[5] =
> > > > > VTD_SPTE_LPAGE_L1_RSVD_MASK(s->aw_bits, x86_iommu-
> > > > > >dt_supported);
> > > > > > +vtd_paging_entry_rsvd_field[6] =
> > > > > VTD_SPTE_LPAGE_L2_RSVD_MASK(s->aw_bits, x86_iommu-
> > > > > >dt_supported);
> > > > > > +vtd_paging_entry_rsvd_field[7] =
> > > > > > + VTD_SPTE_LPAGE_L3_RSVD_MASK(s->aw_bits, x86_iommu-
> > > > > >dt_supported);
> > > > > >  vtd_paging_entry_rsvd_field[8] =
> > > > > >VTD_SPTE_LPAGE_L4_RSVD_MASK(s->aw_bits);
> > > > >
> > > > > Should this TM bit only affects leaves?  Say, entry 1 (4K), 5 (2M), 6
> (1G).
> 
> [1]
> 
> > > > > While this reminded me that I'm totally confused on why we have
> > > > > had entry 7, 8 after all...  Are they really used?
> > > > Yes. TM bit only affects. To this array, index 1, 5,6,7 may be
> > > > leaf. Will update
> > > a new patchset for it.
> > >
> > > Could I ask why index 7 may be leaf?
> > Index 7 is PDPE 1G GB leaf.
> 
> I thought 1G was index 6.  I've listed my understanding above [1].
> Would you please double confirm?  Thanks,
Check the existing function. When level is 3 VTD_SL_PDP_LEVEL and the entry is 
leaf, it is PDPE 1G leaf and the corresponding index of this array 7.

static bool vtd_slpte_nonzero_rsvd(uint64_t slpte, uint32_t level)
{
if (slpte & VTD_SL_PT_PAGE_SIZE_MASK) {
/* Maybe large page */
return slpte & vtd_paging_entry_rsvd_field[level + 4];
} else {
return slpte & vtd_paging_entry_rsvd_field[level];
}
}
> 
> --
> Peter Xu


RE: [PATCH V2] intel_iommu: TM field should not be in reserved bits

2019-09-28 Thread Zhang, Qi1


> -Original Message-
> From: Peter Xu 
> Sent: Friday, September 27, 2019 5:32 PM
> To: Zhang, Qi1 
> Cc: qemu-devel@nongnu.org; ehabk...@redhat.com; m...@redhat.com;
> pbonz...@redhat.com; r...@twiddle.net; Qi, Yadong 
> Subject: Re: [PATCH V2] intel_iommu: TM field should not be in reserved bits
> 
> On Fri, Sep 27, 2019 at 08:03:21AM +, Zhang, Qi1 wrote:
> >
> >
> > > -Original Message-
> > > From: Peter Xu 
> > > Sent: Friday, September 27, 2019 2:10 PM
> > > To: Zhang, Qi1 
> > > Cc: qemu-devel@nongnu.org; ehabk...@redhat.com; m...@redhat.com;
> > > pbonz...@redhat.com; r...@twiddle.net
> > > Subject: Re: [PATCH V2] intel_iommu: TM field should not be in
> > > reserved bits
> > >
> > > On Fri, Sep 27, 2019 at 12:58:38PM +0800, qi1.zh...@intel.com wrote:
> > > > From: "Zhang, Qi" 
> > > >
> > > > When dt is supported, TM field should not be Reserved(0).
> > > >
> > > > Refer to VT-d Spec 9.8
> > > >
> > > > Signed-off-by: Zhang, Qi 
> > > > Signed-off-by: Qi, Yadong 
> > > > ---
> > > >  hw/i386/intel_iommu.c  | 12 ++--
> > > >  hw/i386/intel_iommu_internal.h | 25 +++--
> > > >  2 files changed, 25 insertions(+), 12 deletions(-)
> > > > ---
> VTD_SPTE_PAGE_L2_RSVD_MASK(s-
> > > >aw_bits);
> > > > -vtd_paging_entry_rsvd_field[3] =
> > > >aw_bits);
> > > > +vtd_paging_entry_rsvd_field[5] =
> > > VTD_SPTE_LPAGE_L1_RSVD_MASK(s->aw_bits, x86_iommu-
> > > >dt_supported);
> > > > +vtd_paging_entry_rsvd_field[6] =
> > > VTD_SPTE_LPAGE_L2_RSVD_MASK(s->aw_bits, x86_iommu-
> > > >dt_supported);
> > > > +vtd_paging_entry_rsvd_field[7] =
> > > > + VTD_SPTE_LPAGE_L3_RSVD_MASK(s->aw_bits, x86_iommu-
> > > >dt_supported);
> > > >  vtd_paging_entry_rsvd_field[8] =
> > > >VTD_SPTE_LPAGE_L4_RSVD_MASK(s->aw_bits);
> > >
> > > Should this TM bit only affects leaves?  Say, entry 1 (4K), 5 (2M), 6 
> > > (1G).
> > > While this reminded me that I'm totally confused on why we have had
> > > entry 7, 8 after all...  Are they really used?
> > Yes. TM bit only affects. To this array, index 1, 5,6,7 may be leaf. Will 
> > update
> a new patchset for it.
> 
> Could I ask why index 7 may be leaf?
Index 7 is PDPE 1G GB leaf.
> 
> > >
> > > >
> > > >  if (x86_iommu_ir_supported(x86_iommu)) { diff --git
> > > > a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
> > > > index c1235a7063..01f1aa6c86 100644
> > > > --- a/hw/i386/intel_iommu_internal.h
> > > > +++ b/hw/i386/intel_iommu_internal.h
> > > > @@ -387,19 +387,31 @@ typedef union VTDInvDesc VTDInvDesc;
> > > > #define VTD_INV_DESC_DEVICE_IOTLB_RSVD_LO 0xffe0fff8
> > > >
> > > >  /* Rsvd field masks for spte */
> > > > -#define VTD_SPTE_PAGE_L1_RSVD_MASK(aw) \
> > > > +#define VTD_SPTE_PAGE_L1_RSVD_MASK(aw, dt_supported) \
> > > > +dt_supported? \
> > > > +(0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM |
> > > VTD_SL_TM))
> > > > +: \
> > > >  (0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM))
> > >
> > > This seems strange too in that ~VTD_HAW_MASK(aw) probably covered
> > > bits
> > > 63-48 for aw==48 case so it should already cover VTD_SL_TM?
> > VTD_SL_IGN_COM 0xbff0ULL, TM field is cleared by ~
> > VTD_SL_IGN_COM
> > >
> > > Meanwhile when I'm reading the spec I see at least bits 61-52
> > > ignored rather than reserved.
> > Yes. Bit 61~52 is ignored. Such as the index 5 of this array is 
> > 0xfff800800.
> 
> Oops, my poor eye obviously didn't see that the "~" operator is applied over
> the whole (VTD_HAW_MASK(aw) | VTD_SL_IGN_COM)... :)
> 
> Btw, you should only touch up the macros that are leaves here.
> Non-leaves should still keep that bit as reserved.
Yes. I will.
> 
> Thanks,
> 
> --
> Peter Xu


RE: [PATCH V2] intel_iommu: TM field should not be in reserved bits

2019-09-27 Thread Zhang, Qi1


> -Original Message-
> From: Peter Xu 
> Sent: Friday, September 27, 2019 2:10 PM
> To: Zhang, Qi1 
> Cc: qemu-devel@nongnu.org; ehabk...@redhat.com; m...@redhat.com;
> pbonz...@redhat.com; r...@twiddle.net
> Subject: Re: [PATCH V2] intel_iommu: TM field should not be in reserved bits
> 
> On Fri, Sep 27, 2019 at 12:58:38PM +0800, qi1.zh...@intel.com wrote:
> > From: "Zhang, Qi" 
> >
> > When dt is supported, TM field should not be Reserved(0).
> >
> > Refer to VT-d Spec 9.8
> >
> > Signed-off-by: Zhang, Qi 
> > Signed-off-by: Qi, Yadong 
> > ---
> >  hw/i386/intel_iommu.c  | 12 ++--
> >  hw/i386/intel_iommu_internal.h | 25 +++--
> >  2 files changed, 25 insertions(+), 12 deletions(-)
> > ---
> > Changelog V2:
> >  move dt_supported flag to VTD_SPTE_PAGE_LX_RSVD_MASK and
> > VTD_SPTE_LPAGE_LX_RSVD_MASK
> >
> > diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index
> > f1de8fdb75..35222cf55c 100644
> > --- a/hw/i386/intel_iommu.c
> > +++ b/hw/i386/intel_iommu.c
> > @@ -3548,13 +3548,13 @@ static void vtd_init(IntelIOMMUState *s)
> >   * Rsvd field masks for spte
> >   */
> >  vtd_paging_entry_rsvd_field[0] = ~0ULL;
> > -vtd_paging_entry_rsvd_field[1] = VTD_SPTE_PAGE_L1_RSVD_MASK(s-
> >aw_bits);
> > -vtd_paging_entry_rsvd_field[2] = VTD_SPTE_PAGE_L2_RSVD_MASK(s-
> >aw_bits);
> > -vtd_paging_entry_rsvd_field[3] = VTD_SPTE_PAGE_L3_RSVD_MASK(s-
> >aw_bits);
> > +vtd_paging_entry_rsvd_field[1] = VTD_SPTE_PAGE_L1_RSVD_MASK(s-
> >aw_bits, x86_iommu->dt_supported);
> > +vtd_paging_entry_rsvd_field[2] = VTD_SPTE_PAGE_L2_RSVD_MASK(s-
> >aw_bits, x86_iommu->dt_supported);
> > +vtd_paging_entry_rsvd_field[3] =
> > + VTD_SPTE_PAGE_L3_RSVD_MASK(s->aw_bits, x86_iommu-
> >dt_supported);
> >  vtd_paging_entry_rsvd_field[4] = VTD_SPTE_PAGE_L4_RSVD_MASK(s-
> >aw_bits);
> > -vtd_paging_entry_rsvd_field[5] = VTD_SPTE_LPAGE_L1_RSVD_MASK(s-
> >aw_bits);
> > -vtd_paging_entry_rsvd_field[6] = VTD_SPTE_LPAGE_L2_RSVD_MASK(s-
> >aw_bits);
> > -vtd_paging_entry_rsvd_field[7] = VTD_SPTE_LPAGE_L3_RSVD_MASK(s-
> >aw_bits);
> > +vtd_paging_entry_rsvd_field[5] =
> VTD_SPTE_LPAGE_L1_RSVD_MASK(s->aw_bits, x86_iommu-
> >dt_supported);
> > +vtd_paging_entry_rsvd_field[6] =
> VTD_SPTE_LPAGE_L2_RSVD_MASK(s->aw_bits, x86_iommu-
> >dt_supported);
> > +vtd_paging_entry_rsvd_field[7] =
> > + VTD_SPTE_LPAGE_L3_RSVD_MASK(s->aw_bits, x86_iommu-
> >dt_supported);
> >  vtd_paging_entry_rsvd_field[8] =
> > VTD_SPTE_LPAGE_L4_RSVD_MASK(s->aw_bits);
> 
> Should this TM bit only affects leaves?  Say, entry 1 (4K), 5 (2M), 6 (1G).
> While this reminded me that I'm totally confused on why we have had entry
> 7, 8 after all...  Are they really used?
Yes. TM bit only affects. To this array, index 1, 5,6,7 may be leaf. Will 
update a new patchset for it.
> 
> >
> >  if (x86_iommu_ir_supported(x86_iommu)) { diff --git
> > a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
> > index c1235a7063..01f1aa6c86 100644
> > --- a/hw/i386/intel_iommu_internal.h
> > +++ b/hw/i386/intel_iommu_internal.h
> > @@ -387,19 +387,31 @@ typedef union VTDInvDesc VTDInvDesc;  #define
> > VTD_INV_DESC_DEVICE_IOTLB_RSVD_LO 0xffe0fff8
> >
> >  /* Rsvd field masks for spte */
> > -#define VTD_SPTE_PAGE_L1_RSVD_MASK(aw) \
> > +#define VTD_SPTE_PAGE_L1_RSVD_MASK(aw, dt_supported) \
> > +dt_supported? \
> > +(0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM |
> VTD_SL_TM))
> > +: \
> >  (0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM))
> 
> This seems strange too in that ~VTD_HAW_MASK(aw) probably covered bits
> 63-48 for aw==48 case so it should already cover VTD_SL_TM?
VTD_SL_IGN_COM 0xbff0ULL, TM field is cleared by ~ VTD_SL_IGN_COM
> 
> Meanwhile when I'm reading the spec I see at least bits 61-52 ignored rather
> than reserved.
Yes. Bit 61~52 is ignored. Such as the index 5 of this array is 0xfff800800.
> 
> Thanks,
> 
> > -#define VTD_SPTE_PAGE_L2_RSVD_MASK(aw) \
> > +#define VTD_SPTE_PAGE_L2_RSVD_MASK(aw, dt_supported) \
> > +dt_supported? \
> > +(0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM |
> VTD_SL_TM))
> > +: \
> >  (0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM)) -#define
> > VTD_SPTE_PAGE_L3_RSVD_MASK(aw) \
> > +#define VTD_SPTE_PAGE_L3_RSVD_MASK(aw, dt_supported) \
> > +dt_suppo