[PATCH][V4] dmicheck: skip scanning smbios in /dev/mem on aarch64

Sunny Wang Sunny.Wang at arm.com
Wed Dec 15 10:43:35 UTC 2021


Hi Alex,

Sorry for the late response and thanks much for making the fix.
Edhaya and I tested this patch on FVP and RPi4 and it works.
However, it requires additional change when we build our ACS image with this patch. Do you have a better solution for solving the zilb.h related build error? For details, please check the attached email from Edhaya.

Best Regards,
Sunny
-----Original Message-----
From: fwts-devel <fwts-devel-bounces at lists.ubuntu.com> On Behalf Of Alex Hung
Sent: 12 December 2021 00:32
To: fwts-devel at lists.ubuntu.com
Subject: [PATCH][V4] dmicheck: skip scanning smbios in /dev/mem on aarch64

Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
 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 <stdio.h>
+#include <zlib.h>

 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 <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <zlib.h>

 #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 <sys/utsname.h>
+
+#include "fwts.h"
+#include "fwts_kernel.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <bsd/string.h>
+
+#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;
+}
--
2.34.1


--
fwts-devel mailing list
fwts-devel at lists.ubuntu.com
Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/fwts-devel
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
-------------- next part --------------
An embedded message was scrubbed...
From: G Edhaya Chandran <Edhaya.Chandran at arm.com>
Subject: RE: [PATCH][V3] dmicheck: skip scanning smbios in /dev/mem on aarch64
Date: Mon, 13 Dec 2021 07:48:18 +0000
Size: 234909
URL: <https://lists.ubuntu.com/archives/fwts-devel/attachments/20211215/63b31fa0/attachment-0001.mht>


More information about the fwts-devel mailing list