Hello! I have studied the problem. It is a kernel bug and it's still not fixed, at least in 4.1
> (1) We should confirm whether this really is a guest kernel > bug (as opposed to the device tree QEMU emits not being > in spec) The problem is in of_pci_range_to_resource(): http://lxr.free-electrons.com/source/drivers/of/address.c#L313 Note the line 333: res->start = range->cpu_addr; here is the problem. The problem occurs if CONFIG_ARM_LPAE is disabled. Inside struct resource 'start' and 'end' are of resource_size_t type, which is an alias of phys_addr_t: --- cut --- #ifdef CONFIG_PHYS_ADDR_T_64BIT typedef u64 phys_addr_t; #else typedef u32 phys_addr_t; #endif typedef phys_addr_t resource_size_t; --- cut --- Config option chain is as follows: CONFIG_ARM_LPAE => CONFIG_ARCH_PHYS_ADDR_T_64BIT => CONFIG_PHYS_ADDR_T_64BIT This function should check that range->cpu_addr fits into 32 bits if LPAE is disabled. > (2) If it is a kernel bug, submit a patch to fix it Will do it. > (3) Consider a workaround for older guests anyway. The > scope of that workaround would depend on exactly which > guests are affected, which is presumably something we > figured out during step (1). Problem occurs if LPAE is disabled in the kernel. What is your verdict then? Do we need an option or just ignore those poor guys with such old configs? Kind regards, Pavel Fedin Expert Engineer Samsung Electronics Research center Russia