From patchwork Tue Jul 28 02:44:02 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lin Ming X-Patchwork-Id: 37663 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n6S2gvAs009106 for ; Tue, 28 Jul 2009 02:42:58 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751919AbZG1Cmh (ORCPT ); Mon, 27 Jul 2009 22:42:37 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752654AbZG1Cmh (ORCPT ); Mon, 27 Jul 2009 22:42:37 -0400 Received: from mga03.intel.com ([143.182.124.21]:50339 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751919AbZG1Cmg (ORCPT ); Mon, 27 Jul 2009 22:42:36 -0400 Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga101.ch.intel.com with ESMTP; 27 Jul 2009 19:42:36 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.43,280,1246863600"; d="scan'208";a="169544796" Received: from minggr.sh.intel.com (HELO [10.239.13.35]) ([10.239.13.35]) by azsmga001.ch.intel.com with ESMTP; 27 Jul 2009 19:42:35 -0700 Subject: [PATCH 1/2] ACPICA: revert acpi_os_validate_address() removal From: Lin Ming To: Len Brown Cc: Thomas Renninger , "Moore, Robert" , linux-acpi Date: Tue, 28 Jul 2009 10:44:02 +0800 Message-Id: <1248749042.3166.65.camel@minggr.sh.intel.com> Mime-Version: 1.0 X-Mailer: Evolution 2.24.1 (2.24.1-2.fc10) Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org >From 18c15c0fc4affa89db70fee2127cfd76d92cb2d1 Mon Sep 17 00:00:00 2001 From: Lin Ming Date: Tue, 28 Jul 2009 10:31:36 +0800 Subject: [PATCH] ACPICA: revert acpi_os_validate_address() removal Commit f9ca058430333c9a24c5ca926aa445125f88df18 "ACPICA: Remove obsolete acpi_os_validate_address interface" caused a regression, as it disabled our mechanism for preventing conflicts between ACPI and native hardware drivers. http://bugzilla.kernel.org/show_bug.cgi?id=13620 Signed-off-by: Lin Ming --- drivers/acpi/acpica/acobject.h | 1 + drivers/acpi/acpica/dsopcode.c | 24 ++++++++++++++++++++++++ drivers/acpi/acpica/exfldio.c | 6 ++++++ include/acpi/acpiosxf.h | 4 ++++ 4 files changed, 35 insertions(+), 0 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/acpi/acpica/acobject.h b/drivers/acpi/acpica/acobject.h index 544dcf8..eb6f038 100644 --- a/drivers/acpi/acpica/acobject.h +++ b/drivers/acpi/acpica/acobject.h @@ -97,6 +97,7 @@ #define AOPOBJ_OBJECT_INITIALIZED 0x08 #define AOPOBJ_SETUP_COMPLETE 0x10 #define AOPOBJ_SINGLE_DATUM 0x20 +#define AOPOBJ_INVALID 0x40 /* Used if host OS won't allow an op_region address */ /****************************************************************************** * diff --git a/drivers/acpi/acpica/dsopcode.c b/drivers/acpi/acpica/dsopcode.c index 584d766..b79978f 100644 --- a/drivers/acpi/acpica/dsopcode.c +++ b/drivers/acpi/acpica/dsopcode.c @@ -397,6 +397,30 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc) status = acpi_ds_execute_arguments(node, acpi_ns_get_parent_node(node), extra_desc->extra.aml_length, extra_desc->extra.aml_start); + if (ACPI_FAILURE(status)) { + return_ACPI_STATUS(status); + } + + /* Validate the region address/length via the host OS */ + + status = acpi_os_validate_address(obj_desc->region.space_id, + obj_desc->region.address, + (acpi_size) obj_desc->region.length, + acpi_ut_get_node_name(node)); + + if (ACPI_FAILURE(status)) { + /* + * Invalid address/length. We will emit an error message and mark + * the region as invalid, so that it will cause an additional error if + * it is ever used. Then return AE_OK. + */ + ACPI_EXCEPTION((AE_INFO, status, + "During address validation of OpRegion [%4.4s]", + node->name.ascii)); + obj_desc->common.flags |= AOPOBJ_INVALID; + status = AE_OK; + } + return_ACPI_STATUS(status); } diff --git a/drivers/acpi/acpica/exfldio.c b/drivers/acpi/acpica/exfldio.c index cb2eb55..d7b3b41 100644 --- a/drivers/acpi/acpica/exfldio.c +++ b/drivers/acpi/acpica/exfldio.c @@ -113,6 +113,12 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc, } } + /* Exit if Address/Length have been disallowed by the host OS */ + + if (rgn_desc->common.flags & AOPOBJ_INVALID) { + return_ACPI_STATUS(AE_AML_ILLEGAL_ADDRESS); + } + /* * Exit now for SMBus or IPMI address space, it has a non-linear address space * and the request cannot be directly validated diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index 3e79859..ab0b85c 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h @@ -242,6 +242,10 @@ acpi_os_derive_pci_id(acpi_handle rhandle, acpi_status acpi_os_validate_interface(char *interface); acpi_status acpi_osi_invalidate(char* interface); +acpi_status +acpi_os_validate_address(u8 space_id, acpi_physical_address address, + acpi_size length, char *name); + u64 acpi_os_get_timer(void); acpi_status acpi_os_signal(u32 function, void *info);