public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [patch/idea] Add register scrambling to testsuite
@ 2022-06-11  3:52 DJ Delorie
  2022-06-11 21:18 ` Noah Goldstein
                   ` (3 more replies)
  0 siblings, 4 replies; 22+ messages in thread
From: DJ Delorie @ 2022-06-11  3:52 UTC (permalink / raw)
  To: libc-alpha


[Note: I tried to add a special case for the bug noted below, but ran
out of time while trying to learn enough ppc64/vsx opcodery]

Allow for target-specific register "scrambling" - loading arbitrary
values into all registers that need not be call-saved.  These values
should be non-zero and invalid addresses, to help catch inadvertent
uses of otherwise uninitialized registers.

Intended to help prevent bugs such as those fixed by
0218463dd8265ed937622f88ac68c7d984fe0cfc

diff --git a/support/Makefile b/support/Makefile
index 9b50eac117..91b940c379 100644
--- a/support/Makefile
+++ b/support/Makefile
@@ -76,6 +76,7 @@ libsupport-routines = \
   support_quote_string \
   support_record_failure \
   support_run_diff \
+  support_scramble_registers \
   support_select_modifies_timeout \
   support_select_normalizes_timeout \
   support_set_small_thread_stack_size \
diff --git a/support/support.h b/support/support.h
index d20051da4d..3d049575d0 100644
--- a/support/support.h
+++ b/support/support.h
@@ -233,6 +233,11 @@ void support_stack_free (struct support_stack *stack);
    The returned value is the lowest file descriptor number.  */
 int support_open_dev_null_range (int num, int flags, mode_t mode);
 
+/* Write arbitrary values to all registers that can be written do, to
+   avoid assumptions about initial register contents in test
+   cases.  */
+void support_scramble_registers (void);
+
 __END_DECLS
 
 #endif /* SUPPORT_H */
diff --git a/support/support_scramble_registers.c b/support/support_scramble_registers.c
new file mode 100644
index 0000000000..d5e2d3fd6d
--- /dev/null
+++ b/support/support_scramble_registers.c
@@ -0,0 +1,29 @@
+/* scramble any call-not-preserved registers
+   Copyright (C) 2022 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/>.  */
+
+#include <support/support.h>
+
+#include "scramble-regs.h"
+
+void
+support_scramble_registers(void)
+{
+#ifdef SCRAMBLE_REGS
+  SCRAMBLE_REGS;
+#endif
+}
diff --git a/support/support_test_main.c b/support/support_test_main.c
index 60307fd68e..0ccb182791 100644
--- a/support/support_test_main.c
+++ b/support/support_test_main.c
@@ -269,6 +269,8 @@ adjust_exit_status (int status)
 int
 support_test_main (int argc, char **argv, const struct test_config *config)
 {
+  support_scramble_registers();
+
   if (test_main_called)
     {
       printf ("error: test_main called for a second time\n");
diff --git a/sysdeps/generic/scramble-regs.h b/sysdeps/generic/scramble-regs.h
new file mode 100644
index 0000000000..7ac55d1bfc
--- /dev/null
+++ b/sysdeps/generic/scramble-regs.h
@@ -0,0 +1,36 @@
+/* scramble any call-not-preserved registers, target portion.
+   Copyright (C) 2022 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/>.  */
+
+/* Example target-specific usage:
+
+   #define SCRAMBLE_REGS \
+     asm volatile ("movl %0, %%eax" :: "i" (1234)); \
+     asm volatile ("movl %0, %%edx" :: "i" (5678));
+
+   Targets are encouraged to create their own target-specific sub-definitions, like
+   
+   #ifndef SCRAMBLE_REGS_FPU
+   #define SCRAMBLE_REGS_FPU
+   #endif
+   #define SCRAMBLE_REGS \
+     SCRAMBLE_REGS_FPU \
+     asm volatile ("..."); \
+
+*/
+
+/* #define SCRAMBLE_REGS */
diff --git a/sysdeps/powerpc/scramble-regs.h b/sysdeps/powerpc/scramble-regs.h
new file mode 100644
index 0000000000..9400b2ed6b
--- /dev/null
+++ b/sysdeps/powerpc/scramble-regs.h
@@ -0,0 +1,20 @@
+/* scramble any call-not-preserved registers, powerpc version
+   Copyright (C) 2022 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/>.  */
+
+#define SCRAMBLE_REGS		       \
+  asm volatile ("li 0, %0" :: "i" (0x1235));
diff --git a/sysdeps/x86_64/scramble-regs.h b/sysdeps/x86_64/scramble-regs.h
new file mode 100644
index 0000000000..66ffab3c8b
--- /dev/null
+++ b/sysdeps/x86_64/scramble-regs.h
@@ -0,0 +1,31 @@
+/* scramble any call-not-preserved registers, x86_64 version
+   Copyright (C) 2022 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/>.  */
+
+/* SysV ABI: preserve EBX, ESP, EBP and R12-R15.  */
+
+#define SCRAMBLE_REGS		       \
+  asm volatile ("movl %0, %%eax" :: "i" (0x12345679));	\
+  asm volatile ("movl %0, %%ecx" :: "i" (0x12345679));	\
+  asm volatile ("movl %0, %%edx" :: "i" (0x12345679));	\
+  asm volatile ("movl %0, %%esi" :: "i" (0x12345679));	\
+  asm volatile ("movl %0, %%edi" :: "i" (0x12345679));	\
+  asm volatile ("mov %0, %%r8"  :: "i" (0x12345679));	\
+  asm volatile ("mov %0, %%r9"  :: "i" (0x12345679));	\
+  asm volatile ("mov %0, %%r10" :: "i" (0x12345679));	\
+  asm volatile ("mov %0, %%r11" :: "i" (0x12345679));	\
+


^ permalink raw reply	[flat|nested] 22+ messages in thread
* [patch/idea] Add register scrambling to testsuite
@ 2022-06-13 12:04 Wilco Dijkstra
  2022-06-13 13:33 ` Florian Weimer
  2022-06-18  3:54 ` DJ Delorie
  0 siblings, 2 replies; 22+ messages in thread
From: Wilco Dijkstra @ 2022-06-13 12:04 UTC (permalink / raw)
  To: dj; +Cc: 'GNU C Library'

Hi DJ,

> Allow for target-specific register "scrambling" - loading arbitrary
> values into all registers that need not be call-saved.  These values
> should be non-zero and invalid addresses, to help catch inadvertent
> uses of otherwise uninitialized registers.

If the purpose is to debug assembler implementations, this won't work
since the compiler will use many of these registers, so you could still use
uninitialized registers that are defined by the caller. So this is hard to do
in a generic way and should really be done inside each assembler function.

Note that testing assembler functions already requires specific settings that
enable testing, for example defining a tiny pagesize is the only way to properly
test page cross handling in string functions.

Also this is the first time I've heard about an uninitialized read - the
majority of bugs in string functions are related to page cross handling,
reading before/after the input, overflow errors of the 'n' parameter, basic
logic errors or selecting wrong ifunc. Why should we do something about
uninitialized variables when the testsuite could be improved to better test
all these corner cases?

Cheers,
Wilco

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2022-06-18  3:54 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-11  3:52 [patch/idea] Add register scrambling to testsuite DJ Delorie
2022-06-11 21:18 ` Noah Goldstein
2022-06-13  7:13   ` Florian Weimer
2022-06-13 16:48     ` DJ Delorie
2022-06-13 18:41       ` Matheus Castanho
2022-06-13 19:36         ` DJ Delorie
2022-06-13 16:44   ` DJ Delorie
2022-06-13  4:48 ` Jeff Law
2022-06-13 16:43   ` DJ Delorie
2022-06-16  7:46     ` Fangrui Song
2022-06-13  7:42 ` Siddhesh Poyarekar
2022-06-13 16:52   ` DJ Delorie
2022-06-14  5:43     ` Siddhesh Poyarekar
2022-06-14 16:11       ` DJ Delorie
2022-06-14  3:42 ` H.J. Lu
2022-06-14  4:01   ` Noah Goldstein
2022-06-14  4:07     ` DJ Delorie
2022-06-14  4:03   ` DJ Delorie
2022-06-13 12:04 Wilco Dijkstra
2022-06-13 13:33 ` Florian Weimer
2022-06-16 10:29   ` Wilco Dijkstra
2022-06-18  3:54 ` DJ Delorie

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).