From patchwork Sun Dec 12 00:32:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Hung X-Patchwork-Id: 1566963 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=fQiOqJMg; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=fwts-devel-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JBQZY0f3fz9sR4 for ; Sun, 12 Dec 2021 11:32:19 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mwCmk-0005Vf-Ay; Sun, 12 Dec 2021 00:32:14 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mwCmf-0005VV-7V for fwts-devel@lists.ubuntu.com; Sun, 12 Dec 2021 00:32:09 +0000 Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 15B7A3F1EE for ; Sun, 12 Dec 2021 00:32:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1639269129; bh=S3xhehw8+mnDd/Ln7cB/H/OXc2PA+2ySgiJ/gp6zio4=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=fQiOqJMgX7vuMrV4XkfUpha4Onnvy5Q2i1sFqoCpTHsEEN/MD1jWpBqEZOlmkts2K 5KjurECZFx9mreDgeBh8eTUkrySIX5NmURjWuGEr3wyJAiJKQBozRaaehrXvb9BKBL FxZySDXIJ3SjoW+vo/t/XAwEY3Z6gqE8aR/LnfAyuQA7t2nG5Xa8OvA6ozwvCV+UlO 3ApMDjL/Mu6D9p3aSh1sT15Fc2tmqS3uhB9jQ8n2B80TAGcE1K2+2JRsdsoz3JwZSf T4v31Zco4fwhYjiBq5GZARMt9oGu9R+X37/hgCCQh07QJO9YQyAaXqAb6/N6urN5DF 8nH1FMJxHmwgQ== Received: by mail-pj1-f69.google.com with SMTP id x1-20020a17090a294100b001a6e7ba6b4eso8450980pjf.9 for ; Sat, 11 Dec 2021 16:32:09 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=S3xhehw8+mnDd/Ln7cB/H/OXc2PA+2ySgiJ/gp6zio4=; b=61sphA/Ukn1WCO3v/d7/QmUEZYDHvJZkPzjalL27ZR5/H5RGLVjyworK6uzrzxUuZX sQwh/ex1A2sIIwI3TK6vxX1lOnPSduZPkD2biVHzjgDOTs+PaMTIHu2V4YMqaA8KkNgk wrZaTfT2r3YEBykPzEAEwHBI04ew3sHGytzrFQH7k2l+HA9Tx0KU3i3wSdutZNqOaV5j 3CADLQvXbir2Y3NawKPpfNFFMZAJml+7oze6INBJRJYmTjJ2AfspTfwGIM50JfhfXNau wwAeORJmK2dZBPJRqoUYDp1mOIkAShhlB+bTD0uVO0RvlF5AE9Kr6SwnCG1breikIT5k 1yHA== X-Gm-Message-State: AOAM530E6+eAe/37IPSRAioFA4czh+7oJdUSFbgP7INzpjJcviG0ycRu rHXQrb+vUE1st8RR5r1EKL5xpO3JDB0xptKIHlM8rFFBds2vs25dlJLuh20jkwlcO7zvfGYXVWL Z6GSIR6iFsp6Fi3sx9YtoRkXmPjY+I27RFJnYq76f X-Received: by 2002:a17:902:768b:b0:144:e570:c7d2 with SMTP id m11-20020a170902768b00b00144e570c7d2mr85804095pll.86.1639269127017; Sat, 11 Dec 2021 16:32:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJxTwg/eV2yBRqxfM07GUvCKA2BuTP3YzkoT3Q3wXLjGX6hyuZaeaBSlOT7P0oKa7XxB0NR2uw== X-Received: by 2002:a17:902:768b:b0:144:e570:c7d2 with SMTP id m11-20020a170902768b00b00144e570c7d2mr85804066pll.86.1639269126540; Sat, 11 Dec 2021 16:32:06 -0800 (PST) Received: from canonical.com ([2001:56a:78ed:fb00::6c9]) by smtp.gmail.com with ESMTPSA id 12sm2816341pjn.16.2021.12.11.16.32.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Dec 2021 16:32:05 -0800 (PST) From: Alex Hung To: fwts-devel@lists.ubuntu.com Subject: [PATCH][V4] dmicheck: skip scanning smbios in /dev/mem on aarch64 Date: Sat, 11 Dec 2021 17:32:02 -0700 Message-Id: <20211212003202.718077-1-alex.hung@canonical.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-BeenThere: fwts-devel@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Firmware Test Suite Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: fwts-devel-bounces@lists.ubuntu.com Sender: "fwts-devel" Signed-off-by: Alex Hung Acked-by: Ivan Hu Signed-off-by: Alex Hung --- src/dmi/dmicheck/dmicheck.c | 14 ++++ src/lib/include/fwts.h | 1 + src/lib/include/fwts_fileio.h | 3 + src/lib/include/fwts_kernel.h | 25 +++++++ src/lib/src/Makefile.am | 1 + src/lib/src/fwts_fileio.c | 39 +++++++++++ src/lib/src/fwts_kernel.c | 126 ++++++++++++++++++++++++++++++++++ 7 files changed, 209 insertions(+) create mode 100644 src/lib/include/fwts_kernel.h create mode 100644 src/lib/src/fwts_kernel.c diff --git a/src/dmi/dmicheck/dmicheck.c b/src/dmi/dmicheck/dmicheck.c index 7f6a90c4..3985b126 100644 --- a/src/dmi/dmicheck/dmicheck.c +++ b/src/dmi/dmicheck/dmicheck.c @@ -381,6 +381,13 @@ static void* dmi_table_smbios(fwts_framework *fw, fwts_smbios_entry *entry) free(table); } +#ifdef FWTS_ARCH_AARCH64 + if (fwts_kernel_config_set("CONFIG_STRICT_DEVMEM")) { + fwts_warning(fw, "Skipping scanning SMBIOS table in memory for arm64 systems"); + return NULL; + } +#endif + mem = fwts_mmap(addr, length); if (mem != FWTS_MAP_FAILED) { /* Can we safely copy the table? */ @@ -429,6 +436,13 @@ static void* dmi_table_smbios30(fwts_framework *fw, fwts_smbios30_entry *entry) free(table); } +#ifdef FWTS_ARCH_AARCH64 + if (fwts_kernel_config_set("CONFIG_STRICT_DEVMEM")) { + fwts_warning(fw, "Skipping scanning SMBIOS3 table in memory for arm64 systems"); + return NULL; + } +#endif + mem = fwts_mmap(addr, length); if (mem != FWTS_MAP_FAILED) { /* Can we safely copy the table? */ diff --git a/src/lib/include/fwts.h b/src/lib/include/fwts.h index 551a4e09..be754a99 100644 --- a/src/lib/include/fwts.h +++ b/src/lib/include/fwts.h @@ -185,6 +185,7 @@ #include "fwts_iasl.h" #include "fwts_ipmi.h" #include "fwts_klog.h" +#include "fwts_kernel.h" #include "fwts_olog.h" #include "fwts_pipeio.h" #include "fwts_stringextras.h" diff --git a/src/lib/include/fwts_fileio.h b/src/lib/include/fwts_fileio.h index 99826491..108dae96 100644 --- a/src/lib/include/fwts_fileio.h +++ b/src/lib/include/fwts_fileio.h @@ -21,8 +21,11 @@ #define __FWTS_FILEIO_H__ #include +#include fwts_list* fwts_file_read(FILE *fp); fwts_list* fwts_file_open_and_read(const char *file); +fwts_list* fwts_gzfile_read(gzFile *fp); +fwts_list* fwts_gzfile_open_and_read(const char *file); #endif diff --git a/src/lib/include/fwts_kernel.h b/src/lib/include/fwts_kernel.h new file mode 100644 index 00000000..a89576ae --- /dev/null +++ b/src/lib/include/fwts_kernel.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2021 Canonical + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef __FWTS_KERNEL_H__ +#define __FWTS_KERNEL_H__ + +bool fwts_kernel_config_set(const char *config); + +#endif diff --git a/src/lib/src/Makefile.am b/src/lib/src/Makefile.am index 55c52b41..0a39882a 100644 --- a/src/lib/src/Makefile.am +++ b/src/lib/src/Makefile.am @@ -83,6 +83,7 @@ libfwts_la_SOURCES = \ fwts_ioport.c \ fwts_ipmi.c \ fwts_json.c \ + fwts_kernel.c \ fwts_keymap.c \ fwts_klog.c \ fwts_olog.c \ diff --git a/src/lib/src/fwts_fileio.c b/src/lib/src/fwts_fileio.c index 552fe993..6af6f00f 100644 --- a/src/lib/src/fwts_fileio.c +++ b/src/lib/src/fwts_fileio.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "fwts.h" @@ -61,3 +62,41 @@ fwts_list* fwts_file_open_and_read(const char *file) return list; } + +/* + * fwts_gzfile_read() + * read given gz file and return contents as a list of lines + */ +fwts_list *fwts_gzfile_read(gzFile *fp) +{ + fwts_list *list; + char buffer[8192]; + + if ((list = fwts_list_new()) == NULL) + return NULL; + + while (gzgets(*fp, buffer, sizeof(buffer)) != NULL) { + buffer[strlen(buffer) - 1] = '\0'; /* Chop off "\n" */ + fwts_text_list_append(list, buffer); + } + + return list; +} + +/* + * fwts_gzfile_open_and_read() + * open and read gz file and return contents as a list of lines + */ +fwts_list* fwts_gzfile_open_and_read(const char *file) +{ + gzFile fp; + fwts_list *list; + + if ((fp = gzopen(file, "r")) == Z_NULL) + return NULL; + + list = fwts_gzfile_read(&fp); + (void)gzclose(fp); + + return list; +} diff --git a/src/lib/src/fwts_kernel.c b/src/lib/src/fwts_kernel.c new file mode 100644 index 00000000..f42e65bc --- /dev/null +++ b/src/lib/src/fwts_kernel.c @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2021 Canonical + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include + +#include "fwts.h" +#include "fwts_kernel.h" +#include +#include +#include + +#define CONFIG_FILE_PREFIX "/boot/config-" +#define CONFIG_FILE_PROC "/proc/config.gz" + +/* + * fwts_kernel_config_plain_set + * check whether a plain-text kernel config + */ +bool fwts_kernel_config_plain_set(const char *config) +{ + const size_t config_str_len = strlen(config) + 3; + char config_file[PATH_MAX]; + char config_str[255]; + size_t config_file_len; + fwts_list* config_list; + fwts_list_link *item; + struct utsname buf; + + /* get path of config file, i.e. /boot/config-5.11.0-38-generic */ + uname(&buf); + config_file_len = strlen(CONFIG_FILE_PREFIX) + strlen(buf.release) + 1; + (void)strlcpy(config_file, CONFIG_FILE_PREFIX, config_file_len); + (void)strlcat(config_file, buf.release, config_file_len); + + config_list = fwts_file_open_and_read(config_file); + if (config_list == NULL) + return false; + + fwts_list_foreach(item, config_list) { + /* check built-in, i.e. =y */ + (void)strlcpy(config_str, config, config_str_len); + (void)strlcat(config_str, "=y", config_str_len); + if (!strncmp(fwts_text_list_text(item), config_str, strlen(config_str))) { + fwts_list_free(config_list, free); + return true; + } + + /* check module, i.e. =m */ + config_str[strlen(config_str) - 1] = 'm'; + if (!strncmp(fwts_text_list_text(item), config_str, strlen(config_str))) { + fwts_list_free(config_list, free); + return true; + } + } + + fwts_list_free(config_list, free); + return false; +} + +/* + * fwts_kernel_config_gz_set + * check whether a gz kernel config + */ +bool fwts_kernel_config_gz_set(const char *config) +{ + const size_t config_str_len = strlen(config) + 3; + char config_str[255]; + fwts_list* config_list; + fwts_list_link *item; + + config_list = fwts_gzfile_open_and_read(CONFIG_FILE_PROC); + if (config_list == NULL) + return false; + + fwts_list_foreach(item, config_list) { + /* check built-in, i.e. =y */ + (void)strlcpy(config_str, config, config_str_len); + (void)strlcat(config_str, "=y", config_str_len); + if (!strncmp(fwts_text_list_text(item), config_str, strlen(config_str))) { + fwts_list_free(config_list, free); + return true; + } + + /* check module, i.e. =m */ + config_str[strlen(config_str) - 1] = 'm'; + if (!strncmp(fwts_text_list_text(item), config_str, strlen(config_str))) { + fwts_list_free(config_list, free); + return true; + } + } + + fwts_list_free(config_list, free); + return false; +} + +/* + * fwts_kernel_config_set + * check whether a kernel config is set, ex. + * true if CONFIG_XYZ=y or CONFIG_XYZ=m + */ +bool fwts_kernel_config_set(const char *config) +{ + if (fwts_kernel_config_plain_set(config)) + return true; + + if (fwts_kernel_config_gz_set(config)) + return true; + + return false; +}