Skip to content

Commit 4ae3e13

Browse files
Youling TangSixWeining
authored andcommitted
[sanitizer] Add ptrace interceptor support for LoongArch
Add ptrace interceptor support for LoongArch, `ptrace.cpp` has been tested and passed. Reviewed By: SixWeining Differential Revision: https://reviews.llvm.org/D137228
1 parent 925eaeb commit 4ae3e13

File tree

6 files changed

+44
-12
lines changed

6 files changed

+44
-12
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2512,7 +2512,7 @@ PRE_SYSCALL(ptrace)(long request, long pid, long addr, long data) {
25122512
# if !SANITIZER_ANDROID && \
25132513
(defined(__i386) || defined(__x86_64) || defined(__mips64) || \
25142514
defined(__powerpc64__) || defined(__aarch64__) || defined(__s390__) || \
2515-
SANITIZER_RISCV64)
2515+
defined(__loongarch__) || SANITIZER_RISCV64)
25162516
if (data) {
25172517
if (request == ptrace_setregs) {
25182518
PRE_READ((void *)data, struct_user_regs_struct_sz);
@@ -2534,7 +2534,7 @@ POST_SYSCALL(ptrace)(long res, long request, long pid, long addr, long data) {
25342534
# if !SANITIZER_ANDROID && \
25352535
(defined(__i386) || defined(__x86_64) || defined(__mips64) || \
25362536
defined(__powerpc64__) || defined(__aarch64__) || defined(__s390__) || \
2537-
SANITIZER_RISCV64)
2537+
defined(__loongarch__) || SANITIZER_RISCV64)
25382538
if (res >= 0 && data) {
25392539
// Note that this is different from the interceptor in
25402540
// sanitizer_common_interceptors.inc.

compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@
273273
#if SI_LINUX_NOT_ANDROID && \
274274
(defined(__i386) || defined(__x86_64) || defined(__mips64) || \
275275
defined(__powerpc64__) || defined(__aarch64__) || defined(__arm__) || \
276-
defined(__s390__) || SANITIZER_RISCV64)
276+
defined(__s390__) || defined(__loongarch__) || SANITIZER_RISCV64)
277277
#define SANITIZER_INTERCEPT_PTRACE 1
278278
#else
279279
#define SANITIZER_INTERCEPT_PTRACE 0

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
# include <utime.h>
9595
# include <sys/ptrace.h>
9696
# if defined(__mips64) || defined(__aarch64__) || defined(__arm__) || \
97-
defined(__hexagon__) || SANITIZER_RISCV64
97+
defined(__hexagon__) || defined(__loongarch__) ||SANITIZER_RISCV64
9898
# include <asm/ptrace.h>
9999
# ifdef __arm__
100100
typedef struct user_fpregs elf_fpregset_t;
@@ -352,7 +352,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
352352
#if SANITIZER_LINUX && !SANITIZER_ANDROID && \
353353
(defined(__i386) || defined(__x86_64) || defined(__mips64) || \
354354
defined(__powerpc64__) || defined(__aarch64__) || defined(__arm__) || \
355-
defined(__s390__) || SANITIZER_RISCV64)
355+
defined(__s390__) || defined(__loongarch__)|| SANITIZER_RISCV64)
356356
#if defined(__mips64) || defined(__powerpc64__) || defined(__arm__)
357357
unsigned struct_user_regs_struct_sz = sizeof(struct pt_regs);
358358
unsigned struct_user_fpregs_struct_sz = sizeof(elf_fpregset_t);
@@ -362,21 +362,24 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
362362
#elif defined(__aarch64__)
363363
unsigned struct_user_regs_struct_sz = sizeof(struct user_pt_regs);
364364
unsigned struct_user_fpregs_struct_sz = sizeof(struct user_fpsimd_state);
365+
#elif defined(__loongarch__)
366+
unsigned struct_user_regs_struct_sz = sizeof(struct user_pt_regs);
367+
unsigned struct_user_fpregs_struct_sz = sizeof(struct user_fp_state);
365368
#elif defined(__s390__)
366369
unsigned struct_user_regs_struct_sz = sizeof(struct _user_regs_struct);
367370
unsigned struct_user_fpregs_struct_sz = sizeof(struct _user_fpregs_struct);
368371
#else
369372
unsigned struct_user_regs_struct_sz = sizeof(struct user_regs_struct);
370373
unsigned struct_user_fpregs_struct_sz = sizeof(struct user_fpregs_struct);
371-
#endif // __mips64 || __powerpc64__ || __aarch64__
374+
#endif // __mips64 || __powerpc64__ || __aarch64__ || __loongarch__
372375
#if defined(__x86_64) || defined(__mips64) || defined(__powerpc64__) || \
373376
defined(__aarch64__) || defined(__arm__) || defined(__s390__) || \
374-
SANITIZER_RISCV64
377+
defined(__loongarch__) || SANITIZER_RISCV64
375378
unsigned struct_user_fpxregs_struct_sz = 0;
376379
#else
377380
unsigned struct_user_fpxregs_struct_sz = sizeof(struct user_fpxregs_struct);
378381
#endif // __x86_64 || __mips64 || __powerpc64__ || __aarch64__ || __arm__
379-
// || __s390__
382+
// || __s390__ || __loongarch__
380383
#ifdef __arm__
381384
unsigned struct_user_vfpregs_struct_sz = ARM_VFPREGS_SIZE;
382385
#else

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,7 @@ typedef void __sanitizer_FILE;
843843
#if SANITIZER_LINUX && !SANITIZER_ANDROID && \
844844
(defined(__i386) || defined(__x86_64) || defined(__mips64) || \
845845
defined(__powerpc64__) || defined(__aarch64__) || defined(__arm__) || \
846-
defined(__s390__) || SANITIZER_RISCV64)
846+
defined(__s390__) || defined(__loongarch__) || SANITIZER_RISCV64)
847847
extern unsigned struct_user_regs_struct_sz;
848848
extern unsigned struct_user_fpregs_struct_sz;
849849
extern unsigned struct_user_fpxregs_struct_sz;

compiler-rt/test/asan/TestCases/Linux/ptrace.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
#include <unistd.h>
1515
#include <sys/uio.h> // for iovec
1616
#include <elf.h> // for NT_PRSTATUS
17-
#ifdef __aarch64__
18-
# include <asm/ptrace.h>
17+
#if defined(__aarch64__) || defined(__loongarch__)
18+
# include <asm/ptrace.h>
1919
#endif
2020

2121
#if defined(__i386__) || defined(__x86_64__)
@@ -37,6 +37,13 @@ typedef struct user_fpsimd_state fpregs_struct;
3737
#define PRINT_REG_FP(__fpregs) printf ("%x\n", (unsigned) (__fpregs.fpsr))
3838
#define ARCH_IOVEC_FOR_GETREGSET
3939

40+
#elif defined(__loongarch__)
41+
typedef struct user_pt_regs regs_struct;
42+
typedef struct user_fp_state fpregs_struct;
43+
# define PRINT_REG_PC(__regs) printf("%lx\n", (unsigned long)(__regs.csr_era))
44+
# define PRINT_REG_FP(__fpregs) printf("%x\n", (unsigned)(__fpregs.fcsr))
45+
# define ARCH_IOVEC_FOR_GETREGSET
46+
4047
#elif defined(__powerpc64__)
4148
typedef struct pt_regs regs_struct;
4249
typedef elf_fpregset_t fpregs_struct;

compiler-rt/test/sanitizer_common/TestCases/Linux/ptrace.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#include <asm/ptrace.h>
1818
#include <sys/procfs.h>
1919
#endif
20-
#ifdef __aarch64__
20+
#if defined(__aarch64__) || defined(__loongarch__)
2121
// GLIBC 2.20+ sys/user does not include asm/ptrace.h
2222
#include <asm/ptrace.h>
2323
#endif
@@ -100,6 +100,28 @@ int main(void) {
100100
printf("%x\n", fpregs.fpsr);
101101
#endif // (__aarch64__)
102102

103+
#if (__loongarch__)
104+
struct iovec regset_io;
105+
106+
struct user_pt_regs regs;
107+
regset_io.iov_base = &regs;
108+
regset_io.iov_len = sizeof(regs);
109+
res =
110+
ptrace(PTRACE_GETREGSET, pid, (void *)NT_PRSTATUS, (void *)&regset_io);
111+
assert(!res);
112+
if (regs.csr_era)
113+
printf("%lx\n", regs.csr_era);
114+
115+
struct user_fp_state fpregs;
116+
regset_io.iov_base = &fpregs;
117+
regset_io.iov_len = sizeof(fpregs);
118+
res =
119+
ptrace(PTRACE_GETREGSET, pid, (void *)NT_FPREGSET, (void *)&regset_io);
120+
assert(!res);
121+
if (fpregs.fcsr)
122+
printf("%x\n", fpregs.fcsr);
123+
#endif // (__loongarch__)
124+
103125
#if (__s390__)
104126
struct iovec regset_io;
105127

0 commit comments

Comments
 (0)