[PATCH][V2] dmicheck: skip scanning smbios in /dev/mem on aarch64
Alex Hung
alex.hung at canonical.com
Wed Nov 10 20:25:04 UTC 2021
Buglink: https://bugs.launchpad.net/bugs/1947786
Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
src/dmi/dmicheck/dmicheck.c | 10 +++++
src/lib/include/fwts.h | 1 +
src/lib/include/fwts_kernel.h | 25 ++++++++++++
src/lib/src/Makefile.am | 1 +
src/lib/src/fwts_kernel.c | 74 +++++++++++++++++++++++++++++++++++
5 files changed, 111 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..67715687 100644
--- a/src/dmi/dmicheck/dmicheck.c
+++ b/src/dmi/dmicheck/dmicheck.c
@@ -381,6 +381,11 @@ 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"))
+ return NULL;
+#endif
+
mem = fwts_mmap(addr, length);
if (mem != FWTS_MAP_FAILED) {
/* Can we safely copy the table? */
@@ -429,6 +434,11 @@ 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"))
+ 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_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_kernel.c b/src/lib/src/fwts_kernel.c
new file mode 100644
index 00000000..10d11a99
--- /dev/null
+++ b/src/lib/src/fwts_kernel.c
@@ -0,0 +1,74 @@
+/*
+ * 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-"
+
+/*
+ * 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)
+{
+ 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;
+}
--
2.32.0
More information about the fwts-devel
mailing list