From 5f03074ea98b64b55c133b35ee144fdc909e6d69 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Thu, 24 May 2012 08:52:22 +0200 Subject: resource: store 'end' instead of 'size' in struct resource Storing the size instead of the resource end in struct resource was a mistake. 'size' ranges from 0 to UINT[32|64]_MAX + 1 which obviously leads to problems. 'end' on the other hand will never exceed UINT[32|64]_MAX. Also this way we can express a iomem region covering the whole address space. Signed-off-by: Sascha Hauer --- arch/arm/boards/nhk8815/setup.c | 6 +++--- arch/arm/boards/pcm038/pcm970.c | 2 +- arch/arm/lib/bootm.c | 8 +++---- arch/arm/mach-at91/at91sam9260_devices.c | 4 ++-- arch/arm/mach-at91/at91sam9263_devices.c | 4 ++-- arch/arm/mach-at91/at91sam9g45_devices.c | 4 ++-- arch/arm/mach-at91/at91sam9x5_devices.c | 4 ++-- arch/arm/mach-imx/include/mach/devices-imx51.h | 4 ++-- arch/arm/mach-imx/include/mach/devices-imx53.h | 4 ++-- arch/nios2/boards/generic/generic.c | 6 +++--- commands/bootm.c | 6 ++---- commands/iomem.c | 3 +-- commands/mem.c | 2 +- common/memory.c | 4 ++-- common/resource.c | 30 +++++++++++++++----------- common/uimage.c | 6 +++--- drivers/base/driver.c | 4 ++-- drivers/base/resource.c | 14 ++++++------ drivers/usb/host/ohci-at91.c | 2 +- drivers/video/fb.c | 4 ++-- fs/devfs.c | 2 +- fs/fs.c | 4 ++-- include/linux/ioport.h | 8 +++---- 23 files changed, 68 insertions(+), 67 deletions(-) diff --git a/arch/arm/boards/nhk8815/setup.c b/arch/arm/boards/nhk8815/setup.c index 173892acd8..ccc0510555 100644 --- a/arch/arm/boards/nhk8815/setup.c +++ b/arch/arm/boards/nhk8815/setup.c @@ -55,15 +55,15 @@ static struct nomadik_nand_platform_data nhk8815_nand_data = { static struct resource nhk8815_nand_resources[] = { { .start = NAND_IO_ADDR, - .size = 0xfff, + .end = NAND_IO_ADDR + 0xfff, .flags = IORESOURCE_MEM, }, { .start = NAND_IO_CMD, - .size = 0xfff, + .end = NAND_IO_CMD + 0xfff, .flags = IORESOURCE_MEM, }, { .start = NAND_IO_DATA, - .size = 0xfff, + .end = NAND_IO_CMD + 0xfff, .flags = IORESOURCE_MEM, } }; diff --git a/arch/arm/boards/pcm038/pcm970.c b/arch/arm/boards/pcm038/pcm970.c index ca10afb8ca..df9b8521ea 100644 --- a/arch/arm/boards/pcm038/pcm970.c +++ b/arch/arm/boards/pcm038/pcm970.c @@ -55,7 +55,7 @@ static void pcm970_usbh2_init(void) static struct resource pcm970_ide_resources[] = { { .start = IMX_PCMCIA_MEM_BASE, - .size = SZ_1K, + .end = IMX_PCMCIA_MEM_BASE + SZ_1K - 1, .flags = IORESOURCE_MEM, }, }; diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c index 033e2eb15b..3a00437069 100644 --- a/arch/arm/lib/bootm.c +++ b/arch/arm/lib/bootm.c @@ -80,7 +80,7 @@ static int __do_bootm_linux(struct image_data *data, int swap) if (data->initrd_res) { initrd_start = data->initrd_res->start; - initrd_size = data->initrd_res->size; + initrd_size = resource_size(data->initrd_res); } if (bootm_verbose(data)) { @@ -154,7 +154,7 @@ static int do_bootz_linux_fdt(int fd, struct image_data *data) } } else { - of_res = request_sdram_region("oftree", r->start + r->size, end); + of_res = request_sdram_region("oftree", r->start + resource_size(r), end); if (!of_res) { perror("zImage: oftree request_sdram_region"); return -ENOMEM; @@ -310,9 +310,9 @@ static int aimage_load_resource(int fd, struct resource *r, void* buf, int ps) { int ret; void *image = (void *)r->start; - unsigned to_read = ps - r->size % ps; + unsigned to_read = ps - resource_size(r) % ps; - ret = read_full(fd, image, r->size); + ret = read_full(fd, image, resource_size(r)); if (ret < 0) return ret; diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 3297a89f37..b56ca14d1d 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c @@ -111,12 +111,12 @@ void at91_add_device_eth(int id, struct at91_ether_platform_data *data) {} static struct resource nand_resources[] = { [0] = { .start = AT91_CHIPSELECT_3, - .size = SZ_256M, + .end = AT91_CHIPSELECT_3 + SZ_256M - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = AT91_BASE_SYS + AT91_ECC, - .size = 512, + .end = AT91_BASE_SYS + AT91_ECC + 512 - 1, .flags = IORESOURCE_MEM, } }; diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 2ebc4da596..7f916d21a4 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -113,12 +113,12 @@ void at91_add_device_eth(int id, struct at91_ether_platform_data *data) {} static struct resource nand_resources[] = { [0] = { .start = AT91_CHIPSELECT_3, - .size = SZ_256M, + .end = AT91_CHIPSELECT_3 + SZ_256M - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = AT91_BASE_SYS + AT91_ECC0, - .size = 512, + .end = AT91_BASE_SYS + AT91_ECC0 + 512 - 1, .flags = IORESOURCE_MEM, } }; diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index d406bcc4bf..22b455e1a9 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c @@ -93,12 +93,12 @@ void at91_add_device_eth(int id, struct at91_ether_platform_data *data) {} static struct resource nand_resources[] = { [0] = { .start = AT91_CHIPSELECT_3, - .size = SZ_256M, + .end = AT91_CHIPSELECT_3 + SZ_256M - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = AT91_BASE_SYS + AT91_ECC, - .size = 512, + .end = AT91_BASE_SYS + AT91_ECC + 512 - 1, .flags = IORESOURCE_MEM, } }; diff --git a/arch/arm/mach-at91/at91sam9x5_devices.c b/arch/arm/mach-at91/at91sam9x5_devices.c index 50bad7f780..26a380d2ce 100644 --- a/arch/arm/mach-at91/at91sam9x5_devices.c +++ b/arch/arm/mach-at91/at91sam9x5_devices.c @@ -130,12 +130,12 @@ void at91_add_device_eth(int id, struct at91_ether_platform_data *data) {} static struct resource nand_resources[] = { [0] = { .start = AT91_CHIPSELECT_3, - .size = SZ_256M, + .end = AT91_CHIPSELECT_3 + SZ_256M - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = AT91_BASE_SYS + AT91_PMECC, - .size = 512, + .end = AT91_BASE_SYS + AT91_PMECC + 512 - 1, .flags = IORESOURCE_MEM, } }; diff --git a/arch/arm/mach-imx/include/mach/devices-imx51.h b/arch/arm/mach-imx/include/mach/devices-imx51.h index 5de0fa776c..dbf58622c9 100644 --- a/arch/arm/mach-imx/include/mach/devices-imx51.h +++ b/arch/arm/mach-imx/include/mach/devices-imx51.h @@ -67,11 +67,11 @@ static inline struct device_d *imx51_add_nand(struct imx_nand_platform_data *pda struct resource res[] = { { .start = MX51_NFC_BASE_ADDR, - .size = SZ_4K, + .end = MX51_NFC_BASE_ADDR + SZ_4K - 1, .flags = IORESOURCE_MEM, }, { .start = MX51_NFC_AXI_BASE_ADDR, - .size = SZ_4K, + .end = MX51_NFC_AXI_BASE_ADDR + SZ_4K - 1, .flags = IORESOURCE_MEM, }, }; diff --git a/arch/arm/mach-imx/include/mach/devices-imx53.h b/arch/arm/mach-imx/include/mach/devices-imx53.h index a9fe454d39..0fc4b5cf02 100644 --- a/arch/arm/mach-imx/include/mach/devices-imx53.h +++ b/arch/arm/mach-imx/include/mach/devices-imx53.h @@ -61,11 +61,11 @@ static inline struct device_d *imx53_add_nand(struct imx_nand_platform_data *pda struct resource res[] = { { .start = MX53_NFC_BASE_ADDR, - .size = SZ_4K, + .end = MX53_NFC_BASE_ADDR + SZ_4K - 1, .flags = IORESOURCE_MEM, }, { .start = MX53_NFC_AXI_BASE_ADDR, - .size = SZ_4K, + .end = MX53_NFC_AXI_BASE_ADDR + SZ_4K - 1, .flags = IORESOURCE_MEM, }, }; diff --git a/arch/nios2/boards/generic/generic.c b/arch/nios2/boards/generic/generic.c index b51b94afbf..2c998fe3ac 100644 --- a/arch/nios2/boards/generic/generic.c +++ b/arch/nios2/boards/generic/generic.c @@ -9,17 +9,17 @@ static int phy_address = 1; static struct resource mac_resources[] = { [0] = { .start = NIOS_SOPC_TSE_BASE, - .size = 0x400, + .end = NIOS_SOPC_TSE_BASE + 0x400 - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = NIOS_SOPC_SGDMA_RX_BASE, - .size = 0x40, + .end = 0x40 + NIOS_SOPC_SGDMA_RX_BASE - 1, .flags = IORESOURCE_MEM, }, [2] = { .start = NIOS_SOPC_SGDMA_TX_BASE, - .size = 0x40, + .end = 0x40 + NIOS_SOPC_SGDMA_TX_BASE - 1, .flags = IORESOURCE_MEM, }, }; diff --git a/commands/bootm.c b/commands/bootm.c index 2989d39311..3c47ab5d9e 100644 --- a/commands/bootm.c +++ b/commands/bootm.c @@ -383,8 +383,7 @@ static int do_bootm(int argc, char *argv[]) if (data.os_res) printf("OS image is at 0x%08x-0x%08x\n", data.os_res->start, - data.os_res->start + - data.os_res->size - 1); + data.os_res->end); else printf("OS image not yet relocated\n"); @@ -399,8 +398,7 @@ static int do_bootm(int argc, char *argv[]) if (data.initrd_res) printf("initrd is at 0x%08x-0x%08x\n", data.initrd_res->start, - data.initrd_res->start + - data.initrd_res->size - 1); + data.initrd_res->end); else printf("initrd image not yet relocated\n"); } diff --git a/commands/iomem.c b/commands/iomem.c index 70355fd1e9..c22878c1c8 100644 --- a/commands/iomem.c +++ b/commands/iomem.c @@ -32,8 +32,7 @@ static void __print_resources(struct resource *res, int indent) printf(PRINTF_CONVERSION_RESOURCE " - " PRINTF_CONVERSION_RESOURCE " (size " PRINTF_CONVERSION_RESOURCE ") %s\n", res->start, - res->start + res->size - 1, - res->size, res->name); + res->end, resource_size(res), res->name); list_for_each_entry(r, &res->children, sibling) __print_resources(r, indent + 1); diff --git a/commands/mem.c b/commands/mem.c index 080bfdef3f..6d1a2b8e8a 100644 --- a/commands/mem.c +++ b/commands/mem.c @@ -594,7 +594,7 @@ static int mem_probe(struct device_d *dev) dev->priv = cdev; cdev->name = (char*)dev->resource[0].name; - cdev->size = (unsigned long)dev->resource[0].size; + cdev->size = (unsigned long)resource_size(&dev->resource[0]); cdev->ops = &memops; cdev->dev = dev; diff --git a/common/memory.c b/common/memory.c index 3b4a5ef4b3..f04cfac187 100644 --- a/common/memory.c +++ b/common/memory.c @@ -122,7 +122,7 @@ void barebox_add_memory_bank(const char *name, resource_size_t start, struct memory_bank *bank = xzalloc(sizeof(*bank)); struct device_d *dev; - bank->res = request_iomem_region(name, start, size); + bank->res = request_iomem_region(name, start, start + size - 1); BUG_ON(!bank->res); @@ -146,7 +146,7 @@ struct resource *request_sdram_region(const char *name, resource_size_t start, for_each_memory_bank(bank) { struct resource *res; - res = request_region(bank->res, name, start, size); + res = request_region(bank->res, name, start, start + size - 1); if (res) return res; } diff --git a/common/resource.c b/common/resource.c index 63e9c49ca1..ce5aa27dca 100644 --- a/common/resource.c +++ b/common/resource.c @@ -42,16 +42,20 @@ static int init_resource(struct resource *res, const char *name) */ struct resource *request_region(struct resource *parent, const char *name, resource_size_t start, - resource_size_t size) + resource_size_t end) { struct resource *r, *new; + if (end < start) { + debug("%s: request region 0x%08x:0x%08x: end < start\n", + __func__, start, end); + return NULL; + } + /* outside parent resource? */ - if (start < parent->start || - start + size > parent->start + parent->size) { + if (start < parent->start || end > parent->end) { debug("%s: 0x%08x:0x%08x outside parent resource 0x%08x:0x%08x\n", - __func__, start, size, parent->start, - parent->size); + __func__, start, end, parent->start, parent->end); return NULL; } @@ -60,22 +64,22 @@ struct resource *request_region(struct resource *parent, * us searching for conflicts here. */ list_for_each_entry(r, &parent->children, sibling) { - if (start + size <= r->start) + if (end < r->start) goto ok; - if (start >= r->start + r->size) + if (start > r->end) continue; debug("%s: 0x%08x:0x%08x conflicts with 0x%08x:0x%08x\n", - __func__, start, size, r->start, r->size); + __func__, start, end, r->start, r->end); return NULL; } ok: - debug("%s ok: 0x%08x 0x%08x\n", __func__, start, size); + debug("%s ok: 0x%08x:0x%08x\n", __func__, start, end); new = xzalloc(sizeof(*new)); init_resource(new, name); new->start = start; - new->size = size; + new->end = end; new->parent = parent; list_add_tail(&new->sibling, &r->sibling); @@ -100,16 +104,16 @@ int release_region(struct resource *res) /* The root resource for the whole io space */ struct resource iomem_resource = { .start = 0, - .size = ~0, + .end = 0xffffffff, }; /* * request a region inside the io space */ struct resource *request_iomem_region(const char *name, - resource_size_t start, resource_size_t size) + resource_size_t start, resource_size_t end) { - return request_region(&iomem_resource, name, start, size); + return request_region(&iomem_resource, name, start, end); } static int iomem_init(void) diff --git a/common/uimage.c b/common/uimage.c index 945f3d6b0f..43878b59a0 100644 --- a/common/uimage.c +++ b/common/uimage.c @@ -354,9 +354,9 @@ static struct resource *uimage_resource; static int uimage_sdram_flush(void *buf, unsigned int len) { - if (uimage_size + len > uimage_resource->size) { - resource_size_t start = uimage_resource->start; - resource_size_t size = uimage_resource->size + len; + if (uimage_size + len > resource_size(uimage_resource)) { + resource_size_t start = resource_size(uimage_resource); + resource_size_t size = resource_size(uimage_resource) + len; release_sdram_region(uimage_resource); uimage_resource = request_sdram_region("uimage", diff --git a/drivers/base/driver.c b/drivers/base/driver.c index 81cedca1db..31d6f2a406 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c @@ -261,7 +261,7 @@ void __iomem *dev_request_mem_region(struct device_d *dev, int num) if (!res) return NULL; - res = request_iomem_region(dev_name(dev), res->start, res->size); + res = request_iomem_region(dev_name(dev), res->start, res->end); if (!res) return NULL; @@ -392,7 +392,7 @@ static int do_devinfo(int argc, char *argv[]) printf("name : %s\n", res->name); printf("start : " PRINTF_CONVERSION_RESOURCE "\nsize : " PRINTF_CONVERSION_RESOURCE "\n", - res->start, res->size); + res->start, resource_size(res)); } printf("driver: %s\n\n", dev->driver ? diff --git a/drivers/base/resource.c b/drivers/base/resource.c index 347b2f01f0..6790af36d8 100644 --- a/drivers/base/resource.c +++ b/drivers/base/resource.c @@ -47,7 +47,7 @@ struct device_d *add_generic_device(const char* devname, int id, const char *res if (resname) res[0].name = xstrdup(resname); res[0].start = start; - res[0].size = size; + res[0].end = start + size - 1; res[0].flags = flags; return add_generic_device_res(devname, id, res, 1, pdata); @@ -94,10 +94,10 @@ struct device_d *add_dm9000_device(int id, resource_size_t base, } res[0].start = base; - res[0].size = size; + res[0].end = base + size - 1; res[0].flags = IORESOURCE_MEM | flags; res[1].start = data; - res[1].size = size; + res[1].end = data + size - 1; res[1].flags = IORESOURCE_MEM | flags; return add_generic_device_res("dm9000", id, res, 2, pdata); @@ -113,10 +113,10 @@ struct device_d *add_usb_ehci_device(int id, resource_size_t hccr, res = xzalloc(sizeof(struct resource) * 2); res[0].start = hccr; - res[0].size = 0x40; + res[0].end = hccr + 0x40 - 1; res[0].flags = IORESOURCE_MEM; res[1].start = hcor; - res[1].size = 0xc0; + res[1].end = hcor + 0xc0 - 1; res[1].flags = IORESOURCE_MEM; return add_generic_device_res("ehci", id, res, 2, pdata); @@ -146,10 +146,10 @@ struct device_d *add_ks8851_device(int id, resource_size_t addr, res = xzalloc(sizeof(struct resource) * 2); res[0].start = addr; - res[0].size = size; + res[0].end = addr + size - 1; res[0].flags = IORESOURCE_MEM | flags; res[1].start = addr_cmd; - res[1].size = size; + res[1].end = addr_cmd + size - 1; res[1].flags = IORESOURCE_MEM | flags; return add_generic_device_res("ks8851_mll", id, res, 2, pdata); diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 2ce7c6ecc5..b3e9909df0 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c @@ -64,7 +64,7 @@ static int at91_ohci_probe(struct device_d *dev) writel(0, ®s->control); add_generic_device("ohci", DEVICE_ID_DYNAMIC, NULL, dev->resource[0].start, - dev->resource[0].size, IORESOURCE_MEM, NULL); + resource_size(&dev->resource[0]), IORESOURCE_MEM, NULL); return 0; } diff --git a/drivers/video/fb.c b/drivers/video/fb.c index 0be465f892..d885570b24 100644 --- a/drivers/video/fb.c +++ b/drivers/video/fb.c @@ -86,7 +86,7 @@ static int fb_setup_mode(struct device_d *dev, struct param_d *param, if (!ret) { dev->resource[0].start = (resource_size_t)info->screen_base; info->cdev.size = info->xres * info->yres * (info->bits_per_pixel >> 3); - dev->resource[0].size = info->cdev.size; + dev->resource[0].end = info->cdev.size - 1; dev_param_set_generic(dev, param, val); } else info->cdev.size = 0; @@ -116,7 +116,7 @@ int register_framebuffer(struct fb_info *info) info->cdev.priv = info; dev->resource = xzalloc(sizeof(struct resource)); dev->resource[0].start = (resource_size_t)info->screen_base; - dev->resource[0].size = info->cdev.size; + dev->resource[0].end = info->cdev.size - 1; dev->resource[0].flags = IORESOURCE_MEM; dev->num_resources = 1; diff --git a/fs/devfs.c b/fs/devfs.c index ae48451b6c..b746a0e147 100644 --- a/fs/devfs.c +++ b/fs/devfs.c @@ -166,7 +166,7 @@ static int devfs_truncate(struct device_d *dev, FILE *f, ulong size) { if (f->dev->num_resources < 1) return -ENOSPC; - if (size > f->dev->resource[0].size) + if (size > resource_size(&f->dev->resource[0])) return -ENOSPC; return 0; } diff --git a/fs/fs.c b/fs/fs.c index af73c8c8aa..8c6102d473 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -1252,7 +1252,7 @@ ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong return -1; dev = cdev->dev; - size = min((ulong)count, dev->resource[0].size - offset); + size = min((ulong)count, resource_size(&dev->resource[0]) - offset); memcpy_sz(buf, dev_get_mem_region(dev, 0) + offset, size, flags & O_RWSIZE_MASK); return size; } @@ -1267,7 +1267,7 @@ ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset return -1; dev = cdev->dev; - size = min((ulong)count, dev->resource[0].size - offset); + size = min((ulong)count, resource_size(&dev->resource[0]) - offset); memcpy_sz(dev_get_mem_region(dev, 0) + offset, buf, size, flags & O_RWSIZE_MASK); return size; } diff --git a/include/linux/ioport.h b/include/linux/ioport.h index 3f95dddf4e..6d6cd68de6 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -17,7 +17,7 @@ */ struct resource { resource_size_t start; - resource_size_t size; + resource_size_t end; const char *name; unsigned long flags; struct resource *parent; @@ -113,7 +113,7 @@ struct resource { static inline resource_size_t resource_size(const struct resource *res) { - return res->size; + return res->end - res->start + 1; } static inline unsigned long resource_type(const struct resource *res) { @@ -121,10 +121,10 @@ static inline unsigned long resource_type(const struct resource *res) } struct resource *request_iomem_region(const char *name, - resource_size_t start, resource_size_t size); + resource_size_t start, resource_size_t end); struct resource *request_region(struct resource *parent, - const char *name, resource_size_t start, + const char *name, resource_size_t end, resource_size_t size); int release_region(struct resource *res); -- cgit v1.2.3