{
        struct pci_controller* hose = (struct pci_controller *)dev->sysdata;
        int i;
-       unsigned long offset;
+       resource_size_t offset, mask;
 
        if (!hose) {
                printk(KERN_ERR "No hose for PCI dev %s!\n", pci_name(dev));
                        continue;
                }
                offset = 0;
+               mask = (resource_size_t)-1;
                if (res->flags & IORESOURCE_MEM) {
                        offset = hose->pci_mem_offset;
                } else if (res->flags & IORESOURCE_IO) {
                        offset = (unsigned long) hose->io_base_virt
                                - isa_io_base;
+                       mask = 0xffffffffu;
                }
                if (offset != 0) {
-                       res->start += offset;
-                       res->end += offset;
+                       res->start = (res->start + offset) & mask;
+                       res->end = (res->end + offset) & mask;
                        DBG("Fixup res %d (%lx) of dev %s: %llx -> %llx\n",
                            i, res->flags, pci_name(dev),
                            (u64)res->start - offset, (u64)res->start);
 void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
                        struct resource *res)
 {
-       unsigned long offset = 0;
+       resource_size_t offset = 0, mask = (resource_size_t)-1;
        struct pci_controller *hose = dev->sysdata;
 
-       if (hose && res->flags & IORESOURCE_IO)
+       if (hose && res->flags & IORESOURCE_IO) {
                offset = (unsigned long)hose->io_base_virt - isa_io_base;
-       else if (hose && res->flags & IORESOURCE_MEM)
+               mask = 0xffffffffu;
+       } else if (hose && res->flags & IORESOURCE_MEM)
                offset = hose->pci_mem_offset;
-       region->start = res->start - offset;
-       region->end = res->end - offset;
+       region->start = (res->start - offset) & mask;
+       region->end = (res->end - offset) & mask;
 }
 EXPORT_SYMBOL(pcibios_resource_to_bus);
 
 void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
                             struct pci_bus_region *region)
 {
-       unsigned long offset = 0;
+       resource_size_t offset = 0, mask = (resource_size_t)-1;
        struct pci_controller *hose = dev->sysdata;
 
-       if (hose && res->flags & IORESOURCE_IO)
+       if (hose && res->flags & IORESOURCE_IO) {
                offset = (unsigned long)hose->io_base_virt - isa_io_base;
-       else if (hose && res->flags & IORESOURCE_MEM)
+               mask = 0xffffffffu;
+       } else if (hose && res->flags & IORESOURCE_MEM)
                offset = hose->pci_mem_offset;
-       res->start = region->start + offset;
-       res->end = region->end + offset;
+       res->start = (region->start + offset) & mask;
+       res->end = (region->end + offset) & mask;
 }
 EXPORT_SYMBOL(pcibios_bus_to_resource);
 
 pci_relocate_bridge_resource(struct pci_bus *bus, int i)
 {
        struct resource *res, *pr, *conflict;
-       unsigned long try, size;
-       int j;
+       resource_size_t try, size;
        struct pci_bus *parent = bus->parent;
+       int j;
 
        if (parent == NULL) {
                /* shouldn't ever happen */
        u8 io_base_lo, io_limit_lo;
        u16 mem_base, mem_limit;
        u16 cmd;
-       unsigned long start, end, off;
+       resource_size_t start, end, off;
        struct pci_controller *hose = dev->sysdata;
 
        if (!hose) {
                        res->end = IO_SPACE_LIMIT;
                        res->flags = IORESOURCE_IO;
                }
-               res->start += io_offset;
-               res->end += io_offset;
+               res->start = (res->start + io_offset) & 0xffffffffu;
+               res->end = (res->end + io_offset) & 0xffffffffu;
 
                for (i = 0; i < 3; ++i) {
                        res = &hose->mem_resources[i];
                        if (!res->flags || bus->self->transparent)
                                continue;
                        if (io_offset && (res->flags & IORESOURCE_IO)) {
-                               res->start += io_offset;
-                               res->end += io_offset;
+                               res->start = (res->start + io_offset) &
+                                       0xffffffffu;
+                               res->end = (res->end + io_offset) &
+                                       0xffffffffu;
                        } else if (hose->pci_mem_offset
                                   && (res->flags & IORESOURCE_MEM)) {
                                res->start += hose->pci_mem_offset;