From patchwork Wed Oct 4 22:48:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Limonciello, Mario" X-Patchwork-Id: 9985835 X-Patchwork-Delegate: dvhart@infradead.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 50C05602B8 for ; Wed, 4 Oct 2017 22:50:57 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4370D28C40 for ; Wed, 4 Oct 2017 22:50:57 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3803B28C42; Wed, 4 Oct 2017 22:50:57 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D7E7C28C40 for ; Wed, 4 Oct 2017 22:50:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751430AbdJDWuc (ORCPT ); Wed, 4 Oct 2017 18:50:32 -0400 Received: from esa6.dell-outbound.iphmx.com ([68.232.149.229]:47543 "EHLO esa6.dell-outbound.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751266AbdJDWsu (ORCPT ); Wed, 4 Oct 2017 18:48:50 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=dell.com; i=@dell.com; q=dns/txt; s=smtpout; t=1507157330; x=1538693330; h=from:to:cc:subject:date:message-id; bh=l2yDltIrE+ZZT84AOKRWfu5IGHruah7ZBMk24NSB5P0=; b=WTT0qgIBLZYoHDoUpxsZvdvmpjMvW0rluWz+Fx/Tt1sv8pshGRYZAz3i a9B5ia5vx+662R6ZlpPFBGRZEVCkUvgZO2MfyDc/jO4alIanGa1VjC0rF +G8U6zYKeD46ua9bVspwY3f15/prKJUz47WYDH0YT+IcqlCfl5bDwG/aw E=; Received: from esa3.dell-outbound2.iphmx.com ([68.232.154.63]) by esa6.dell-outbound.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Oct 2017 17:48:47 -0500 Received: from ausxipps306.us.dell.com ([143.166.148.156]) by esa3.dell-outbound2.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Oct 2017 04:46:05 +0600 X-LoopCount0: from 10.208.86.39 X-IronPort-AV: E=Sophos;i="5.42,478,1500958800"; d="scan'208";a="155920471" X-DLP: DLP_GlobalPCIDSS From: Mario Limonciello To: dvhart@infradead.org, Andy Shevchenko Cc: LKML , platform-driver-x86@vger.kernel.org, Andy Lutomirski , quasisec@google.com, pali.rohar@gmail.com, rjw@rjwysocki.net, mjg59@google.com, hch@lst.de, Greg KH , Mario Limonciello Subject: [PATCH v4 10/14] platform/x86: dell-smbios-smm: test for WSMT Date: Wed, 4 Oct 2017 17:48:36 -0500 Message-Id: <1e16313531397b43c16e147a3a5ad9e74ca3428a.1507156392.git.mario.limonciello@dell.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: References: In-Reply-To: References: Sender: platform-driver-x86-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: platform-driver-x86@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP WSMT is as an attestation to the OS that the platform won't modify memory outside of pre-defined areas. If a platform has WSMT enabled in BIOS setup, SMM calls through dcdbas will fail. The only way to access platform data in these instances is through the WMI SMBIOS calling interface. Signed-off-by: Mario Limonciello --- drivers/platform/x86/dell-smbios-smm.c | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/platform/x86/dell-smbios-smm.c b/drivers/platform/x86/dell-smbios-smm.c index 2e1c5d2dfd61..3271e9a876e9 100644 --- a/drivers/platform/x86/dell-smbios-smm.c +++ b/drivers/platform/x86/dell-smbios-smm.c @@ -25,6 +25,8 @@ static struct calling_interface_buffer *buffer; struct platform_device *platform_device; static DEFINE_MUTEX(smm_mutex); +#define WSMT_EN_TOKEN 0x04EC + static const struct dmi_system_id dell_device_table[] __initconst = { { .ident = "Dell laptop", @@ -76,6 +78,32 @@ void dell_smbios_smm_call(struct calling_interface_buffer *input) } EXPORT_SYMBOL_GPL(dell_smbios_smm_call); +static int test_wsmt_enabled(void) +{ + struct calling_interface_token *token; + int ret; + + /* if token doesn't exist, SMM will work */ + token = dell_smbios_find_token(WSMT_EN_TOKEN); + if (!token) + return 0; + + /* if token exists, try to access over SMM */ + buffer->class = 0; + buffer->select = 0; + memset(buffer, 0, sizeof(struct calling_interface_buffer)); + buffer->input[0] = token->location; + dell_smbios_smm_call(buffer); + + /* if lookup failed, we know WSMT was enabled */ + if (buffer->output[0] != 0) + return 1; + + /* query token status if it didn't fail */ + ret = (buffer->output[1] == token->value); + return ret; +} + static int __init dell_smbios_smm_init(void) { int ret; @@ -88,6 +116,13 @@ static int __init dell_smbios_smm_init(void) return -ENOMEM; dell_smbios_get_smm_address(&da_command_address, &da_command_code); + ret = test_wsmt_enabled(); + pr_debug("WSMT enable test: %d\n", ret); + if (ret) { + ret = -ENODEV; + goto fail_wsmt; + } + platform_device = platform_device_alloc("dell-smbios", 1); if (!platform_device) { ret = -ENOMEM; @@ -111,6 +146,7 @@ static int __init dell_smbios_smm_init(void) fail_platform_device_add: platform_device_put(platform_device); +fail_wsmt: fail_platform_device_alloc: free_page((unsigned long)buffer); return ret;