Re: [PATCH] LoongArch: Support pointer guard on LoongArch32
mengqinggang <[email protected]>
| Newsgroups | gmane.comp.lib.glibc.alpha |
|---|---|
| Message-ID | <[email protected]> |
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 */