summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2023-01-29 17:37:16 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2023-01-29 17:37:16 (GMT)
commit0507bdb3b56083c8e8b011fc3d4c16fed2700340 (patch)
treeb9ea8102d32e8ee68794678bd95dce911e8ef467 /src/common
parent1d07407c3e97611bbf7c15ed6c1d6b8a37b0e228 (diff)
Retrieve CPU capabilities.
Diffstat (limited to 'src/common')
-rw-r--r--src/common/Makefile.am3
-rw-r--r--src/common/cpu.c100
-rw-r--r--src/common/cpu.h50
3 files changed, 153 insertions, 0 deletions
diff --git a/src/common/Makefile.am b/src/common/Makefile.am
index 638eee0..2f6fd6d 100644
--- a/src/common/Makefile.am
+++ b/src/common/Makefile.am
@@ -9,6 +9,7 @@ libcommon_la_SOURCES = \
bits.h bits.c \
compression.h compression.c \
cpp.h \
+ cpu.h cpu.c \
dllist.h dllist.c \
endianness.h endianness.c \
environment.h environment.c \
@@ -37,6 +38,8 @@ libcommon_la_SOURCES += \
endif
+cpu.lo: CFLAGS += -mavx512f
+
libcommon_la_CFLAGS = $(TOOLKIT_CFLAGS) $(LIBXML_CFLAGS)
if BUILD_CURL_SUPPORT
diff --git a/src/common/cpu.c b/src/common/cpu.c
new file mode 100644
index 0000000..968def5
--- /dev/null
+++ b/src/common/cpu.c
@@ -0,0 +1,100 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * cpu.c - obtention d'indications de fonctionnalités liées au CPU
+ *
+ * Copyright (C) 2022 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide 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 Chrysalide. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "cpu.h"
+
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Indique les capacités de calculs parallèles anticipées. *
+* *
+* Retour : Fonctionnalités disponibles lors de la compilation. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+CPUSMIDFeature get_supported_cpu_smid_feature(void)
+{
+ CPUSMIDFeature result; /* Indications à retourner */
+
+ result = CSF_NONE;
+
+ /**
+ * $ gcc -mavx512f -dM -E - < /dev/null | grep AVX
+ * #define __AVX512F__ 1
+ * #define __AVX__ 1
+ * #define __AVX2__ 1
+ */
+
+#ifdef __AVX2__
+ result |= CSF_AVX2;
+#endif
+
+#ifdef __AVX512F__
+ result |= CSF_AVX512;
+#endif
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Indique les capacités de calculs parallèles sollicitables. *
+* *
+* Retour : Fonctionnalités disponibles dans l'environnement. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+CPUSMIDFeature get_avalaible_cpu_smid_feature(void)
+{
+ CPUSMIDFeature result; /* Indications à retourner */
+
+ result = CSF_NONE;
+
+ /**
+ * Cf. Documentations suivantes :
+ * - https://www.intel.com/content/dam/develop/external/us/en/documents/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family.pdf
+ * - https://gcc.gnu.org/onlinedocs/gcc/x86-Built-in-Functions.html
+ */
+
+ __builtin_cpu_init();
+
+ if (__builtin_cpu_supports("ssse3"))
+ result |= CSF_AVX2;
+
+ if (__builtin_cpu_supports("avx512f"))
+ result |= CSF_AVX512;
+
+ return result;
+
+}
diff --git a/src/common/cpu.h b/src/common/cpu.h
new file mode 100644
index 0000000..58e53bd
--- /dev/null
+++ b/src/common/cpu.h
@@ -0,0 +1,50 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * cpu.h - prototypes pour l'obtention d'indications de fonctionnalités liées au CPU
+ *
+ * Copyright (C) 2022 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * Chrysalide 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Chrysalide 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 Chrysalide. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _COMMON_CPU_H
+#define _COMMON_CPU_H
+
+
+
+/* Indication de capacité de calculs parallèles */
+typedef enum _CPUSMIDFeature
+{
+ CSF_NONE = (0 << 0), /* Absence d'indication */
+
+ CSF_AVX2 = (1 << 0), /* Advanced Vector Extensions */
+ CSF_AVX512 = (1 << 1), /* Advanced Vector Extensions */
+
+ CSF_ALL = ((1 << 2) - 1),
+
+} CPUSMIDFeature;
+
+
+/* Indique les capacités de calculs parallèles anticipées. */
+CPUSMIDFeature get_supported_cpu_smid_feature(void);
+
+/* Indique les capacités de calculs parallèles sollicitables. */
+CPUSMIDFeature get_avalaible_cpu_smid_feature(void);
+
+
+
+#endif /* _COMMON_CPU_H */