[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1062361: gnss-sdr: add support for loongarch64



Source: gnss-sdr
Version: 0.0.18-2
Severity: wishlist
Tags: patch
User: debian-loongarch@lists.debian.org
Usertags: loong64

Dear maintainers,

We need to add loongarch64 support in gnss-sdr.
Please consider the patch I have attached.
If the maintainer sees no problem with the patch, can also submit to upstream.

In addition, I give feedback on an error when compiling on my local ENV, for example:
```
......
/usr/include/gnuradio/io_signature.h:194:73: error: ‘string_view’ is not a member of ‘std’   194 | struct GR_RUNTIME_API fmt::formatter<gr::io_signature> : formatter<std::string_view> {
| ^~~~~~~~~~~
/usr/include/gnuradio/io_signature.h:194:73: note: ‘std::string_view’ is only available from C++17 onwards /usr/include/gnuradio/io_signature.h:194:73: error: ‘string_view’ is not a member of ‘std’ /usr/include/gnuradio/io_signature.h:194:73: note: ‘std::string_view’ is only available from C++17 onwards /usr/include/gnuradio/io_signature.h:194:84: error: template argument 1 is invalid   194 | struct GR_RUNTIME_API fmt::formatter<gr::io_signature> : formatter<std::string_view> {
|
```

If you have any questions, you can contact me at any time.

Thanks,
Dandan Zhang

Description: Add loongarch64 support 
Last-Update: 2024-01-30

--- gnss-sdr-0.0.18.orig/CMakeLists.txt
+++ gnss-sdr-0.0.18/CMakeLists.txt
@@ -1200,7 +1200,7 @@ if(NOT VOLKGNSSSDR_FOUND)
     include(GNUInstallDirs)
     set(SUPPORTED_CPU_FEATURES_ARCH FALSE)
     if(CMAKE_SYSTEM_PROCESSOR MATCHES
-        "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)|^riscv")
+	"(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^loongarch64)|(^loong64)|(^powerpc)|(^ppc)|(^s390x)|^riscv")
         set(SUPPORTED_CPU_FEATURES_ARCH TRUE)
     endif()
     if(${CMAKE_INSTALL_LIBDIR} MATCHES lib64)
@@ -1239,7 +1239,7 @@ if(NOT VOLKGNSSSDR_FOUND)
                 set_package_properties(CPUFEATURES PROPERTIES
                     DESCRIPTION "A cross platform C99 library to get CPU features at runtime (version: ${CPUFEATURES_VERSION})"
                 )
-                if((CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0")) # detect cpu_features without s390x / riscv support
+		if((CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv|(^loongarch64)|(^loong64)") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0")) # detect cpu_features without s390x / riscv support
                     set(ENABLE_CPUFEATURES OFF)
                 endif()
             else()
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt
@@ -258,7 +258,7 @@ endif()
 
 # cpu_features - sensible defaults, user settable option
 if(CMAKE_SYSTEM_PROCESSOR MATCHES
-    "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)|^riscv")
+    "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^loongarch64)|(^loong64)|(^powerpc)|(^ppc)|(^s390x)|^riscv")
     option(VOLK_CPU_FEATURES "volk-gnsssdr uses cpu_features" ON)
 else()
     option(VOLK_CPU_FEATURES "volk-gnsssdr uses cpu_features" OFF)
@@ -266,7 +266,7 @@ endif()
 
 if(CMAKE_VERSION VERSION_GREATER 3.0 AND VOLK_CPU_FEATURES)
     find_package(CPUFEATURES)
-    if(CPUFEATURES_FOUND AND (CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0"))
+    if(CPUFEATURES_FOUND AND (CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv|(^loongarch64)|(^loong64)") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0"))
         set(USE_CPU_FEATURES OFF)
         unset(CPUFEATURES_FOUND CACHE)
         message(STATUS "Building volk-gnsssdr without cpu_features, installed version v${CPUFEATURES_VERSION} does not support the ${CMAKE_SYSTEM_PROCESSOR} architecture")
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/CMakeLists.txt
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/CMakeLists.txt
@@ -54,6 +54,7 @@ set(PROCESSOR_IS_MIPS FALSE)
 set(PROCESSOR_IS_ARM FALSE)
 set(PROCESSOR_IS_AARCH64 FALSE)
 set(PROCESSOR_IS_X86 FALSE)
+set(PROCESSOR_IS_LOONGARCH64 FALSE)
 set(PROCESSOR_IS_POWER FALSE)
 set(PROCESSOR_IS_S390X FALSE)
 set(PROCESSOR_IS_RISCV FALSE)
@@ -66,6 +67,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^
   set(PROCESSOR_IS_ARM TRUE)
 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)")
   set(PROCESSOR_IS_X86 TRUE)
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(loongarch64)|^(loong64)")
+  set(PROCESSOR_IS_LOONGARCH64 TRUE)
 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
   set(PROCESSOR_IS_POWER TRUE)
 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x)")
@@ -90,6 +93,8 @@ macro(add_cpu_features_headers_and_sourc
       list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_x86.h)
       list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/cpuid_x86.h)
       list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/windows_utils.h)
+  elseif(PROCESSOR_IS_LOONGARCH64)
+      list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_loongarch64.h)
   elseif(PROCESSOR_IS_POWER)
       list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_ppc.h)
   elseif(PROCESSOR_IS_S390X)
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/README.md
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/README.md
@@ -158,14 +158,14 @@ flags           : aes,avx,cx16,smx,sse4_
 
 ## What's supported
 
-|         | x86³ | AArch64 |   ARM   |  MIPS⁴  |  POWER  | RISCV |  s390x  |
-| ------- | :--: | :-----: | :-----: | :-----: | :-----: | :---: | :-----: |
-| Linux   | yes² |  yes¹   |  yes¹   |  yes¹   |  yes¹   | yes¹  |  yes¹   |
-| FreeBSD | yes² | not yet | not yet | not yet | not yet |  N/A  | not yet |
-| MacOs   | yes² | not yet |   N/A   |   N/A   |   no    |  N/A  |   no    |
-| Windows | yes² | not yet | not yet |   N/A   |   N/A   |  N/A  |   N/A   |
-| Android | yes² |  yes¹   |  yes¹   |  yes¹   |   N/A   |  N/A  |   N/A   |
-| iOS     | N/A  | not yet | not yet |   N/A   |   N/A   |  N/A  |   N/A   |
+|         | x86³ | AArch64 |   ARM   | LOONGARCH64 |  MIPS⁴  |  POWER  | RISCV |  s390x  |
+| ------- | :--: | :-----: | :-----: |   :-----:   | :-----: | :-----: | :---: | :-----: |
+| Linux   | yes² |  yes¹   |  yes¹   |     yes¹    |  yes¹   |  yes¹   | yes¹  |  yes¹   |
+| FreeBSD | yes² | not yet | not yet |   not yet   | not yet | not yet |  N/A  | not yet |
+| MacOs   | yes² | not yet |   N/A   |     N/A     |   N/A   |   no    |  N/A  |   no    |
+| Windows | yes² | not yet | not yet |     N/A     |   N/A   |   N/A   |  N/A  |   N/A   |
+| Android | yes² |  yes¹   |  yes¹   |     N/A     |  yes¹   |   N/A   |  N/A  |   N/A   |
+| iOS     | N/A  | not yet | not yet |     N/A     |   N/A   |   N/A   |  N/A  |   N/A   |
 
 1.  **Features revealed from Linux.** We gather data from several sources
     depending on availability:
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/cpu_features_macros.h
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/cpu_features_macros.h
@@ -36,6 +36,10 @@
 #define CPU_FEATURES_ARCH_ANY_ARM
 #endif
 
+#if (defined(__loongarch64)
+#define CPU_FEATURES_ARCH_LOONGARCH64
+#endif
+
 #if defined(__mips64)
 #define CPU_FEATURES_ARCH_MIPS64
 #endif
--- /dev/null
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/cpuinfo_loongarch64.h
@@ -0,0 +1,61 @@
+// SPDX-FileCopyrightText: 2023 Google LLC
+// SPDX-License-Identifier: Apache-2.0
+
+#ifndef CPU_FEATURES_INCLUDE_CPUINFO_LOONGARCH64_H_
+#define CPU_FEATURES_INCLUDE_CPUINFO_LOONGARCH64_H_
+
+#include "cpu_features_cache_info.h"
+#include "cpu_features_macros.h"
+#include <stdint.h>  
+
+CPU_FEATURES_START_CPP_NAMESPACE
+
+typedef struct
+{
+    int cpucfg : 1; 
+    int lam : 1;
+    int ual : 1;
+    int fpu : 1;
+    int lsx : 1;
+    int lasx : 1;
+    int crc32 : 1;
+    int complex : 1;
+    int crypto : 1;
+    int lvz : 1;
+
+} Loongarch64Features;
+
+typedef struct
+{
+    Loongarch64Features features;
+} Loongarch64Info;
+
+Loongarch64Info GetLoongarch64Info(void);
+
+typedef enum
+{
+    LOONGARCH64_CPUCFG,
+    LOONGARCH64_LAM,
+    LOONGARCH64_UAL,   
+    LOONGARCH64_FPU,
+    LOONGARCH64_LSX,
+    LOONGARCH64_LASX,   
+    LOONGARCH64_CRC32,
+    LOONGARCH64_COMPLEX,
+    LOONGARCH64_CRYPTO,
+    LOONGARCH64_LVZ,
+    LOONGARCH64_LAST_,
+} Loongarch64FeaturesEnum;
+
+int GetLoongarch64FeaturesEnumValue(const Loongarch64Features* features,
+    Loongarch64FeaturesEnum value);
+
+const char* GetLoongarch64FeaturesEnumName(Loongarch64FeaturesEnum);
+
+CPU_FEATURES_END_CPP_NAMESPACE
+
+#if !defined(CPU_FEATURES_ARCH_LOONGARCH64)
+#error "Including cpuinfo_loongarch64.h from a non-loongarch64 target."
+#endif
+
+#endif  // CPU_FEATURES_INCLUDE_CPUINFO_LOONGARCH64_H_
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/internal/hwcaps.h
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/internal/hwcaps.h
@@ -101,6 +101,18 @@ CPU_FEATURES_START_CPP_NAMESPACE
 #define ARM_HWCAP2_SHA2 (1UL << 3)
 #define ARM_HWCAP2_CRC32 (1UL << 4)
 
+//LOONGARCH64
+#define LOONGARCH64_HWCAP_CPUCFG          (1UL << 0)
+#define LOONGARCH64_HWCAP_LAM             (1UL << 1)
+#define LOONGARCH64_HWCAP_UAL             (1UL << 2)
+#define LOONGARCH64_HWCAP_FPU             (1UL << 3)
+#define LOONGARCH64_HWCAP_LSX             (1UL << 4)
+#define LOONGARCH64_HWCAP_LASX            (1UL << 5)
+#define LOONGARCH64_HWCAP_CRC32           (1UL << 6)
+#define LOONGARCH64_HWCAP_COMPLEX         (1UL << 7)
+#define LOONGARCH64_HWCAP_CRYPTO          (1UL << 8)
+#define LOONGARCH64_HWCAP_LVZ             (1UL << 9)
+
 // http://elixir.free-electrons.com/linux/latest/source/arch/mips/include/uapi/asm/hwcap.h
 #define MIPS_HWCAP_R6 (1UL << 0)
 #define MIPS_HWCAP_MSA (1UL << 1)
--- /dev/null
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/impl_loongarch64_linux.c
@@ -0,0 +1,90 @@
+// SPDX-FileCopyrightText: 2023 Google LLC
+// SPDX-License-Identifier: Apache-2.0
+
+#include "cpu_features_macros.h"
+
+#ifdef CPU_FEATURES_ARCH_LOONGARCH64
+#if defined(CPU_FEATURES_OS_LINUX)
+
+#include "cpuinfo_loongarch64.h"
+
+////////////////////////////////////////////////////////////////////////////////
+// Definitions for introspection.
+////////////////////////////////////////////////////////////////////////////////
+#define INTROSPECTION_TABLE                              		         \
+    LINE(LOONGARCH64_CPUCFG, cpucfg, "cpucfg", LOONGARCH64_HWCAP_CPUCFG, 0)      \
+    LINE(LOONGARCH64_LAM, lam, "lam", LOONGARCH64_HWCAP_LAM, 0)                  \
+    LINE(LOONGARCH64_UAL, ual, "ual", LOONGARCH64_HWCAP_UAL, 0)                  \
+    LINE(LOONGARCH64_FPU, fpu, "fpu", LOONGARCH64_HWCAP_FPU, 0)                  \
+    LINE(LOONGARCH64_LSX, lsx, "lsx", LOONGARCH64_HWCAP_LSX, 0)                  \
+    LINE(LOONGARCH64_LASX, lasx, "lasx", LOONGARCH64_HWCAP_LASX, 0)              \
+    LINE(LOONGARCH64_CRC32, crc32, "crc32", LOONGARCH64_HWCAP_CRC32, 0)          \
+    LINE(LOONGARCH64_COMPLEX, complex, "complex", LOONGARCH64_HWCAP_COMPLEX, 0)  \
+    LINE(LOONGARCH64_CRYPTO, crypto, "crypto", LOONGARCH64_HWCAP_CRYPTO, 0)      \
+    LINE(LOONGARCH64_LVZ, lvz, "lvz", LOONGARCH64_HWCAP_LVZ, 0)                  \
+#define INTROSPECTION_PREFIX Loongarch64
+#define INTROSPECTION_ENUM_PREFIX LOONGARCH64
+#include "define_introspection_and_hwcaps.inl"
+
+////////////////////////////////////////////////////////////////////////////////
+// Implementation.
+////////////////////////////////////////////////////////////////////////////////
+
+#include "internal/filesystem.h"
+#include "internal/stack_line_reader.h"
+#include <stdbool.h>
+#include <stdio.h>
+
+static const Loongarch64Info kEmptyLoongarch64Info;
+
+static void HandleLoongarch64Line(StringView line, Loongarch64Features* const features)
+{
+    for (size_t i = 0; i < LOONGARCH64_LAST_; ++i)
+        {
+            StringView flag = str(kCpuInfoFlags[i]);
+            int index_of_flag = CpuFeatures_StringView_IndexOf(line, flag);
+            bool is_set = index_of_flag != -1;
+            kSetters[i](features, is_set);
+            if (is_set)
+                line = CpuFeatures_StringView_PopFront(line, index_of_flag + flag.size);
+        }
+}
+
+static bool HandleLoongarch64Line(const LineResult result, Loongarch64Info* const info)
+{
+    StringView line = result.line;
+    StringView key, value;
+    if (CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value))
+        {
+            if (CpuFeatures_StringView_IsEquals(key, str("Features")))
+                {
+                    HandleLoongarch64Line(value, &info->features);
+                }
+        }
+    return !result.eof;
+}
+
+static void FillProcCpuInfoData(Loongarch64Info* const info)
+{
+    const int fd = CpuFeatures_OpenFile("/proc/cpuinfo");
+    if (fd >= 0)
+        {
+            StackLineReader reader;
+            StackLineReader_Initialize(&reader, fd);
+            for (;;)
+                {
+                    if (!HandleLoongarch64Line(StackLineReader_NextLine(&reader), info)) break;
+                }
+            CpuFeatures_CloseFile(fd);
+        }
+}
+
+Loongarch64Info GetLoongarch64Info(void)
+{
+    Loongarch64Info info = kEmptyLoongarch64Info;
+    FillProcCpuInfoData(&info);
+    return info;
+}
+
+#endif  //  defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID)
+#endif  // CPU_FEATURES_ARCH_LOONGARCH64
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/utils/list_cpu_features.c
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/utils/list_cpu_features.c
@@ -19,6 +19,8 @@
 #include "cpuinfo_arm.h"
 #elif defined(CPU_FEATURES_ARCH_AARCH64)
 #include "cpuinfo_aarch64.h"
+#elif defined(CPU_FEATURES_ARCH_LOONGARCH64)
+#include "cpuinfo_loongarch64.h"
 #elif defined(CPU_FEATURES_ARCH_MIPS)
 #include "cpuinfo_mips.h"
 #elif defined(CPU_FEATURES_ARCH_PPC)
@@ -210,6 +212,9 @@ DEFINE_ADD_FLAGS(GetArmFeaturesEnumValue
 #elif defined(CPU_FEATURES_ARCH_AARCH64)
 DEFINE_ADD_FLAGS(GetAarch64FeaturesEnumValue, GetAarch64FeaturesEnumName,
     Aarch64Features, AARCH64_LAST_)
+#elif defined(CPU_FEATURES_ARCH_LOONGARCH64)
+DEFINE_ADD_FLAGS(GetLoongarch64FeaturesEnumValue, GetLoongarch64FeaturesEnumName, 
+    Loongarch64Features, LOONGARCH64_LAST_)
 #elif defined(CPU_FEATURES_ARCH_MIPS)
 DEFINE_ADD_FLAGS(GetMipsFeaturesEnumValue, GetMipsFeaturesEnumName,
     MipsFeatures, MIPS_LAST_)
@@ -428,6 +433,10 @@ static Node* CreateTree(void)
     AddMapEntry(root, "part", CreateInt(info.part));
     AddMapEntry(root, "revision", CreateInt(info.revision));
     AddFlags(root, &info.features);
+#elif defined(CPU_FEATURES_ARCH_LOONGARCH64)
+    const Loongarch64Info info = GetLoongarch64Info();
+    AddMapEntry(root, "arch", CreateString("loongarch64"));
+    AddFlags(root, &info.features);
 #elif defined(CPU_FEATURES_ARCH_MIPS)
     const MipsInfo info = GetMipsInfo();
     AddMapEntry(root, "arch", CreateString("mips"));
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/CMakeLists.txt
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/CMakeLists.txt
@@ -83,6 +83,13 @@ if(PROCESSOR_IS_AARCH64)
   add_test(NAME cpuinfo_aarch64_test COMMAND cpuinfo_aarch64_test)
 endif()
 ##------------------------------------------------------------------------------
+## cpuinfo_loongarch64_test
+if(PROCESSOR_IS_LOONGARCH64)
+  add_executable(cpuinfo_loongarch64_test cpuinfo_loongarch64_test.cc  ../src/impl_loongarch64_linux.c)
+  target_link_libraries(cpuinfo_loongarch64_test all_libraries)
+  add_test(NAME cpuinfo_loongarch64_test COMMAND cpuinfo_loongarch64_test)
+endif()
+##------------------------------------------------------------------------------
 ## cpuinfo_mips_test
 if(PROCESSOR_IS_MIPS)
   add_executable(cpuinfo_mips_test cpuinfo_mips_test.cc  ../src/impl_mips_linux_or_android.c)
@@ -109,4 +116,4 @@ if(PROCESSOR_IS_RISCV)
   add_executable(cpuinfo_riscv_test cpuinfo_riscv_test.cc  ../src/impl_riscv_linux.c)
   target_link_libraries(cpuinfo_riscv_test all_libraries)
   add_test(NAME cpuinfo_riscv_test COMMAND cpuinfo_riscv_test)
-endif()
\ No newline at end of file
+endif()
--- /dev/null
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/cpuinfo_loongarch64_test.cc
@@ -0,0 +1,113 @@
+// SPDX-FileCopyrightText: 2023 Google LLC
+// SPDX-License-Identifier: Apache-2.0
+
+#include "cpuinfo_loongarch64.h"
+#include "filesystem_for_testing.h"
+#include "gtest/gtest.h"
+#include "hwcaps_for_testing.h"
+
+namespace cpu_features
+{
+namespace
+{
+
+TEST(CpuinfoLoongarch64Test, Loongarch64FeaturesEnum)
+{
+    const char* last_name = GetLoongarch64FeaturesEnumName(LOONGARCH64_LAST_);
+    EXPECT_STREQ(last_name, "unknown_feature");
+    for (int i = static_cast<int>(LOONGARCH64_CPUCFG); i != static_cast<int>(LOONGARCH64_LAST_); ++i)
+        {
+            const auto feature = static_cast<Loongarch64FeaturesEnum>(i);
+            const char* name = GetLoongarch64FeaturesEnumName(feature);
+            ASSERT_FALSE(name == nullptr);
+            EXPECT_STRNE(name, "");
+            EXPECT_STRNE(name, last_name);
+        }
+}
+
+TEST(CpuinfoLoongarch64Test, Loongarch64CpuInfo)
+{
+    ResetHwcaps();
+    auto& fs = GetEmptyFilesystem();
+    fs.CreateFile("/proc/cpuinfo", R"(
+system type		: generic-loongson-machine
+
+processor		: 0
+package			: 0
+core			: 0
+global_id		: 0
+CPU Family		: Loongson-64bit
+Model Name		: Loongson-3A5000-HV
+CPU Revision		: 0x11
+FPU Revision		: 0x00
+CPU MHz			: 2500.00
+BogoMIPS		: 5000.00
+TLB Entries		: 2112
+Address Sizes		: 48 bits physical, 48 bits virtual
+ISA			: loongarch32 loongarch64
+Features		: cpucfg lam ual fpu lsx lasx crc32 lvz
+Hardware Watchpoint	: yes, iwatch count: 8, dwatch count: 8
+
+processor		: 1
+package			: 0
+core			: 1
+global_id		: 1
+CPU Family		: Loongson-64bit
+Model Name		: Loongson-3A5000-HV
+CPU Revision		: 0x11
+FPU Revision		: 0x00
+CPU MHz			: 2500.00
+BogoMIPS		: 5000.00
+TLB Entries		: 2112
+Address Sizes		: 48 bits physical, 48 bits virtual
+ISA			: loongarch32 loongarch64
+Features		: cpucfg lam ual fpu lsx lasx crc32 lvz
+Hardware Watchpoint	: yes, iwatch count: 8, dwatch count: 8
+
+processor		: 2
+package			: 0
+core			: 2
+global_id		: 2
+CPU Family		: Loongson-64bit
+Model Name		: Loongson-3A5000-HV
+CPU Revision		: 0x11
+FPU Revision		: 0x00
+CPU MHz			: 2500.00
+BogoMIPS		: 5000.00
+TLB Entries		: 2112
+Address Sizes		: 48 bits physical, 48 bits virtual
+ISA			: loongarch32 loongarch64
+Features		: cpucfg lam ual fpu lsx lasx crc32 lvz
+Hardware Watchpoint	: yes, iwatch count: 8, dwatch count: 8
+
+processor		: 3
+package			: 0
+core			: 3
+global_id		: 3
+CPU Family		: Loongson-64bit
+Model Name		: Loongson-3A5000-HV
+CPU Revision		: 0x11
+FPU Revision		: 0x00
+CPU MHz			: 2500.00
+BogoMIPS		: 5000.00
+TLB Entries		: 2112
+Address Sizes		: 48 bits physical, 48 bits virtual
+ISA			: loongarch32 loongarch64
+Features		: cpucfg lam ual fpu lsx lasx crc32 lvz
+Hardware Watchpoint	: yes, iwatch count: 8, dwatch count: 8)");
+    const auto info = GetLoongarch64Info();
+    
+    EXPECT_TRUE(info.features.cpucfg);
+    EXPECT_TRUE(info.features.isa);
+    EXPECT_TRUE(info.features.ual);
+    EXPECT_TRUE(info.features.fpu);
+    EXPECT_FALSE(info.features.lsx);
+    EXPECT_TRUE(info.features.lasx);
+    EXPECT_TRUE(info.features.crc32);
+    EXPECT_TRUE(info.features.complex);
+    EXPECT_TRUE(info.features.crypto);
+    EXPECT_FALSE(info.features.lvz);
+}
+
+}  // namespace
+}  // namespace cpu_features
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c
@@ -22,6 +22,8 @@
 #include "cpuinfo_arm.h"
 #elif defined(CPU_FEATURES_ARCH_AARCH64)
 #include "cpuinfo_aarch64.h"
+#elif defined(CPU_FEATURES_ARCH_LOONGARCH64)
+#include "cpuinfo_loongarch64.h"
 #elif defined(CPU_FEATURES_ARCH_MIPS)
 #include "cpuinfo_mips.h"
 #elif defined(CPU_FEATURES_ARCH_PPC)
@@ -53,6 +55,10 @@ static int i_can_has_${arch.name} (void)
 #if defined(CPU_FEATURES_ARCH_MIPS)
     if (GetMipsInfo().features.${check} == 0){ return 0; }
 #endif
+        %elif "loongarch64" in arch.name:
+#if defined(CPU_FEATURES_ARCH_LOONGARCH64)
+    if (GetLoongarch64Info().features.${check} == 0){ return 0; }
+#endif
         %elif "ppc" in arch.name:
 #if defined(CPU_FEATURES_ARCH_PPC)
     if (GetPPCInfo().features.${check} == 0){ return 0; }

Reply to: