• Jiang Liu's avatar
    ACPI / PCI: Fix regressions caused by resource_size_t overflow with 32-bit kernel · 1fb01ca9
    Jiang Liu authored
    Zoltan Boszormenyi reported this regression:
      "There's a Realtek RTL8111/8168/8411 (PCI ID 10ec:8168, Subsystem ID
       1565:230e) network chip on the mainboard. After the r8169 driver loaded
       the IRQs in the machine went berserk. Keyboard keypressed arrived with
       considerable latency and duplicated, so no real work was possible.
       The machine responded to the power button but didn't actually power
       down. It just stuck at the powering down message. I had to press the
       power button for 4 seconds to power it down.
    
       The computer is a POS machine with a big battery inside. Because of this,
       either ACPI or the Realtek chip kept the bad state and after rebooting,
       the network chip didn't even show up in lspci. Not even the PXE ROM
       announced itself during boot. I had to disconnect the battery to beat
       some sense back to the computer.
    
       The regression happens with 4.0.5, 4.1.0-rc8 and 4.1.0-final. 3.18.16 was
       good."
    
    The regression is caused by commit 593669c2 (x86/PCI/ACPI: Use common
    ACPI resource interfaces to simplify implementation). Since commit
    593669c2, x86 PCI ACPI host bridge driver validates ACPI resources by
    first converting an ACPI resource to a 'struct resource' structure and
    then applying checks against the converted resource structure. The 'start'
    and 'end' fields in 'struct resource' are defined to be type of
    resource_size_t, which may be 32 bits or 64 bits depending on
    CONFIG_PHYS_ADDR_T_64BIT.
    
    This may cause incorrect resource validation results with 32-bit kernels
    because 64-bit ACPI resource descriptors may get truncated when converting
    to 32-bit 'start' and 'end' fields in 'struct resource'. It eventually
    affects PCI resource allocation subsystem and makes some PCI devices and
    the system behave abnormally due to incorrect resource assignment.
    
    So enhance the ACPI resource parsing interfaces to ignore ACPI resource
    descriptors with address/offset above 4G when running in 32-bit mode.
    
    With the fix applied, the behavior of the machine was restored to how
    3.18.16 worked, i.e. the memory range that is over 4GB is ignored again,
    and lspci -vvxxx shows that everything is at the same memory window as
    they were with 3.18.16.
    Reported-and-tested-by: default avatarBoszormenyi Zoltan <zboszor@pr.hu>
    Fixes: 593669c2 (x86/PCI/ACPI: Use common ACPI resource interfaces to simplify implementation)
    Signed-off-by: default avatarJiang Liu <jiang.liu@linux.intel.com>
    Cc: 4.0+ <stable@vger.kernel.org> # 4.0+
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    1fb01ca9
resource.c 23.1 KB