ldt $f8, JB_F8*8(a0)
ldt $f9, JB_F9*8(a0)
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE(ra, t1)
- PTR_DEMANGLE2(t0, t1)
- PTR_DEMANGLE2(fp, t1)
+ PTR_DEMANGLE(ra, t1, t2)
+ PTR_DEMANGLE2(t0, t1, t2)
+ PTR_DEMANGLE2(fp, t1, t2)
#endif
cmoveq v0, 1, v0
mov t0, sp
stq s4, JB_S4*8(a0)
stq s5, JB_S5*8(a0)
#ifdef PTR_MANGLE
- PTR_MANGLE(t1, ra, t0)
+ PTR_MANGLE(t1, ra, t0, t2)
stq t1, JB_PC*8(a0)
#else
stq ra, JB_PC*8(a0)
#endif
#if defined(PTR_MANGLE) && FRAME == 0
- PTR_MANGLE2(t1, sp, t0)
+ PTR_MANGLE2(t1, sp, t0, t2)
#else
addq sp, FRAME, t1
# ifdef PTR_MANGLE
- PTR_MANGLE2(t1, t1, t0)
+ PTR_MANGLE2(t1, t1, t0, t2)
# endif
#endif
stq t1, JB_SP*8(a0)
#ifdef PTR_MANGLE
- PTR_MANGLE2(t1, fp, t0)
+ PTR_MANGLE2(t1, fp, t0, t2)
stq t1, JB_FP*8(a0)
#else
stq fp, JB_FP*8(a0)
|| (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
# define PTR_MANGLE_LOAD(guard, tmp) \
LDR_HIDDEN (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local), 0)
-# define PTR_MANGLE(dst, src, guard, tmp) \
- PTR_MANGLE_LOAD(guard, tmp); \
- PTR_MANGLE2(dst, src, guard)
-/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
-# define PTR_MANGLE2(dst, src, guard) \
- eor dst, src, guard
-# define PTR_DEMANGLE(dst, src, guard, tmp) \
- PTR_MANGLE (dst, src, guard, tmp)
-# define PTR_DEMANGLE2(dst, src, guard) \
- PTR_MANGLE2 (dst, src, guard)
# else
# define PTR_MANGLE_LOAD(guard, tmp) \
- LDR_GLOBAL (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard), 0);
-# define PTR_MANGLE(dst, src, guard, tmp) \
+ LDR_GLOBAL (guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard), 0)
+# endif
+# define PTR_MANGLE(dst, src, guard, tmp) \
PTR_MANGLE_LOAD(guard, tmp); \
PTR_MANGLE2(dst, src, guard)
/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
-# define PTR_MANGLE2(dst, src, guard) \
- eor dst, src, guard
-# define PTR_DEMANGLE(dst, src, guard, tmp) \
- PTR_MANGLE (dst, src, guard, tmp)
-# define PTR_DEMANGLE2(dst, src, guard) \
- PTR_MANGLE2 (dst, src, guard)
-# endif
+# define PTR_MANGLE2(dst, src, guard) \
+ eor dst, src, guard; \
+ ror dst, dst, #23
+# define PTR_DEMANGLE(dst, src, guard, tmp) \
+ PTR_MANGLE_LOAD(guard, tmp); \
+ PTR_DEMANGLE2(dst, src, guard)
+# define PTR_DEMANGLE2(dst, src, guard) \
+ ror dst, src, #9; \
+ eor dst, dst, guard
#endif
#endif /* POINTER_GUARD_ASM_H */
+++ /dev/null
-/* Pointer guard implementation. Arm version.
- Copyright (C) 2013-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library. If not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# if (IS_IN (rtld) \
- || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-# else
-# include <stdint.h>
-extern uintptr_t __pointer_chk_guard attribute_relro;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-# endif
-#endif
-
-#endif /* POINTER_GUARD_H */
-/* Pointer obfuscation implenentation. Generic (no-op) version.
+/* Pointer obfuscation implenentation. Generic version.
Copyright (C) 2022-2026 Free Software Foundation, Inc.
This file is part of the GNU C Library.
#include <pointer_guard-asm.h>
#ifndef __ASSEMBLER__
-# define PTR_MANGLE(x) (void) (x)
-# define PTR_DEMANGLE(x) (void) (x)
+# include <stdbit.h>
+# include <stdint.h>
+
+# if (IS_IN (rtld) \
+ || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
+extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
+# define PTR_GUARD_VALUE __pointer_chk_guard_local
+# else
+extern uintptr_t __pointer_chk_guard attribute_relro;
+# define PTR_GUARD_VALUE __pointer_chk_guard
+# endif
+
+# define PTR_MANGLE(var) \
+ do { \
+ (var) = (__typeof (var)) ((uintptr_t) (var) ^ PTR_GUARD_VALUE); \
+ (var) = (__typeof (var)) stdc_rotate_left ((uintptr_t) (var), \
+ 2 * sizeof (uintptr_t) + 1); \
+ } while (0)
+# define PTR_DEMANGLE(var) \
+ do { \
+ (var) = (__typeof (var)) stdc_rotate_right ((uintptr_t) (var), \
+ 2 * sizeof (uintptr_t) + 1); \
+ (var) = (__typeof (var)) ((uintptr_t) (var) ^ PTR_GUARD_VALUE); \
+ } while (0)
#endif
#endif /* POINTER_GUARD_H */
movl (JB_SP*4)(%eax), %ecx
cfi_undefined(%ecx)
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (%edx)
- PTR_DEMANGLE (%ecx)
+ PTR_DEMANGLE (%edx, bx)
+ PTR_DEMANGLE (%ecx, bx)
#endif
movw %ds, %si
movl (JB_SP*4)(%eax), %ecx
cfi_undefined(%ecx)
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (%edx)
- PTR_DEMANGLE (%ecx)
+ PTR_DEMANGLE (%edx, bx)
+ PTR_DEMANGLE (%ecx, bx)
#endif
movw %ds, %si
argument and target address. */
#ifdef PTR_DEMANGLE
"lmg %%r4,%%r5,64(%1)\n\t"
+ "rllg %%r4,%%r4,47\n\t"
"xgr %%r4,%2\n\t"
+ "rllg %%r5,%%r5,47\n\t"
"xgr %%r5,%2\n\t"
LIBC_PROBE_ASM (longjmp, 8@%1 -4@%0 8@%%r4)
#else
ld ENV(o0,JB_FP), %g3 /* Cache target FP in register %g3. */
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (%g3, %g3, %g4)
+ PTR_DEMANGLE (%g3, %g3, %g4, %g5)
#endif
mov %o0, %g1 /* ENV in %g1 */
orcc %o1, %g0, %g2 /* VAL in %g2 */
#ifdef PTR_DEMANGLE
ld ENV(g1,JB_PC), %g5 /* Set return PC. */
ld ENV(g1,JB_SP), %g1 /* Set saved SP on restore below. */
- PTR_DEMANGLE2 (%i7, %g5, %g4)
- PTR_DEMANGLE2 (%fp, %g1, %g4)
+ PTR_DEMANGLE2 (%i7, %g5, %g4, %g3)
+ PTR_DEMANGLE2 (%fp, %g1, %g4, %g3)
#else
ld ENV(g1,JB_PC), %i7 /* Set return PC. */
ld ENV(g1,JB_SP), %fp /* Set saved SP on restore below. */
LOC(found):
/* We have unwound register windows so %fp matches the target. */
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE2 (%sp, %o0, %g4)
+ PTR_DEMANGLE2 (%sp, %o0, %g4, %g3)
#else
mov %o0, %sp /* OK, install new SP. */
#endif
LOC(sp_ok):
ld ENV(g1,JB_PC), %o0 /* Extract target return PC. */
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE2 (%o0, %o0, %g4)
+ PTR_DEMANGLE2 (%o0, %o0, %g4, %g3)
#endif
jmp %o0 + 8 /* Return there. */
mov %g2, %o0 /* Delay slot: set return value. */
ta ST_FLUSH_WINDOWS
#ifdef PTR_MANGLE
- PTR_MANGLE (%g1, %o7, %g4)
- PTR_MANGLE2 (%g2, %sp, %g4)
- PTR_MANGLE2 (%g3, %fp, %g4)
+ PTR_MANGLE (%g1, %o7, %g4, %g5)
+ PTR_MANGLE2 (%g2, %sp, %g4, %g5)
+ PTR_MANGLE2 (%g3, %fp, %g4, %g5)
st %g1, [%o0 + (JB_PC * 4)]
st %g2, [%o0 + (JB_SP * 4)]
st %g3, [%o0 + (JB_FP * 4)]
# if (IS_IN (rtld) \
|| (!defined SHARED && (IS_IN (libc) \
|| IS_IN (libpthread))))
-# define PTR_MANGLE(dst, src, tmp) \
+# define PTR_GUARD_LOAD(tmp) \
adrp tmp, C_SYMBOL_NAME(__pointer_chk_guard_local); \
- ldr tmp, [tmp, :lo12:C_SYMBOL_NAME(__pointer_chk_guard_local)]; \
- eor dst, src, tmp
-# define PTR_DEMANGLE(dst, src, tmp) PTR_MANGLE (dst, src, tmp)
+ ldr tmp, [tmp, :lo12:C_SYMBOL_NAME(__pointer_chk_guard_local)]
# else
-# define PTR_MANGLE(dst, src, tmp) \
+# define PTR_GUARD_LOAD(tmp) \
adrp tmp, :got:C_SYMBOL_NAME(__pointer_chk_guard); \
ldr tmp, [tmp, :got_lo12:C_SYMBOL_NAME(__pointer_chk_guard)]; \
- ldr tmp, [tmp]; \
- eor dst, src, tmp;
-# define PTR_DEMANGLE(dst, src, tmp) PTR_MANGLE (dst, src, tmp)
+ ldr tmp, [tmp]
# endif
+# define PTR_MANGLE(dst, src, tmp) \
+ PTR_GUARD_LOAD (tmp); \
+ eor dst, src, tmp; \
+ ror dst, dst, #(64 - 17)
+# define PTR_DEMANGLE(dst, src, tmp) \
+ PTR_GUARD_LOAD (tmp); \
+ ror dst, src, #17; \
+ eor dst, dst, tmp
#endif
#endif /* POINTER_GUARD_ASM_H */
+++ /dev/null
-/* Pointer guard implementation. AArch64 version.
- Copyright (C) 2014-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library. If not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# if (IS_IN (rtld) \
- || (!defined SHARED && (IS_IN (libc) \
- || IS_IN (libpthread))))
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-# else
-# include <stdint.h>
-extern uintptr_t __pointer_chk_guard attribute_relro;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-# endif
-#endif
-
-#endif /* POINTER_GUARD_H */
cmoveq s1, 1, s1
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE(s2, t1)
- PTR_DEMANGLE2(s3, t1)
- PTR_DEMANGLE2(fp, t1)
+ PTR_DEMANGLE(s2, t1, t2)
+ PTR_DEMANGLE2(s3, t1, t2)
+ PTR_DEMANGLE2(fp, t1, t2)
#endif
/* ??? While this is a proper test for detecting a longjmp to an
invalid frame within any given stack, the main thread stack is
#ifdef __ASSEMBLER__
# if IS_IN (rtld)
-# define PTR_MANGLE(dst, src, tmp) \
+# define PTR_GUARD_LOAD(tmp) \
ldah tmp, __pointer_chk_guard_local($29) !gprelhigh; \
- ldq tmp, __pointer_chk_guard_local(tmp) !gprellow; \
- xor src, tmp, dst
-# define PTR_MANGLE2(dst, src, tmp) \
- xor src, tmp, dst
+ ldq tmp, __pointer_chk_guard_local(tmp) !gprellow
# elif defined SHARED
-# define PTR_MANGLE(dst, src, tmp) \
- ldq tmp, __pointer_chk_guard; \
- xor src, tmp, dst
+# define PTR_GUARD_LOAD(tmp) \
+ ldq tmp, __pointer_chk_guard
# else
-# define PTR_MANGLE(dst, src, tmp) \
- ldq tmp, __pointer_chk_guard_local; \
- xor src, tmp, dst
+# define PTR_GUARD_LOAD(tmp) \
+ ldq tmp, __pointer_chk_guard_local
# endif
-# define PTR_MANGLE2(dst, src, tmp) \
- xor src, tmp, dst
-# define PTR_DEMANGLE(dst, tmp) PTR_MANGLE(dst, dst, tmp)
-# define PTR_DEMANGLE2(dst, tmp) PTR_MANGLE2(dst, dst, tmp)
+# define PTR_MANGLE(dst, src, tmp, tmp2) \
+ PTR_GUARD_LOAD (tmp); \
+ PTR_MANGLE2 (dst, src, tmp, tmp2)
+# define PTR_MANGLE2(dst, src, tmp, tmp2) \
+ xor src, tmp, dst; \
+ sll dst, 17, tmp2; \
+ srl dst, 47, dst; \
+ bis dst, tmp2, dst
+# define PTR_DEMANGLE(dst, tmp, tmp2) \
+ PTR_GUARD_LOAD (tmp); \
+ PTR_DEMANGLE2 (dst, tmp, tmp2)
+# define PTR_DEMANGLE2(dst, tmp, tmp2) \
+ sll dst, 47, tmp2; \
+ srl dst, 17, dst; \
+ bis dst, tmp2, dst; \
+ xor dst, tmp, dst
#endif
#endif /* POINTER_GUARD_ASM_H */
+++ /dev/null
-/* Pointer guard implementation. Alpha version.
- Copyright (C) 2006-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library. If not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# include <stdint.h>
-# if (IS_IN (rtld) \
- || (!defined SHARED && (IS_IN (libc) \
- || IS_IN (libpthread))))
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-# define PTR_MANGLE(var) \
- (var) = (__typeof(var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-# endif
-# define PTR_DEMANGLE(var) PTR_MANGLE(var)
-#endif /* ASSEMBLER */
-
-#endif /* POINTER_GUARD_H */
#ifdef __ASSEMBLER__
# if (IS_IN (rtld) \
|| (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
-# define PTR_MANGLE(dst, src, guard) \
+# define PTR_MANGLE_LOAD(guard) \
grs t0, 1f; \
1: \
lrw guard, 1b@GOTPC; \
addu t0, guard; \
lrw guard, __pointer_chk_guard_local@GOT; \
ldr.w guard, (t0, guard << 0); \
- ldw guard, (guard, 0); \
- xor dst, src, guard;
-# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
-# define PTR_MANGLE2(dst, src, guard) \
- xor dst, src, guard
-# define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
+ ldw guard, (guard, 0);
# else
-# define PTR_MANGLE(dst, src, guard) \
- grs t0, 1f; \
-1: \
- lrw guard, 1b@GOTPC; \
- addu t0, guard; \
- lrw guard, __pointer_chk_guard@GOT; \
- ldr.w guard, (t0, guard << 0); \
- ldw guard, (guard, 0); \
- xor dst, src, guard;
-# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
-# define PTR_MANGLE2(dst, src, guard) \
- xor dst, src, guard
-# define PTR_DEMANGLE2(dst, src, guard) PTR_MANGLE2 (dst, src, guard)
+# define PTR_MANGLE_LOAD(guard) \
+ grs t0, 1f; \
+1: \
+ lrw guard, 1b@GOTPC; \
+ addu t0, guard; \
+ lrw guard, __pointer_chk_guard@GOT; \
+ ldr.w guard, (t0, guard << 0); \
+ ldw guard, (guard, 0);
# endif
+# define PTR_MANGLE(dst, src, guard) \
+ PTR_MANGLE_LOAD (guard); \
+ PTR_MANGLE2 (dst, src, guard)
+# define PTR_MANGLE2(dst, src, guard) \
+ xor dst, src, guard; \
+ rotli dst, dst, 9
+# define PTR_DEMANGLE(dst, src, guard) \
+ PTR_MANGLE_LOAD (guard); \
+ PTR_DEMANGLE2 (dst, src, guard)
+# define PTR_DEMANGLE2(dst, src, guard) \
+ rotli dst, src, 23; \
+ xor dst, dst, guard
#endif
#endif /* POINTER_GUARD_ASM_H */
+++ /dev/null
-/* Pointer obfuscation implenentation. C-SKY version.
- Copyright (C) 2022-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# if (IS_IN (rtld) \
- || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
-extern uintptr_t __pointer_chk_guard_local;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-# else
-# include <stdint.h>
-extern uintptr_t __pointer_chk_guard;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-# endif
-#endif
-
-#endif /* POINTER_GUARD_H */
+++ /dev/null
-/* Pointer obfuscation implenentation. i386 version.
- Copyright (C) 2005-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# include <stdbit.h>
-# include <stdint.h>
-# if IS_IN (rtld) || !defined SHARED
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-# define PTR_GUARD_VALUE __pointer_chk_guard_local
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-# define PTR_GUARD_VALUE __pointer_chk_guard
-# endif
-# define PTR_MANGLE(var) \
- do { \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ PTR_GUARD_VALUE); \
- (var) = (__typeof (var)) stdc_rotate_left ((uintptr_t) (var), \
- 2 * sizeof (uintptr_t) + 1); \
- } while (0)
-# define PTR_DEMANGLE(var) \
- do { \
- (var) = (__typeof (var)) stdc_rotate_right ((uintptr_t) (var), \
- 2 * sizeof (uintptr_t) + 1); \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ PTR_GUARD_VALUE); \
- } while (0)
-#endif
-
-#endif /* POINTER_GUARD_H */
# if (IS_IN (rtld) \
|| (!defined SHARED && (IS_IN (libc) \
|| IS_IN (libpthread))))
-# define PTR_MANGLE(dst, src, guard) \
- LOAD_LOCAL (guard, __pointer_chk_guard_local); \
- PTR_MANGLE2 (dst, src, guard);
-# define PTR_DEMANGLE(dst, src, guard) \
- LOAD_LOCAL (guard, __pointer_chk_guard_local); \
- PTR_DEMANGLE2 (dst, src, guard);
-/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
-# define PTR_MANGLE2(dst, src, guard) \
- xor dst, src, guard;
-# define PTR_DEMANGLE2(dst, src, guard) \
- PTR_MANGLE2 (dst, src, guard);
+# define PTR_MANGLE_LOAD(guard) \
+ LOAD_LOCAL (guard, __pointer_chk_guard_local);
# else
-# define PTR_MANGLE(dst, src, guard) \
- LOAD_GLOBAL (guard, __pointer_chk_guard); \
+# define PTR_MANGLE_LOAD(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) \
- LOAD_GLOBAL (guard, __pointer_chk_guard); \
+# define PTR_DEMANGLE(dst, src, guard) \
+ PTR_MANGLE_LOAD (guard); \
PTR_DEMANGLE2 (dst, src, guard);
/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
-# define PTR_MANGLE2(dst, src, guard) \
- xor dst, src, guard;
-# define PTR_DEMANGLE2(dst, src, guard) \
- PTR_MANGLE2 (dst, src, guard);
-# endif
+# define PTR_MANGLE2(dst, src, guard) \
+ xor dst, src, guard; \
+ rotri.d dst, dst, 47;
+# define PTR_DEMANGLE2(dst, src, guard) \
+ rotri.d dst, src, 17; \
+ xor dst, dst, guard;
#endif
#endif /* POINTER_GUARD_ASM_H */
+++ /dev/null
-/* Pointer obfuscation implenentation. LoongArch version.
- Copyright (C) 2022-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# include <stdint.h>
-# if (IS_IN (rtld) \
- || (!defined SHARED && (IS_IN (libc) \
- || IS_IN (libpthread))))
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-# endif
-#endif
-
-#endif /* POINTER_GUARD_H */
lwz tmpreg,PTR_GUARD_SYM@l(tmpreg)
# endif
+# if defined(__PPC64__) || defined(__powerpc64__)
+# define PTR_ROT_MANGLE(dst, src) rotldi dst,src,17
+# define PTR_ROT_DEMANGLE(dst, src) rotldi dst,src,47
+# else
+# define PTR_ROT_MANGLE(dst, src) rotlwi dst,src,9
+# define PTR_ROT_DEMANGLE(dst, src) rotlwi dst,src,23
+# endif
+
# define PTR_MANGLE(reg, tmpreg) \
PTR_GUARD_LOAD (tmpreg); \
- xor reg,tmpreg,reg
+ xor reg,tmpreg,reg; \
+ PTR_ROT_MANGLE (reg, reg)
# define PTR_MANGLE2(reg, tmpreg) \
- xor reg,tmpreg,reg
+ xor reg,tmpreg,reg; \
+ PTR_ROT_MANGLE (reg, reg)
# define PTR_MANGLE3(destreg, reg, tmpreg) \
PTR_GUARD_LOAD (tmpreg); \
- xor destreg,tmpreg,reg
-# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
-# define PTR_DEMANGLE2(reg, tmpreg) PTR_MANGLE2 (reg, tmpreg)
-# define PTR_DEMANGLE3(destreg, reg, tmpreg) PTR_MANGLE3 (destreg, reg, tmpreg)
+ xor destreg,tmpreg,reg; \
+ PTR_ROT_MANGLE (destreg, destreg)
+# define PTR_DEMANGLE(reg, tmpreg) \
+ PTR_GUARD_LOAD (tmpreg); \
+ PTR_ROT_DEMANGLE (reg, reg); \
+ xor reg,tmpreg,reg
+# define PTR_DEMANGLE2(reg, tmpreg) \
+ PTR_ROT_DEMANGLE (reg, reg); \
+ xor reg,tmpreg,reg
+# define PTR_DEMANGLE3(destreg, reg, tmpreg) \
+ PTR_GUARD_LOAD (tmpreg); \
+ PTR_ROT_DEMANGLE (destreg, reg); \
+ xor destreg,tmpreg,destreg
#endif
#endif /* POINTER_GUARD_ASM_H */
+++ /dev/null
-/* Pointer obfuscation implenentation. PowerpC version.
- Copyright (C) 2005-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# include <stdint.h>
-# if IS_IN (rtld) || !defined SHARED
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-# endif
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-#endif
-
-#endif /* POINTER_GUARD_H */
#include <unistd.h>
#include <stdio.h>
#include <stdint.h>
+#include <stdbit.h>
#include <signal.h>
#include <sys/syscall.h>
uintptr_t cur_sp; \
uintptr_t new_sp = env->__gregs[9]; \
__asm__ ("lgr %0, %%r15" : "=r" (cur_sp)); \
- new_sp ^= guard; \
+ new_sp = stdc_rotate_right (new_sp, 2 * sizeof (uintptr_t) + 1) \
+ ^ guard; \
if (new_sp < cur_sp) \
{ \
stack_t oss; \
# endif
# define PTR_MANGLE(reg, tmpreg) \
PTR_GUARD_LOAD (tmpreg); \
- xgr reg,tmpreg
+ xgr reg,tmpreg; \
+ rllg reg,reg,17
# define PTR_MANGLE2(reg, tmpreg) \
+ xgr reg,tmpreg; \
+ rllg reg,reg,17
+# define PTR_DEMANGLE(reg, tmpreg) \
+ PTR_GUARD_LOAD (tmpreg); \
+ rllg reg,reg,47; \
+ xgr reg,tmpreg
+# define PTR_DEMANGLE2(reg, tmpreg) \
+ rllg reg,reg,47; \
xgr reg,tmpreg
-# define PTR_DEMANGLE(reg, tmpreg) PTR_MANGLE (reg, tmpreg)
-# define PTR_DEMANGLE2(reg, tmpreg) PTR_MANGLE2 (reg, tmpreg)
#endif
#endif /* POINTER_GUARD_ASM_H */
+++ /dev/null
-/* Pointer obfuscation implenentation. s390x version.
- Copyright (C) 2005-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# include <stdint.h>
-# if IS_IN (rtld) || !defined SHARED
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-# define PTR_GUARD_VALUE __pointer_chk_guard_local
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-# define PTR_GUARD_VALUE __pointer_chk_guard
-# endif
-# define PTR_MANGLE(var) \
- (var) = (void *) ((uintptr_t) (var) ^ PTR_GUARD_VALUE)
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-#endif
-
-#endif /* POINTER_GUARD_H */
.Lptrg_end:
# endif
# define PTR_MANGLE(reg, tmp) \
- PTR_GUARD_LOAD (tmp); xor tmp,reg
-# define PTR_MANGLE2(reg, tmp) xor tmp,reg
-# define PTR_DEMANGLE(reg, tmp) PTR_MANGLE (reg, tmp)
-# define PTR_DEMANGLE2(reg, tmp) PTR_MANGLE2 (reg, tmp)
+ PTR_GUARD_LOAD (tmp); PTR_MANGLE2 (reg, tmp)
+# define PTR_MANGLE2(reg, tmp) \
+ xor tmp,reg; \
+ rotl reg; rotl reg; rotl reg; rotl reg; rotl reg; \
+ rotl reg; rotl reg; rotl reg; rotl reg
+# define PTR_DEMANGLE(reg, tmp) PTR_GUARD_LOAD (tmp); PTR_DEMANGLE2 (reg, tmp)
+# define PTR_DEMANGLE2(reg, tmp) \
+ rotr reg; rotr reg; rotr reg; rotr reg; rotr reg; \
+ rotr reg; rotr reg; rotr reg; rotr reg; \
+ xor tmp,reg
#endif
#endif /* POINTER_GUARD_ASM_H */
+++ /dev/null
-/* Pointer obfuscation implenentation. SH version.
- Copyright (C) 2005-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# include <stdint.h>
-# if IS_IN (rtld) || !defined SHARED
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-# define PTR_MANGLE(var) \
- (var) = (void *) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-# define PTR_MANGLE(var) \
- (var) = (void *) ((uintptr_t) (var) ^ __pointer_chk_guard)
-# endif
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-#endif
-
-#endif /* POINTER_GUARD_H */
ENTRY (____longjmp_chk)
ld ENV(o0,JB_SP), %g5
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (%g5, %g5, %g4)
+ PTR_DEMANGLE (%g5, %g5, %g4, %g3)
#endif
cmp %sp, %g5
.Lok_norestore:
ld ENV(o0,JB_FP), %g3 /* Cache target FP in register %g3. */
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE2 (%g3, %g3, %g4)
+ PTR_DEMANGLE2 (%g3, %g3, %g4, %g1)
#endif
mov %o0, %g1 /* ENV in %g1 */
ta ST_FLUSH_WINDOWS
#ifdef PTR_DEMANGLE
ld ENV(g1,JB_PC), %g1 /* Set return PC. */
- PTR_DEMANGLE2 (%i7, %g1, %g4)
+ PTR_DEMANGLE2 (%i7, %g1, %g4, %g3)
#else
ld ENV(g1,JB_PC), %i7 /* Set return PC. */
#endif
sethi %hi(PTR_GUARD_SYM), tmpreg; \
ld [tmpreg + %lo(PTR_GUARD_SYM)], tmpreg
# endif
-# define PTR_MANGLE(dreg, reg, tmpreg) \
+# define PTR_MANGLE(dreg, reg, tmpreg, tmp2) \
PTR_GUARD_LOAD (tmpreg); \
- xor reg, tmpreg, dreg
-# define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
-# define PTR_MANGLE2(dreg, reg, tmpreg) \
- xor reg, tmpreg, dreg
-# define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
+ PTR_MANGLE2 (dreg, reg, tmpreg, tmp2)
+# define PTR_MANGLE2(dreg, reg, tmpreg, tmp2) \
+ xor reg, tmpreg, dreg; \
+ sll dreg, 9, tmp2; \
+ srl dreg, 23, dreg; \
+ or dreg, tmp2, dreg
+# define PTR_DEMANGLE(dreg, reg, tmpreg, tmp2) \
+ PTR_GUARD_LOAD (tmpreg); \
+ PTR_DEMANGLE2 (dreg, reg, tmpreg, tmp2)
+# define PTR_DEMANGLE2(dreg, reg, tmpreg, tmp2) \
+ srl reg, 9, tmp2; \
+ sll reg, 23, dreg; \
+ or dreg, tmp2, dreg; \
+ xor dreg, tmpreg, dreg
#endif
#endif /* POINTER_GUARD_ASM_H */
+++ /dev/null
-/* Pointer obfuscation implenentation. 32-bit SPARC version.
- Copyright (C) 2006-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# include <stdint.h>
-# if IS_IN (rtld) || !defined SHARED
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-# endif
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-#endif
-
-#endif /* POINTER_GUARD_H */
sethi %hi(PTR_GUARD_SYM), tmpreg; \
ldx [tmpreg + %lo(PTR_GUARD_SYM)], tmpreg
# endif
-# define PTR_MANGLE(dreg, reg, tmpreg) \
+# define PTR_MANGLE(dreg, reg, tmpreg, tmp2) \
PTR_GUARD_LOAD (tmpreg); \
- xor reg, tmpreg, dreg
-# define PTR_DEMANGLE(dreg, reg, tmpreg) PTR_MANGLE (dreg, reg, tmpreg)
-# define PTR_MANGLE2(dreg, reg, tmpreg) \
- xor reg, tmpreg, dreg
-# define PTR_DEMANGLE2(dreg, reg, tmpreg) PTR_MANGLE2 (dreg, reg, tmpreg)
+ PTR_MANGLE2 (dreg, reg, tmpreg, tmp2)
+# define PTR_MANGLE2(dreg, reg, tmpreg, tmp2) \
+ xor reg, tmpreg, dreg; \
+ sllx dreg, 17, tmp2; \
+ srlx dreg, 47, dreg; \
+ or dreg, tmp2, dreg
+# define PTR_DEMANGLE(dreg, reg, tmpreg, tmp2) \
+ PTR_GUARD_LOAD (tmpreg); \
+ PTR_DEMANGLE2 (dreg, reg, tmpreg, tmp2)
+# define PTR_DEMANGLE2(dreg, reg, tmpreg, tmp2) \
+ srlx reg, 17, tmp2; \
+ sllx reg, 47, dreg; \
+ or dreg, tmp2, dreg; \
+ xor dreg, tmpreg, dreg
#endif
#endif /* POINTER_GUARD_ASM_H */
+++ /dev/null
-/* Pointer obfuscation implenentation. 64-bit SPARC version.
- Copyright (C) 2006-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# include <stdint.h>
-# if IS_IN (rtld) || !defined SHARED
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-# define PTR_MANGLE(var) \
- (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
-# endif
-# define PTR_DEMANGLE(var) PTR_MANGLE (var)
-#endif
-
-#endif /* POINTER_GUARD_H */
+++ /dev/null
-/* Pointer obfuscation implenentation. x86-64 version.
- Copyright (C) 2005-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef POINTER_GUARD_H
-#define POINTER_GUARD_H
-
-#include <pointer_guard-asm.h>
-
-#ifndef __ASSEMBLER__
-# include <stdbit.h>
-# include <stdint.h>
-
-# if (IS_IN (rtld) \
- || (!defined SHARED && (IS_IN (libc) || IS_IN (libpthread))))
-extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
-# define PTR_MANGLE(var) \
- do { \
- (var) = (__typeof (var)) ((uintptr_t) (var) \
- ^ __pointer_chk_guard_local); \
- (var) = (__typeof (var)) stdc_rotate_left ((uintptr_t) (var), \
- 2 * sizeof (uintptr_t) + 1); \
- } while (0)
-# define PTR_DEMANGLE(var) \
- do { \
- (var) = (__typeof (var)) stdc_rotate_right ((uintptr_t) (var), \
- 2 * sizeof (uintptr_t) + 1); \
- (var) = (__typeof (var)) ((uintptr_t) (var) \
- ^ __pointer_chk_guard_local); \
- } while (0)
-# else
-extern uintptr_t __pointer_chk_guard attribute_relro;
-# define PTR_MANGLE(var) \
- do { \
- (var) = (__typeof (var)) ((uintptr_t) (var) \
- ^ __pointer_chk_guard); \
- (var) = (__typeof (var)) stdc_rotate_left ((uintptr_t) (var), \
- 2 * sizeof (uintptr_t) + 1); \
- } while (0)
-# define PTR_DEMANGLE(var) \
- do { \
- (var) = (__typeof (var)) stdc_rotate_right ((uintptr_t) (var), \
- 2 * sizeof (uintptr_t) + 1); \
- (var) = (__typeof (var)) ((uintptr_t) (var) \
- ^ __pointer_chk_guard); \
- } while (0)
-# endif
-#endif
-
-#endif /* POINTER_GUARD_H */