Package: kcov

Version: 38+dfsg-1
Severity: wishlist
Tags: patch
User: debian-de...@lists.debian.org
Usertags: loongarch64

Dear maintainers,

  When I compiled kcov for loongarch architecture, it reported missing architecture support.

We have added loongarch architecture support for kcov, the patch

can be found in the attachment.

And the patch is merged in github https://github.com/SimonKagstrom/kcov/commit/02bc582371c5ff5f4b4781975c2c12f9744b4162

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


Description: Add loongarch64 support
Signed-off-by: chenfeiyang <chenfeiy...@loongson.cn>
Pull request link: https://github.com/SimonKagstrom/kcov/pull/399
Last-Update: 2023-08-31

--- kcov-38+dfsg.orig/src/engines/ptrace.cc
+++ kcov-38+dfsg/src/engines/ptrace.cc
@@ -49,6 +49,12 @@ static unsigned long arch_setupBreakpoin
 	unsigned long shift = 8 * offs;
 
 	val = (old_data & ~(0xffffffffUL << shift)) | (0xd4200000UL << shift);
+#elif defined(__loongarch__)
+	unsigned long aligned_addr = getAligned(addr);
+	unsigned long offs = addr - aligned_addr;
+	unsigned long shift = 8 * offs;
+
+	val = (old_data & ~(0xffffffffUL << shift)) | (0x002a0004UL << shift); /* break 0x4 */
 #else
 # error Unsupported architecture
 #endif
--- kcov-38+dfsg.orig/src/engines/ptrace_linux.cc
+++ kcov-38+dfsg/src/engines/ptrace_linux.cc
@@ -3,7 +3,7 @@
 #include <sys/ptrace.h>
 #include <sys/wait.h>
 
-#if defined(__aarch64__)
+#if defined(__aarch64__) || defined(__loongarch__)
 #  include <sys/uio.h>
 #  include <elf.h>
 #endif
@@ -20,6 +20,7 @@
 enum
 {
 	i386_EIP = 12, x86_64_RIP = 16, ppc_NIP = 32, arm_PC = 15, aarch64_PC = 32, // See Linux arch/arm64/include/asm/ptrace.h
+	loongarch_ERA = 33
 };
 
 static void arch_adjustPcAfterBreakpoint(unsigned long *regs);
@@ -40,7 +41,7 @@ static void arch_adjustPcAfterBreakpoint
 	regs[i386_EIP]--;
 #elif defined(__x86_64__)
 	regs[x86_64_RIP]--;
-#elif defined(__powerpc__) || defined(__arm__) || defined(__aarch64__)
+#elif defined(__powerpc__) || defined(__arm__) || defined(__aarch64__) ||defined(__loongarch__)
 	// Do nothing
 #else
 # error Unsupported architecture
@@ -61,6 +62,8 @@ static unsigned long arch_getPcFromRegs(
 	out = regs[aarch64_PC];
 #elif defined(__powerpc__)
 	out = regs[ppc_NIP];
+#elif defined(__loongarch__)
+	out = regs[loongarch_ERA];
 #else
 # error Unsupported architecture
 #endif
@@ -318,7 +321,7 @@ static unsigned long getPcFromRegs(unsig
 
 static long getRegs(pid_t pid, void *addr, void *regs, size_t len)
 {
-#if defined(__aarch64__)
+#if defined(__aarch64__) || defined(__loongarch__)
 	struct iovec iov =
 	{	regs, len};
 	return ptrace(PTRACE_GETREGSET, pid, (void *)NT_PRSTATUS, &iov);
@@ -366,7 +369,7 @@ void ptrace_sys::pokeWord(pid_t pid, uns
 
 static long setRegs(pid_t pid, void *addr, void *regs, size_t len)
 {
-#if defined(__aarch64__)
+#if defined(__aarch64__) || defined(__loongarch__)
 	struct iovec iov =
 	{	regs, len};
 	return ptrace(PTRACE_SETREGSET, pid, (void *)NT_PRSTATUS, &iov);
@@ -389,7 +392,7 @@ void ptrace_sys::singleStep(pid_t pid)
 void ptrace_sys::skipInstruction(pid_t pid)
 {
 	// Nop on x86, op on PowerPC/ARM
-#if defined(__powerpc__) || defined(__arm__) || defined(__aarch64__)
+#if defined(__powerpc__) || defined(__arm__) || defined(__aarch64__) || defined(__loongarch__)
 	unsigned long regs[1024];
 
 	getRegs(pid, NULL, regs, sizeof regs);
@@ -398,6 +401,8 @@ void ptrace_sys::skipInstruction(pid_t p
 	regs[ppc_NIP] += 4;
 # elif defined(__aarch64__)
 	regs[aarch64_PC] += 4;
+# elif defined(__loongarch__)
+	regs[loongarch_ERA] += 4;
 # else
 	regs[arm_PC] += 4;
 # endif
--- kcov-38+dfsg.orig/src/solib-parser/lib.c
+++ kcov-38+dfsg/src/solib-parser/lib.c
@@ -95,6 +95,8 @@ static void force_breakpoint(void)
 			".long 0xfedeffe7\n" /* undefined insn */
 #elif defined(__aarch64__)
 			".long 0xd4200000\n" /* From https://github.com/scottt/debugbreak */
+#elif defined(__loongarch__)
+			"break 0x4\n"
 #else
 # error Unsupported architecture
 #endif

Reply via email to