diff mbox series

ACPI: PCI: check if the io space is page aligned

Message ID 20240814-check_pci_probe_res-v1-1-122ee07821ab@gmail.com (mailing list archive)
State Superseded, archived
Headers show
Series ACPI: PCI: check if the io space is page aligned | expand

Commit Message

Miao Wang via B4 Relay Aug. 13, 2024, 4:24 p.m. UTC
From: Miao Wang <shankerwangmiao@gmail.com>

When the IO resource given by _CRS method is not page aligned, serious
problems will happen because the mis-aligend address is passed down to
pci_remap_iospace, then to vmap_page_range, and finally to
vmap_pte_range, where the length bewteen addr and end is expected to be
divisible by PAGE_SIZE, or the loop will overrun till the pfn_none check
fails.

Signed-off-by: Miao Wang <shankerwangmiao@gmail.com>
---
 drivers/acpi/pci_root.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)


---
base-commit: 7c626ce4bae1ac14f60076d00eafe71af30450ba
change-id: 20240813-check_pci_probe_res-27e3e6df72b2

Best regards,

Comments

kernel test robot Aug. 16, 2024, 12:44 p.m. UTC | #1
Hi Miao,

kernel test robot noticed the following build errors:

[auto build test ERROR on 7c626ce4bae1ac14f60076d00eafe71af30450ba]

url:    https://github.com/intel-lab-lkp/linux/commits/Miao-Wang-via-B4-Relay/ACPI-PCI-check-if-the-io-space-is-page-aligned/20240815-003833
base:   7c626ce4bae1ac14f60076d00eafe71af30450ba
patch link:    https://lore.kernel.org/r/20240814-check_pci_probe_res-v1-1-122ee07821ab%40gmail.com
patch subject: [PATCH] ACPI: PCI: check if the io space is page aligned
config: arm64-defconfig (https://download.01.org/0day-ci/archive/20240816/202408162020.SGGpRl7q-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240816/202408162020.SGGpRl7q-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202408162020.SGGpRl7q-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from include/linux/device.h:15,
                    from include/linux/pm_runtime.h:11,
                    from drivers/acpi/pci_root.c:17:
   drivers/acpi/pci_root.c: In function 'acpi_pci_root_remap_iospace':
>> drivers/acpi/pci_root.c:873:31: error: incompatible type for argument 1 of '_dev_err'
     873 |                 dev_err(device->dev,
         |                         ~~~~~~^~~~~
         |                               |
         |                               struct device
   include/linux/dev_printk.h:110:25: note: in definition of macro 'dev_printk_index_wrap'
     110 |                 _p_func(dev, fmt, ##__VA_ARGS__);                       \
         |                         ^~~
   drivers/acpi/pci_root.c:873:17: note: in expansion of macro 'dev_err'
     873 |                 dev_err(device->dev,
         |                 ^~~~~~~
   include/linux/dev_printk.h:50:36: note: expected 'const struct device *' but argument is of type 'struct device'
      50 | void _dev_err(const struct device *dev, const char *fmt, ...);
         |               ~~~~~~~~~~~~~~~~~~~~~^~~


vim +/_dev_err +873 drivers/acpi/pci_root.c

   860	
   861	static void acpi_pci_root_remap_iospace(struct acpi_device *device,
   862				struct resource_entry *entry)
   863	{
   864	#ifdef PCI_IOBASE
   865		struct resource *res = entry->res;
   866		resource_size_t cpu_addr = res->start;
   867		resource_size_t pci_addr = cpu_addr - entry->offset;
   868		resource_size_t length = resource_size(res);
   869		unsigned long port;
   870	
   871		if (!PAGE_ALIGNED(cpu_addr) || !PAGE_ALIGNED(length) ||
   872			!PAGE_ALIGNED(pci_addr)) {
 > 873			dev_err(device->dev,
   874				FW_BUG "I/O resource %pR or its offset %pa is not page aligned\n",
   875				res, &entry->offset);
   876			goto err;
   877		}
   878	
   879		if (pci_register_io_range(&device->fwnode, cpu_addr, length))
   880			goto err;
   881	
   882		port = pci_address_to_pio(cpu_addr);
   883		if (port == (unsigned long)-1)
   884			goto err;
   885	
   886		res->start = port;
   887		res->end = port + length - 1;
   888		entry->offset = port - pci_addr;
   889	
   890		if (pci_remap_iospace(res, cpu_addr) < 0)
   891			goto err;
   892	
   893		pr_info("Remapped I/O %pa to %pR\n", &cpu_addr, res);
   894		return;
   895	err:
   896		res->flags |= IORESOURCE_DISABLED;
   897	#endif
   898	}
   899
kernel test robot Aug. 16, 2024, 12:44 p.m. UTC | #2
Hi Miao,

kernel test robot noticed the following build errors:

[auto build test ERROR on 7c626ce4bae1ac14f60076d00eafe71af30450ba]

url:    https://github.com/intel-lab-lkp/linux/commits/Miao-Wang-via-B4-Relay/ACPI-PCI-check-if-the-io-space-is-page-aligned/20240815-003833
base:   7c626ce4bae1ac14f60076d00eafe71af30450ba
patch link:    https://lore.kernel.org/r/20240814-check_pci_probe_res-v1-1-122ee07821ab%40gmail.com
patch subject: [PATCH] ACPI: PCI: check if the io space is page aligned
config: riscv-defconfig (https://download.01.org/0day-ci/archive/20240816/202408162021.HaTAkOvd-lkp@intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 26670e7fa4f032a019d23d56c6a02926e854e8af)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240816/202408162021.HaTAkOvd-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202408162021.HaTAkOvd-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from drivers/acpi/pci_root.c:18:
   In file included from include/linux/pci.h:38:
   In file included from include/linux/interrupt.h:22:
   In file included from arch/riscv/include/asm/sections.h:9:
   In file included from include/linux/mm.h:2228:
   include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     514 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
>> drivers/acpi/pci_root.c:873:11: error: passing 'struct device' to parameter of incompatible type 'const struct device *'; take the address with &
     873 |                 dev_err(device->dev,
         |                         ^~~~~~~~~~~
         |                         &
   include/linux/dev_printk.h:154:44: note: expanded from macro 'dev_err'
     154 |         dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
         |                                                   ^~~
   include/linux/dev_printk.h:110:11: note: expanded from macro 'dev_printk_index_wrap'
     110 |                 _p_func(dev, fmt, ##__VA_ARGS__);                       \
         |                         ^~~
   include/linux/dev_printk.h:50:36: note: passing argument to parameter 'dev' here
      50 | void _dev_err(const struct device *dev, const char *fmt, ...);
         |                                    ^
   1 warning and 1 error generated.


vim +873 drivers/acpi/pci_root.c

   860	
   861	static void acpi_pci_root_remap_iospace(struct acpi_device *device,
   862				struct resource_entry *entry)
   863	{
   864	#ifdef PCI_IOBASE
   865		struct resource *res = entry->res;
   866		resource_size_t cpu_addr = res->start;
   867		resource_size_t pci_addr = cpu_addr - entry->offset;
   868		resource_size_t length = resource_size(res);
   869		unsigned long port;
   870	
   871		if (!PAGE_ALIGNED(cpu_addr) || !PAGE_ALIGNED(length) ||
   872			!PAGE_ALIGNED(pci_addr)) {
 > 873			dev_err(device->dev,
   874				FW_BUG "I/O resource %pR or its offset %pa is not page aligned\n",
   875				res, &entry->offset);
   876			goto err;
   877		}
   878	
   879		if (pci_register_io_range(&device->fwnode, cpu_addr, length))
   880			goto err;
   881	
   882		port = pci_address_to_pio(cpu_addr);
   883		if (port == (unsigned long)-1)
   884			goto err;
   885	
   886		res->start = port;
   887		res->end = port + length - 1;
   888		entry->offset = port - pci_addr;
   889	
   890		if (pci_remap_iospace(res, cpu_addr) < 0)
   891			goto err;
   892	
   893		pr_info("Remapped I/O %pa to %pR\n", &cpu_addr, res);
   894		return;
   895	err:
   896		res->flags |= IORESOURCE_DISABLED;
   897	#endif
   898	}
   899
diff mbox series

Patch

diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
index d0bfb3706801..58fc64757bde 100644
--- a/drivers/acpi/pci_root.c
+++ b/drivers/acpi/pci_root.c
@@ -858,7 +858,7 @@  static void acpi_pci_root_validate_resources(struct device *dev,
 	}
 }
 
-static void acpi_pci_root_remap_iospace(struct fwnode_handle *fwnode,
+static void acpi_pci_root_remap_iospace(struct acpi_device *device,
 			struct resource_entry *entry)
 {
 #ifdef PCI_IOBASE
@@ -868,7 +868,15 @@  static void acpi_pci_root_remap_iospace(struct fwnode_handle *fwnode,
 	resource_size_t length = resource_size(res);
 	unsigned long port;
 
-	if (pci_register_io_range(fwnode, cpu_addr, length))
+	if (!PAGE_ALIGNED(cpu_addr) || !PAGE_ALIGNED(length) ||
+		!PAGE_ALIGNED(pci_addr)) {
+		dev_err(device->dev,
+			FW_BUG "I/O resource %pR or its offset %pa is not page aligned\n",
+			res, &entry->offset);
+		goto err;
+	}
+
+	if (pci_register_io_range(&device->fwnode, cpu_addr, length))
 		goto err;
 
 	port = pci_address_to_pio(cpu_addr);
@@ -910,7 +918,7 @@  int acpi_pci_probe_root_resources(struct acpi_pci_root_info *info)
 	else {
 		resource_list_for_each_entry_safe(entry, tmp, list) {
 			if (entry->res->flags & IORESOURCE_IO)
-				acpi_pci_root_remap_iospace(&device->fwnode,
+				acpi_pci_root_remap_iospace(device,
 						entry);
 
 			if (entry->res->flags & IORESOURCE_DISABLED)