diff options
| author | Jason Gunthorpe <jgg@nvidia.com> | 2025-11-26 15:21:27 -0400 |
|---|---|---|
| committer | Joerg Roedel <joerg.roedel@amd.com> | 2025-11-27 12:46:10 +0100 |
| commit | 5de863efbf88d995fe96931c5e8f1325b1745b1d (patch) | |
| tree | 776f6a4dd5374a800201efecb6ce34ceba5f634c /drivers/iommu | |
| parent | 152c862c172162d1bed85bfb9ecdf62fec9e86ae (diff) | |
iommupt: Avoid a compiler bug with sw_bit
gcc 13, in some cases, gets confused if the __builtin_constant_p() is
inside the switch. It thinks that bitnr can have the value max+1 and
fails. Lift the check outside the switch to avoid it.
Fixes: ef7bfe5bbffd ("iommupt/x86: Support SW bits and permit PT_FEAT_DMA_INCOHERENT")
Fixes: 5448c1558f60 ("iommupt: Add the Intel VT-d second stage page table format")
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202511242012.I7g504Ab-lkp@intel.com/
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'drivers/iommu')
| -rw-r--r-- | drivers/iommu/generic_pt/fmt/vtdss.h | 8 | ||||
| -rw-r--r-- | drivers/iommu/generic_pt/fmt/x86_64.h | 8 |
2 files changed, 8 insertions, 8 deletions
diff --git a/drivers/iommu/generic_pt/fmt/vtdss.h b/drivers/iommu/generic_pt/fmt/vtdss.h index d9774848eb6f..50ffed9d0e50 100644 --- a/drivers/iommu/generic_pt/fmt/vtdss.h +++ b/drivers/iommu/generic_pt/fmt/vtdss.h @@ -174,6 +174,9 @@ static inline unsigned int vtdss_pt_max_sw_bit(struct pt_common *common) static inline u64 vtdss_pt_sw_bit(unsigned int bitnr) { + if (__builtin_constant_p(bitnr) && bitnr > 10) + BUILD_BUG(); + /* Bits marked Ignored in the specification */ switch (bitnr) { case 0: @@ -184,10 +187,7 @@ static inline u64 vtdss_pt_sw_bit(unsigned int bitnr) return BIT_ULL(63); /* Some bits in 9-3 are available in some entries */ default: - if (__builtin_constant_p(bitnr)) - BUILD_BUG(); - else - PT_WARN_ON(true); + PT_WARN_ON(true); return 0; } } diff --git a/drivers/iommu/generic_pt/fmt/x86_64.h b/drivers/iommu/generic_pt/fmt/x86_64.h index a86353f1481e..507abf2c934c 100644 --- a/drivers/iommu/generic_pt/fmt/x86_64.h +++ b/drivers/iommu/generic_pt/fmt/x86_64.h @@ -175,6 +175,9 @@ static inline unsigned int x86_64_pt_max_sw_bit(struct pt_common *common) static inline u64 x86_64_pt_sw_bit(unsigned int bitnr) { + if (__builtin_constant_p(bitnr) && bitnr > 12) + BUILD_BUG(); + /* Bits marked Ignored/AVL in the specification */ switch (bitnr) { case 0: @@ -185,10 +188,7 @@ static inline u64 x86_64_pt_sw_bit(unsigned int bitnr) return BIT_ULL((bitnr - 2) + 52); /* Some bits in 8,6,4,3 are available in some entries */ default: - if (__builtin_constant_p(bitnr)) - BUILD_BUG(); - else - PT_WARN_ON(true); + PT_WARN_ON(true); return 0; } } |
