[RFC,05/34] hurd: Remove __hurd_threadvar_stack_{offset, mask}

Message ID 20230319151017.531737-6-bugaevc@gmail.com
State Committed, archived
Headers
Series The rest of the x86_64-gnu port |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Sergey Bugaev March 19, 2023, 3:09 p.m. UTC
  Noone is or should be using __hurd_threadvar_stack_{offset,mask}, we
have proper TLS now. These two remaining variables are never set to
anything other than zero, so any code that would try to use them as
described would just dereference a zero pointer and crash. So remove
them entirely.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
---
 hurd/Versions                       |  5 -----
 hurd/hurd/threadvar.h               | 15 ---------------
 sysdeps/mach/hurd/Versions          |  3 ---
 sysdeps/mach/hurd/_Fork.c           | 20 ++------------------
 sysdeps/mach/hurd/i386/libc.abilist |  2 --
 sysdeps/mach/hurd/x86/init-first.c  |  3 ---
 6 files changed, 2 insertions(+), 46 deletions(-)
  

Comments

Samuel Thibault April 2, 2023, 10:53 p.m. UTC | #1
Applied, thanks!

Sergey Bugaev, le dim. 19 mars 2023 18:09:48 +0300, a ecrit:
> Noone is or should be using __hurd_threadvar_stack_{offset,mask}, we
> have proper TLS now. These two remaining variables are never set to
> anything other than zero, so any code that would try to use them as
> described would just dereference a zero pointer and crash. So remove
> them entirely.
> 
> Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
> ---
>  hurd/Versions                       |  5 -----
>  hurd/hurd/threadvar.h               | 15 ---------------
>  sysdeps/mach/hurd/Versions          |  3 ---
>  sysdeps/mach/hurd/_Fork.c           | 20 ++------------------
>  sysdeps/mach/hurd/i386/libc.abilist |  2 --
>  sysdeps/mach/hurd/x86/init-first.c  |  3 ---
>  6 files changed, 2 insertions(+), 46 deletions(-)
> 
> diff --git a/hurd/Versions b/hurd/Versions
> index 7e4f1c56..3d8b412d 100644
> --- a/hurd/Versions
> +++ b/hurd/Versions
> @@ -1,8 +1,5 @@
>  libc {
>    GLIBC_2.0 {
> -    # variables used in macros & inline functions
> -    __hurd_threadvar_stack_mask; __hurd_threadvar_stack_offset;
> -
>      # functions used in libmachuser and libhurduser
>      _S_catch_exception_raise;
>      _S_catch_exception_raise_state;
> @@ -129,8 +126,6 @@ libc {
>      _hurd_fd_error_signal; _hurd_fd_error;
>      __hurd_dfail; __hurd_sockfail;
>      _hurd_port_locked_set;
> -    __hurd_threadvar_location_from_sp;
> -    __hurd_threadvar_location;
>      _hurd_userlink_link; _hurd_userlink_unlink; _hurd_userlink_clear;
>    }
>    GLIBC_2.29 {
> diff --git a/hurd/hurd/threadvar.h b/hurd/hurd/threadvar.h
> index 2a94f4de..f5c6a278 100644
> --- a/hurd/hurd/threadvar.h
> +++ b/hurd/hurd/threadvar.h
> @@ -22,21 +22,6 @@
>  #include <features.h>
>  #include <tls.h>
>  
> -/* The per-thread variables are found by ANDing this mask
> -   with the value of the stack pointer and then adding this offset.
> -
> -   In the multi-threaded case, cthreads initialization sets
> -   __hurd_threadvar_stack_mask to ~(cthread_stack_size - 1), a mask which
> -   finds the base of the fixed-size cthreads stack; and
> -   __hurd_threadvar_stack_offset to a small offset that skips the data
> -   cthreads itself maintains at the base of each thread's stack.
> -
> -   In the single-threaded or libpthread case, __hurd_threadvar_stack_mask is
> -   zero, so the stack pointer is ignored. */
> -
> -extern unsigned long int __hurd_threadvar_stack_mask;
> -extern unsigned long int __hurd_threadvar_stack_offset;
> -
>  /* The variables __hurd_sigthread_stack_base and
>     __hurd_sigthread_stack_end define the bounds of the stack used by the
>     signal thread, so that thread can always be specifically identified.  */
> diff --git a/sysdeps/mach/hurd/Versions b/sysdeps/mach/hurd/Versions
> index d75e674b..bf2e870a 100644
> --- a/sysdeps/mach/hurd/Versions
> +++ b/sysdeps/mach/hurd/Versions
> @@ -33,9 +33,6 @@ libc {
>  
>  ld {
>    GLIBC_2.0 {
> -    # variables that must be shared with libc
> -    __hurd_threadvar_stack_mask;  __hurd_threadvar_stack_offset;
> -
>      # functions that must be shared with libc
>      __close; __getpid;
>      __mmap; __open; __read; __sbrk; __strtoul_internal;
> diff --git a/sysdeps/mach/hurd/_Fork.c b/sysdeps/mach/hurd/_Fork.c
> index 4984cecd..77cd2917 100644
> --- a/sysdeps/mach/hurd/_Fork.c
> +++ b/sysdeps/mach/hurd/_Fork.c
> @@ -482,25 +482,9 @@ retry:
>  				    (natural_t *) &state, &statecount))
>  	LOSE;
>  #ifdef STACK_GROWTH_UP
> -      if (__hurd_sigthread_stack_base == 0)
> -	{
> -	  state.SP &= __hurd_threadvar_stack_mask;
> -	  state.SP += __hurd_threadvar_stack_offset;
> -	}
> -      else
> -	state.SP = __hurd_sigthread_stack_base;
> +      state.SP = __hurd_sigthread_stack_base;
>  #else
> -      if (__hurd_sigthread_stack_end == 0)
> -	{
> -	  /* The signal thread has a stack assigned by pthread.
> -	     The threadvar_stack variables conveniently tell us how
> -	     to get to the highest address in the stack, just below
> -	     the per-thread variables.  */
> -	  state.SP &= __hurd_threadvar_stack_mask;
> -	  state.SP += __hurd_threadvar_stack_offset;
> -	}
> -      else
> -	state.SP = __hurd_sigthread_stack_end;
> +      state.SP = __hurd_sigthread_stack_end;
>  #endif
>        MACHINE_THREAD_STATE_SET_PC (&state,
>  				   (unsigned long int) _hurd_msgport_receive);
> diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
> index ed0c4789..da1cad67 100644
> --- a/sysdeps/mach/hurd/i386/libc.abilist
> +++ b/sysdeps/mach/hurd/i386/libc.abilist
> @@ -279,8 +279,6 @@ GLIBC_2.2.6 __gettimeofday F
>  GLIBC_2.2.6 __gmtime_r F
>  GLIBC_2.2.6 __h_errno_location F
>  GLIBC_2.2.6 __hurd_fail F
> -GLIBC_2.2.6 __hurd_threadvar_stack_mask D 0x4
> -GLIBC_2.2.6 __hurd_threadvar_stack_offset D 0x4
>  GLIBC_2.2.6 __isalnum_l F
>  GLIBC_2.2.6 __isalpha_l F
>  GLIBC_2.2.6 __isascii_l F
> diff --git a/sysdeps/mach/hurd/x86/init-first.c b/sysdeps/mach/hurd/x86/init-first.c
> index 75a5c842..6ca27155 100644
> --- a/sysdeps/mach/hurd/x86/init-first.c
> +++ b/sysdeps/mach/hurd/x86/init-first.c
> @@ -34,9 +34,6 @@
>  extern void __mach_init (void);
>  extern void __init_misc (int, char **, char **);
>  
> -unsigned long int __hurd_threadvar_stack_offset;
> -unsigned long int __hurd_threadvar_stack_mask;
> -
>  extern int __libc_argc attribute_hidden;
>  extern char **__libc_argv attribute_hidden;
>  extern char **_dl_argv;
> -- 
> 2.39.2
>
  

Patch

diff --git a/hurd/Versions b/hurd/Versions
index 7e4f1c56..3d8b412d 100644
--- a/hurd/Versions
+++ b/hurd/Versions
@@ -1,8 +1,5 @@ 
 libc {
   GLIBC_2.0 {
-    # variables used in macros & inline functions
-    __hurd_threadvar_stack_mask; __hurd_threadvar_stack_offset;
-
     # functions used in libmachuser and libhurduser
     _S_catch_exception_raise;
     _S_catch_exception_raise_state;
@@ -129,8 +126,6 @@  libc {
     _hurd_fd_error_signal; _hurd_fd_error;
     __hurd_dfail; __hurd_sockfail;
     _hurd_port_locked_set;
-    __hurd_threadvar_location_from_sp;
-    __hurd_threadvar_location;
     _hurd_userlink_link; _hurd_userlink_unlink; _hurd_userlink_clear;
   }
   GLIBC_2.29 {
diff --git a/hurd/hurd/threadvar.h b/hurd/hurd/threadvar.h
index 2a94f4de..f5c6a278 100644
--- a/hurd/hurd/threadvar.h
+++ b/hurd/hurd/threadvar.h
@@ -22,21 +22,6 @@ 
 #include <features.h>
 #include <tls.h>
 
-/* The per-thread variables are found by ANDing this mask
-   with the value of the stack pointer and then adding this offset.
-
-   In the multi-threaded case, cthreads initialization sets
-   __hurd_threadvar_stack_mask to ~(cthread_stack_size - 1), a mask which
-   finds the base of the fixed-size cthreads stack; and
-   __hurd_threadvar_stack_offset to a small offset that skips the data
-   cthreads itself maintains at the base of each thread's stack.
-
-   In the single-threaded or libpthread case, __hurd_threadvar_stack_mask is
-   zero, so the stack pointer is ignored. */
-
-extern unsigned long int __hurd_threadvar_stack_mask;
-extern unsigned long int __hurd_threadvar_stack_offset;
-
 /* The variables __hurd_sigthread_stack_base and
    __hurd_sigthread_stack_end define the bounds of the stack used by the
    signal thread, so that thread can always be specifically identified.  */
diff --git a/sysdeps/mach/hurd/Versions b/sysdeps/mach/hurd/Versions
index d75e674b..bf2e870a 100644
--- a/sysdeps/mach/hurd/Versions
+++ b/sysdeps/mach/hurd/Versions
@@ -33,9 +33,6 @@  libc {
 
 ld {
   GLIBC_2.0 {
-    # variables that must be shared with libc
-    __hurd_threadvar_stack_mask;  __hurd_threadvar_stack_offset;
-
     # functions that must be shared with libc
     __close; __getpid;
     __mmap; __open; __read; __sbrk; __strtoul_internal;
diff --git a/sysdeps/mach/hurd/_Fork.c b/sysdeps/mach/hurd/_Fork.c
index 4984cecd..77cd2917 100644
--- a/sysdeps/mach/hurd/_Fork.c
+++ b/sysdeps/mach/hurd/_Fork.c
@@ -482,25 +482,9 @@  retry:
 				    (natural_t *) &state, &statecount))
 	LOSE;
 #ifdef STACK_GROWTH_UP
-      if (__hurd_sigthread_stack_base == 0)
-	{
-	  state.SP &= __hurd_threadvar_stack_mask;
-	  state.SP += __hurd_threadvar_stack_offset;
-	}
-      else
-	state.SP = __hurd_sigthread_stack_base;
+      state.SP = __hurd_sigthread_stack_base;
 #else
-      if (__hurd_sigthread_stack_end == 0)
-	{
-	  /* The signal thread has a stack assigned by pthread.
-	     The threadvar_stack variables conveniently tell us how
-	     to get to the highest address in the stack, just below
-	     the per-thread variables.  */
-	  state.SP &= __hurd_threadvar_stack_mask;
-	  state.SP += __hurd_threadvar_stack_offset;
-	}
-      else
-	state.SP = __hurd_sigthread_stack_end;
+      state.SP = __hurd_sigthread_stack_end;
 #endif
       MACHINE_THREAD_STATE_SET_PC (&state,
 				   (unsigned long int) _hurd_msgport_receive);
diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
index ed0c4789..da1cad67 100644
--- a/sysdeps/mach/hurd/i386/libc.abilist
+++ b/sysdeps/mach/hurd/i386/libc.abilist
@@ -279,8 +279,6 @@  GLIBC_2.2.6 __gettimeofday F
 GLIBC_2.2.6 __gmtime_r F
 GLIBC_2.2.6 __h_errno_location F
 GLIBC_2.2.6 __hurd_fail F
-GLIBC_2.2.6 __hurd_threadvar_stack_mask D 0x4
-GLIBC_2.2.6 __hurd_threadvar_stack_offset D 0x4
 GLIBC_2.2.6 __isalnum_l F
 GLIBC_2.2.6 __isalpha_l F
 GLIBC_2.2.6 __isascii_l F
diff --git a/sysdeps/mach/hurd/x86/init-first.c b/sysdeps/mach/hurd/x86/init-first.c
index 75a5c842..6ca27155 100644
--- a/sysdeps/mach/hurd/x86/init-first.c
+++ b/sysdeps/mach/hurd/x86/init-first.c
@@ -34,9 +34,6 @@ 
 extern void __mach_init (void);
 extern void __init_misc (int, char **, char **);
 
-unsigned long int __hurd_threadvar_stack_offset;
-unsigned long int __hurd_threadvar_stack_mask;
-
 extern int __libc_argc attribute_hidden;
 extern char **__libc_argv attribute_hidden;
 extern char **_dl_argv;