Re: [PATCH] LoongArch: Support pointer guard on LoongArch32
caiyinyu <[email protected]>
| Newsgroups | gmane.comp.lib.glibc.alpha |
|---|---|
| Message-ID | <[email protected]> |
LGTM 在 2026/8/24 17:44, mengqinggang 写道: > Ping. > > > 在 2026/8/10 16:44, mengqinggang 写道: >> LoongArch32 Reduced has no rotri.d/rotri.w instructions. >> Use slli.w/srli.w/or to synthesize the rotation on LoongArch32 >> and LoongArch32 Reduced. >> >> Reported-by: Haiyong Sun <[email protected]> >> --- >> sysdeps/loongarch/__longjmp.S | 4 +- >> sysdeps/loongarch/setjmp.S | 4 +- >> .../sysv/linux/loongarch/pointer_guard-asm.h | 44 +++++++++++++------ >> 3 files changed, 34 insertions(+), 18 deletions(-) >> >> diff --git a/sysdeps/loongarch/__longjmp.S >> b/sysdeps/loongarch/__longjmp.S >> index 191f03320a..302cb6894a 100644 >> --- a/sysdeps/loongarch/__longjmp.S >> +++ b/sysdeps/loongarch/__longjmp.S >> @@ -23,9 +23,9 @@ >> ENTRY (__longjmp) >> #ifdef PTR_MANGLE >> REG_L t0, a0, 0*SZREG >> - PTR_DEMANGLE (ra, t0, t1) >> + PTR_DEMANGLE (ra, t0, t1, t2) >> REG_L t0, a0, 1*SZREG >> - PTR_DEMANGLE2 (sp, t0, t1) >> + PTR_DEMANGLE2 (sp, t0, t1, t2) >> #else >> REG_L ra, a0, 0*SZREG >> REG_L sp, a0, 1*SZREG >> diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S >> index 591e0d2709..58c1ee02b2 100644 >> --- a/sysdeps/loongarch/setjmp.S >> +++ b/sysdeps/loongarch/setjmp.S >> @@ -31,9 +31,9 @@ END (setjmp) >> ENTRY (__sigsetjmp) >> #ifdef PTR_MANGLE >> - PTR_MANGLE (t0, ra, t1) >> + PTR_MANGLE (t0, ra, t1, t2) >> REG_S t0, a0, 0*SZREG >> - PTR_MANGLE2 (t0, sp, t1) >> + PTR_MANGLE2 (t0, sp, t1, t2) >> REG_S t0, a0, 1*SZREG >> #else >> REG_S ra, a0, 0*SZREG >> diff --git a/sysdeps/unix/sysv/linux/loongarch/pointer_guard-asm.h >> b/sysdeps/unix/sysv/linux/loongarch/pointer_guard-asm.h >> index 24e27e4092..006b713f9c 100644 >> --- a/sysdeps/unix/sysv/linux/loongarch/pointer_guard-asm.h >> +++ b/sysdeps/unix/sysv/linux/loongarch/pointer_guard-asm.h >> @@ -24,24 +24,40 @@ >> || (!defined SHARED && (IS_IN (libc) \ >> || IS_IN (libpthread)))) >> # define PTR_MANGLE_LOAD(guard) \ >> - LOAD_LOCAL (guard, __pointer_chk_guard_local); >> + LOAD_LOCAL (guard, __pointer_chk_guard_local); >> # else >> # define PTR_MANGLE_LOAD(guard) \ >> - LOAD_GLOBAL (guard, __pointer_chk_guard); >> + LOAD_GLOBAL (guard, __pointer_chk_guard); >> # endif >> -# define PTR_MANGLE(dst, src, guard) \ >> - PTR_MANGLE_LOAD (guard); \ >> - PTR_MANGLE2 (dst, src, guard); >> -# define PTR_DEMANGLE(dst, src, guard) \ >> - PTR_MANGLE_LOAD (guard); \ >> - PTR_DEMANGLE2 (dst, src, guard); >> + >> +# define PTR_MANGLE(dst, src, guard, tmp) \ >> + PTR_MANGLE_LOAD (guard); \ >> + PTR_MANGLE2 (dst, src, guard, tmp); >> +# define PTR_DEMANGLE(dst, src, guard, tmp) \ >> + PTR_MANGLE_LOAD (guard); \ >> + PTR_DEMANGLE2 (dst, src, guard, tmp); >> + >> +# if __loongarch_grlen == 64 >> /* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ >> -# define PTR_MANGLE2(dst, src, guard) \ >> - xor dst, src, guard; \ >> - rotri.d dst, dst, 47; >> -# define PTR_DEMANGLE2(dst, src, guard) \ >> - rotri.d src, src, 17; \ >> - xor dst, src, guard; >> +# define PTR_MANGLE2(dst, src, guard, tmp) \ >> + xor tmp, src, guard; \ >> + rotri.d dst, tmp, 47; >> +# define PTR_DEMANGLE2(dst, src, guard, tmp) \ >> + rotri.d tmp, src, 17; \ >> + xor dst, tmp, guard; >> +# elif __loongarch_grlen == 32 /* __loongarch_grlen == 64 */ >> +# define PTR_MANGLE2(dst, src, guard, tmp) \ >> + xor tmp, src, guard; \ >> + slli.w dst, tmp, 9; \ >> + srli.w tmp, tmp, 23; \ >> + or dst, dst, tmp; >> +# define PTR_DEMANGLE2(dst, src, guard, tmp) \ >> + srli.w tmp, src, 9; \ >> + slli.w src, src, 23; \ >> + or tmp, tmp, src; \ >> + xor dst, tmp, guard; >> +# endif /* __loongarch_grlen == 64 */ >> + >> #endif >> #endif /* POINTER_GUARD_ASM_H */