Skip to content
Permalink
Browse files

Namespace: remove address node from global list after method termination

ASL OperationRegions declare a range of addresses that it uses. In a
perfect world, the range of addresses should be used exclusively by
the AML interpreter. The OS can use this information to decide which
drivers to load so that the AML interpreter and device drivers use
different regions of memory.

During table load, the address information is added to a global
address range list. Each node in this list contains an address range
as well as a namespace node of the OperationRegion. This list is
deleted at ACPI shutdown.

Unfortunately, ASL OperationRegions can be declared inside of control
methods. Although this is not recommended, modern firmware contains
such code. New module level code changes unintentionally removed the
functionality of adding and removing nodes to the global address
range list.

A few months ago, support for adding addresses has been re-
implemented. However, the removal of the address range list was
missed and resulted in some systems to crash due to the address list
containing bogus namespace nodes from OperationRegions declared in
control methods. In order to fix the crash, this change removes
dynamic OperationRegions after control method termination.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=202475

Reported-by: Michael J Gruber <mjg@fedoraproject.org>
Signed-off-by: Erik Schmauss <erik.schmauss@intel.com>
  • Loading branch information...
SchmErik committed Mar 13, 2019
1 parent 0f055cc commit b233720031a480abd438f2e9c643080929d144c3
Showing with 5 additions and 0 deletions.
  1. +5 −0 source/components/namespace/nsobject.c
@@ -352,6 +352,11 @@ AcpiNsDetachObject (
}
}

if (ObjDesc->Common.Type == ACPI_TYPE_REGION)
{
AcpiUtRemoveAddressRange(ObjDesc->Region.SpaceId, Node);
}

/* Clear the Node entry in all cases */

Node->Object = NULL;

0 comments on commit b233720

Please sign in to comment.
You can’t perform that action at this time.