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

Bug#1062361: marked as done (gnss-sdr: add support for loongarch64)



Your message dated Tue, 10 Dec 2024 19:33:28 +0800
with message-id <0cc1ab86-5d8b-8a18-6291-a2dc5f3aa911@loongson.cn>
and subject line Bug#1062361: Version 0.0.19-2.1 was available on loong64
has caused the Debian Bug report #1062361,
regarding gnss-sdr: add support for loongarch64
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
1062361: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1062361
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
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; }

--- End Message ---
--- Begin Message ---
Hi,

I have received Carles Fernandez's reply via private email.
Thanks for including loongarch64 support in upstream(https://github.com/gnss-sdr/gnss-sdr).

Now gnss-sdr 0.0.19-2.1 was available on loong64
Build status: https://buildd.debian.org/status/logs.php?pkg=gnss-sdr&ver=0.0.19-2.1&arch=loong64&suite=sid.

Best regards,
Dandan Zhang

--- End Message ---

Reply to: