public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Andrew Waterman <andrew@sifive.com>
To: Tatsuyuki Ishi <ishitatsuyuki@gmail.com>
Cc: libc-alpha@sourceware.org, rui314@gmail.com, ruiu@bluewhale.systems
Subject: Re: [PATCH] RISC-V: Implement TLS Descriptors.
Date: Wed, 13 Sep 2023 12:07:38 -0700	[thread overview]
Message-ID: <CA++6G0CaUR9i=j4oBCoVrHbvjtbv+jfwA-mDUoiHbGtxFya+hg@mail.gmail.com> (raw)
In-Reply-To: <20230817181228.122674-2-ishitatsuyuki@gmail.com>

The 3*SZREG stack-frame size won't maintain the ABI stack alignment; I
suggest masking it with ALMASK.


On Thu, Aug 17, 2023 at 11:13 AM Tatsuyuki Ishi via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> This is mostly based off AArch64 implementation, with some adaptations
> to different TLS DTV offsets and calling conventions.
> ---
> No regression in binutils and gcc tests for rv64gc, tested alongside the
> gcc and binutils implementation (posted at the same time).
>
> This contribution is made on behalf of Blue Whale Systems, which has
> copyright assignment on file with the FSF.
>
>  sysdeps/riscv/Makefile       |   8 ++
>  sysdeps/riscv/dl-lookupcfg.h |  27 +++++
>  sysdeps/riscv/dl-machine.h   |  27 +++++
>  sysdeps/riscv/dl-tlsdesc.S   | 204 +++++++++++++++++++++++++++++++++++
>  sysdeps/riscv/dl-tlsdesc.h   |  49 +++++++++
>  sysdeps/riscv/linkmap.h      |   1 +
>  sysdeps/riscv/tlsdesc.c      |  38 +++++++
>  sysdeps/riscv/tlsdesc.sym    |  19 ++++
>  8 files changed, 373 insertions(+)
>  create mode 100644 sysdeps/riscv/dl-lookupcfg.h
>  create mode 100644 sysdeps/riscv/dl-tlsdesc.S
>  create mode 100644 sysdeps/riscv/dl-tlsdesc.h
>  create mode 100644 sysdeps/riscv/tlsdesc.c
>  create mode 100644 sysdeps/riscv/tlsdesc.sym
>
> diff --git a/sysdeps/riscv/Makefile b/sysdeps/riscv/Makefile
> index 8fb10b164f..bb4bcd29b2 100644
> --- a/sysdeps/riscv/Makefile
> +++ b/sysdeps/riscv/Makefile
> @@ -2,6 +2,14 @@ ifeq ($(subdir),misc)
>  sysdep_headers += sys/asm.h
>  endif
>
> +ifeq ($(subdir),elf)
> +sysdep-dl-routines += tlsdesc dl-tlsdesc
> +endif
> +
> +ifeq ($(subdir),csu)
> +gen-as-const-headers += tlsdesc.sym
> +endif
> +
>  # RISC-V's assembler also needs to know about PIC as it changes the definition
>  # of some assembler macros.
>  ASFLAGS-.os += $(pic-ccflag)
> diff --git a/sysdeps/riscv/dl-lookupcfg.h b/sysdeps/riscv/dl-lookupcfg.h
> new file mode 100644
> index 0000000000..c003a27f63
> --- /dev/null
> +++ b/sysdeps/riscv/dl-lookupcfg.h
> @@ -0,0 +1,27 @@
> +/* Configuration of lookup functions.
> +   Copyright (C) 2006-2023 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 DL_UNMAP_IS_SPECIAL
> +
> +#include_next <dl-lookupcfg.h>
> +
> +struct link_map;
> +
> +extern void _dl_unmap (struct link_map *map);
> +
> +#define DL_UNMAP(map) _dl_unmap (map)
> \ No newline at end of file
> diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h
> index c0c9bd93ad..ad5b3b20d0 100644
> --- a/sysdeps/riscv/dl-machine.h
> +++ b/sysdeps/riscv/dl-machine.h
> @@ -25,6 +25,7 @@
>  #include <elf/elf.h>
>  #include <sys/asm.h>
>  #include <dl-tls.h>
> +#include <dl-tlsdesc.h>
>  #include <dl-irel.h>
>  #include <dl-static-tls.h>
>  #include <dl-machine-rel.h>
> @@ -219,6 +220,32 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
>         }
>        break;
>
> +    case R_RISCV_TLSDESC:
> +      struct tlsdesc *td = (struct tlsdesc *) addr_field;
> +      if (sym == NULL)
> +       {
> +         td->entry = _dl_tlsdesc_undefweak;
> +         td->arg = reloc->r_addend;
> +       }
> +      else
> +       {
> +# ifndef SHARED
> +         CHECK_STATIC_TLS (map, sym_map);
> +# else
> +         if (!TRY_STATIC_TLS (map, sym_map))
> +           {
> +             td->entry = _dl_tlsdesc_dynamic;
> +             td->arg = _dl_make_tlsdesc_dynamic (sym_map, sym->st_value + reloc->r_addend);
> +           }
> +         else
> +# endif
> +           {
> +             td->entry = _dl_tlsdesc_return;
> +             td->arg = (void *)(TLS_TPREL_VALUE(sym_map, sym) + reloc->r_addend);
> +           }
> +       }
> +      break;
> +
>      case R_RISCV_COPY:
>        {
>         if (__glibc_unlikely (sym == NULL))
> diff --git a/sysdeps/riscv/dl-tlsdesc.S b/sysdeps/riscv/dl-tlsdesc.S
> new file mode 100644
> index 0000000000..bc48939739
> --- /dev/null
> +++ b/sysdeps/riscv/dl-tlsdesc.S
> @@ -0,0 +1,204 @@
> +/* Thread-local storage handling in the ELF dynamic linker.
> +   RISC-V version.
> +   Copyright (C) 2023 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 <sysdep.h>
> +#include <tls.h>
> +#include <tlsdesc.h>
> +
> +#ifdef __riscv_float_abi_soft
> +# define FRAME_SIZE (-((-12 * SZREG) & ALMASK))
> +#else
> +# define FRAME_SIZE (-((-12 * SZREG - 20 * SZFREG) & ALMASK))
> +#endif
> +
> +       .text
> +
> +       /* Compute the thread pointer offset for symbols in the static
> +          TLS block. The offset is the same for all threads.
> +          Prototype:
> +          _dl_tlsdesc_return (tlsdesc *) ;
> +        */
> +ENTRY (_dl_tlsdesc_return)
> +       REG_L a0, SZREG(a0)
> +       jr t0
> +END (_dl_tlsdesc_return)
> +
> +       /* Handler for undefined weak TLS symbols.
> +          Prototype:
> +          _dl_tlsdesc_undefweak (tlsdesc *);
> +
> +          The second word of the descriptor contains the addend.
> +          Return the addend minus the thread pointer. This ensures
> +          that when the caller adds on the thread pointer it gets back
> +          the addend.  */
> +
> +ENTRY (_dl_tlsdesc_undefweak)
> +       REG_L a0, SZREG(a0)
> +       sub a0, a0, tp
> +       jr t0
> +END (_dl_tlsdesc_undefweak)
> +
> +#ifdef SHARED
> +       /* Handler for dynamic TLS symbols.
> +          Prototype:
> +          _dl_tlsdesc_dynamic (tlsdesc *) ;
> +
> +          The second word of the descriptor points to a
> +          tlsdesc_dynamic_arg structure.
> +
> +          Returns the offset between the thread pointer and the
> +          object referenced by the argument.
> +
> +          unsigned long
> +          _dl_tlsdesc_dynamic (struct tlsdesc *tdp)
> +          {
> +            struct tlsdesc_dynamic_arg *td = tdp->arg;
> +            dtv_t *dtv = *(dtv_t **)((char *)__thread_pointer + TCBHEAD_DTV);
> +            if (__builtin_expect (td->gen_count <= dtv[0].counter
> +               && (dtv[td->tlsinfo.ti_module].pointer.val
> +                   != TLS_DTV_UNALLOCATED),
> +               1))
> +              return dtv[td->tlsinfo.ti_module].pointer.val
> +               + td->tlsinfo.ti_offset
> +               - __thread_pointer;
> +
> +            return ___tls_get_addr (&td->tlsinfo) - __thread_pointer;
> +          }
> +        */
> +
> +ENTRY (_dl_tlsdesc_dynamic)
> +       /* Save just enough registers to support fast path, if we fall
> +          into slow path we will save additional registers.  */
> +       add     sp, sp, -3*SZREG
> +       REG_S   t0, 0*SZREG(sp)
> +       REG_S   t1, 1*SZREG(sp)
> +       REG_S   t2, 2*SZREG(sp)
> +
> +       /* t0 = dtv */
> +       REG_L   t0, TCBHEAD_DTV(tp)
> +       /* a0 = tdp->arg */
> +       REG_L   a0, TLSDESC_ARG(a0)
> +       /* t1 = td->gen_count */
> +       REG_L   t1, TLSDESC_GEN_COUNT(a0)
> +       /* t2 = dtv[0].counter */
> +       REG_L   t2, DTV_COUNTER(t0)
> +       bltu    t2, t1, .Lslow
> +       /* t1 = td->tlsinfo.ti_module */
> +       REG_L   t1, TLSDESC_MODID(a0)
> +       slli    t1, t1, PTRLOG + 1 /* sizeof(dtv_t) == sizeof(void*) * 2 */
> +       add     t1, t1, t0
> +       /* t1 = dtv[td->tlsinfo.ti_module].pointer.val  */
> +       REG_L   t1, 0(t1)
> +       li      t2, TLS_DTV_UNALLOCATED
> +       beq     t1, t2, .Lslow
> +       /* t2 = td->tlsinfo.ti_offset */
> +       REG_L   t2, TLSDESC_MODOFF(a0)
> +       add     a0, t1, t2
> +.Lret:
> +       sub     a0, a0, tp
> +       REG_L   t0, 0*SZREG(sp)
> +       REG_L   t1, 1*SZREG(sp)
> +       REG_L   t2, 2*SZREG(sp)
> +       add     sp, sp, 3*SZREG
> +       jr t0
> +.Lslow:
> +       /* This is the slow path. We need to call __tls_get_addr() which
> +          means we need to save and restore all the register that the
> +          callee will trash.  */
> +
> +       /* Save the remaining registers that we must treat as caller save.  */
> +       addi    sp, sp, -FRAME_SIZE
> +       REG_S   ra, 0*SZREG(sp)
> +       REG_S   a1, 1*SZREG(sp)
> +       REG_S   a2, 2*SZREG(sp)
> +       REG_S   a3, 3*SZREG(sp)
> +       REG_S   a4, 4*SZREG(sp)
> +       REG_S   a5, 5*SZREG(sp)
> +       REG_S   a6, 6*SZREG(sp)
> +       REG_S   a7, 7*SZREG(sp)
> +       REG_S   t3, 8*SZREG(sp)
> +       REG_S   t4, 9*SZREG(sp)
> +       REG_S   t5, 10*SZREG(sp)
> +       REG_S   t6, 11*SZREG(sp)
> +#ifndef __riscv_float_abi_soft
> +       FREG_S  ft0, (12*SZREG + 0*SZFREG)(sp)
> +       FREG_S  ft1, (12*SZREG + 1*SZFREG)(sp)
> +       FREG_S  ft2, (12*SZREG + 2*SZFREG)(sp)
> +       FREG_S  ft3, (12*SZREG + 3*SZFREG)(sp)
> +       FREG_S  ft4, (12*SZREG + 4*SZFREG)(sp)
> +       FREG_S  ft5, (12*SZREG + 5*SZFREG)(sp)
> +       FREG_S  ft6, (12*SZREG + 6*SZFREG)(sp)
> +       FREG_S  ft7, (12*SZREG + 7*SZFREG)(sp)
> +       FREG_S  fa0, (12*SZREG + 8*SZFREG)(sp)
> +       FREG_S  fa1, (12*SZREG + 9*SZFREG)(sp)
> +       FREG_S  fa2, (12*SZREG + 10*SZFREG)(sp)
> +       FREG_S  fa3, (12*SZREG + 11*SZFREG)(sp)
> +       FREG_S  fa4, (12*SZREG + 12*SZFREG)(sp)
> +       FREG_S  fa5, (12*SZREG + 13*SZFREG)(sp)
> +       FREG_S  fa6, (12*SZREG + 14*SZFREG)(sp)
> +       FREG_S  fa7, (12*SZREG + 15*SZFREG)(sp)
> +       FREG_S  ft8, (12*SZREG + 16*SZFREG)(sp)
> +       FREG_S  ft9, (12*SZREG + 17*SZFREG)(sp)
> +       FREG_S  ft10, (12*SZREG + 18*SZFREG)(sp)
> +       FREG_S  ft11, (12*SZREG + 19*SZFREG)(sp)
> +#endif
> +
> +       addi    a0, a0, SZREG
> +       call    __tls_get_addr
> +       addi    a0, a0, -TLS_DTV_OFFSET
> +
> +       REG_L   ra, 0*SZREG(sp)
> +       REG_L   a1, 1*SZREG(sp)
> +       REG_L   a2, 2*SZREG(sp)
> +       REG_L   a3, 3*SZREG(sp)
> +       REG_L   a4, 4*SZREG(sp)
> +       REG_L   a5, 5*SZREG(sp)
> +       REG_L   a6, 6*SZREG(sp)
> +       REG_L   a7, 7*SZREG(sp)
> +       REG_L   t3, 8*SZREG(sp)
> +       REG_L   t4, 9*SZREG(sp)
> +       REG_L   t5, 10*SZREG(sp)
> +       REG_L   t6, 11*SZREG(sp)
> +#ifndef __riscv_float_abi_soft
> +       FREG_L  ft0, (12*SZREG + 0*SZFREG)(sp)
> +       FREG_L  ft1, (12*SZREG + 1*SZFREG)(sp)
> +       FREG_L  ft2, (12*SZREG + 2*SZFREG)(sp)
> +       FREG_L  ft3, (12*SZREG + 3*SZFREG)(sp)
> +       FREG_L  ft4, (12*SZREG + 4*SZFREG)(sp)
> +       FREG_L  ft5, (12*SZREG + 5*SZFREG)(sp)
> +       FREG_L  ft6, (12*SZREG + 6*SZFREG)(sp)
> +       FREG_L  ft7, (12*SZREG + 7*SZFREG)(sp)
> +       FREG_L  fa0, (12*SZREG + 8*SZFREG)(sp)
> +       FREG_L  fa1, (12*SZREG + 9*SZFREG)(sp)
> +       FREG_L  fa2, (12*SZREG + 10*SZFREG)(sp)
> +       FREG_L  fa3, (12*SZREG + 11*SZFREG)(sp)
> +       FREG_L  fa4, (12*SZREG + 12*SZFREG)(sp)
> +       FREG_L  fa5, (12*SZREG + 13*SZFREG)(sp)
> +       FREG_L  fa6, (12*SZREG + 14*SZFREG)(sp)
> +       FREG_L  fa7, (12*SZREG + 15*SZFREG)(sp)
> +       FREG_L  ft8, (12*SZREG + 16*SZFREG)(sp)
> +       FREG_L  ft9, (12*SZREG + 17*SZFREG)(sp)
> +       FREG_L  ft10, (12*SZREG + 18*SZFREG)(sp)
> +       FREG_L  ft11, (12*SZREG + 19*SZFREG)(sp)
> +#endif
> +       addi    sp, sp, FRAME_SIZE
> +       j       .Lret
> +END (_dl_tlsdesc_dynamic)
> +#endif
> diff --git a/sysdeps/riscv/dl-tlsdesc.h b/sysdeps/riscv/dl-tlsdesc.h
> new file mode 100644
> index 0000000000..3156f34e9c
> --- /dev/null
> +++ b/sysdeps/riscv/dl-tlsdesc.h
> @@ -0,0 +1,49 @@
> +/* Thread-local storage descriptor handling in the ELF dynamic linker.
> +   RISC-V version.
> +   Copyright (C) 2011-2023 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 _DL_TLSDESC_H
> +# define _DL_TLSDESC_H 1
> +
> +#include <dl-tls.h>
> +
> +/* Type used to represent a TLS descriptor in the GOT.  */
> +struct tlsdesc
> +{
> +  ptrdiff_t (*entry) (struct tlsdesc *);
> +  void *arg;
> +};
> +
> +/* Type used as the argument in a TLS descriptor for a symbol that
> +   needs dynamic TLS offsets.  */
> +struct tlsdesc_dynamic_arg
> +{
> +  tls_index tlsinfo;
> +  size_t gen_count;
> +};
> +
> +extern unsigned long attribute_hidden
> +  _dl_tlsdesc_return(struct tlsdesc *),
> +  _dl_tlsdesc_undefweak(struct tlsdesc *);
> +
> +# ifdef SHARED
> +extern void *_dl_make_tlsdesc_dynamic (struct link_map *, size_t);
> +extern unsigned long attribute_hidden _dl_tlsdesc_dynamic(struct tlsdesc *);
> +# endif
> +
> +#endif /* _DL_TLSDESC_H */
> \ No newline at end of file
> diff --git a/sysdeps/riscv/linkmap.h b/sysdeps/riscv/linkmap.h
> index ac170bb342..2fa3f6d43f 100644
> --- a/sysdeps/riscv/linkmap.h
> +++ b/sysdeps/riscv/linkmap.h
> @@ -1,4 +1,5 @@
>  struct link_map_machine
>    {
>      ElfW(Addr) plt; /* Address of .plt.  */
> +    void *tlsdesc_table; /* Address of TLS descriptor hash table.  */
>    };
> diff --git a/sysdeps/riscv/tlsdesc.c b/sysdeps/riscv/tlsdesc.c
> new file mode 100644
> index 0000000000..a76aaa9fc5
> --- /dev/null
> +++ b/sysdeps/riscv/tlsdesc.c
> @@ -0,0 +1,38 @@
> +/* Manage TLS descriptors.  RISC-V version.
> +   Copyright (C) 2005-2023 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 <ldsodefs.h>
> +#include <tls.h>
> +#include <dl-tls.h>
> +#include <dl-tlsdesc.h>
> +#include <dl-unmap-segments.h>
> +#include <tlsdeschtab.h>
> +
> +/* Unmap the dynamic object, but also release its TLS descriptor table
> +   if there is one.  */
> +
> +void
> +_dl_unmap (struct link_map *map)
> +{
> +  _dl_unmap_segments (map);
> +
> +#ifdef SHARED
> +  if (map->l_mach.tlsdesc_table)
> +    htab_delete (map->l_mach.tlsdesc_table);
> +#endif
> +}
> diff --git a/sysdeps/riscv/tlsdesc.sym b/sysdeps/riscv/tlsdesc.sym
> new file mode 100644
> index 0000000000..652e72ea58
> --- /dev/null
> +++ b/sysdeps/riscv/tlsdesc.sym
> @@ -0,0 +1,19 @@
> +#include <stddef.h>
> +#include <sysdep.h>
> +#include <tls.h>
> +#include <link.h>
> +#include <dl-tls.h>
> +#include <dl-tlsdesc.h>
> +
> +--
> +
> +-- Abuse tls.h macros to derive offsets relative to the thread register.
> +
> +TLSDESC_ARG            offsetof(struct tlsdesc, arg)
> +TLSDESC_GEN_COUNT      offsetof(struct tlsdesc_dynamic_arg, gen_count)
> +TLSDESC_MODID          offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_module)
> +TLSDESC_MODOFF         offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_offset)
> +TCBHEAD_DTV            offsetof(tcbhead_t, dtv) - sizeof(tcbhead_t) - TLS_TCB_OFFSET
> +DTV_COUNTER            offsetof(dtv_t, counter)
> +TLS_DTV_UNALLOCATED    TLS_DTV_UNALLOCATED
> +TLS_DTV_OFFSET         TLS_DTV_OFFSET
> --
> 2.41.0
>

  parent reply	other threads:[~2023-09-13 19:07 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-17 18:12 Tatsuyuki Ishi
2023-08-17 18:35 ` Andreas Schwab
2023-09-08 10:55 ` [PATCH v2] " Tatsuyuki Ishi
2023-09-13 17:26 ` [PATCH v3] " Tatsuyuki Ishi
2023-09-13 19:14   ` Adhemerval Zanella Netto
2023-09-14  8:39     ` Tatsuyuki Ishi
2023-09-14 12:09       ` Adhemerval Zanella Netto
2024-01-27  2:22         ` Fangrui Song
2023-09-13 19:07 ` Andrew Waterman [this message]
2023-09-14  8:40 ` [PATCH v4 0/3] " Tatsuyuki Ishi
2023-09-14  8:40   ` [PATCH v4 1/3] RISC-V: Add include guard for dl-tls.h Tatsuyuki Ishi
2024-01-27  1:14     ` Fangrui Song
2023-09-14  8:40   ` [PATCH v4 2/3] RISC-V: Add TLSDESC reloc definitions Tatsuyuki Ishi
2024-01-27  1:12     ` Fangrui Song
2023-09-14  8:40   ` [PATCH v4 3/3] RISC-V: Implement TLS Descriptors Tatsuyuki Ishi
2023-11-23 11:39     ` Florian Weimer
2024-03-29  5:55 ` [PATCH v5 0/3] " Tatsuyuki Ishi
2024-03-29  5:55   ` [PATCH v5 1/3] RISC-V: Add include guard for dl-tls.h Tatsuyuki Ishi
2024-03-29  5:55   ` [PATCH v5 2/3] RISC-V: Add TLSDESC reloc definitions Tatsuyuki Ishi
2024-03-29  5:55   ` [PATCH v5 3/3] RISC-V: Implement TLS Descriptors Tatsuyuki Ishi
2024-03-29  6:18 ` [PATCH v6 0/3] " Tatsuyuki Ishi
2024-03-29  6:18   ` [PATCH v6 1/3] RISC-V: Add include guard for dl-tls.h Tatsuyuki Ishi
2024-04-03 11:48     ` Adhemerval Zanella Netto
2024-03-29  6:18   ` [PATCH v6 2/3] RISC-V: Add TLSDESC reloc definitions Tatsuyuki Ishi
2024-04-03  5:10     ` Fangrui Song
2024-04-03  8:03     ` Andreas Schwab
2024-03-29  6:18   ` [PATCH v6 3/3] RISC-V: Implement TLS Descriptors Tatsuyuki Ishi
2024-04-01 13:23     ` Florian Weimer
2024-04-01 19:29     ` Adhemerval Zanella Netto
2024-04-02  3:36       ` Tatsuyuki Ishi
2024-04-02 13:35         ` Adhemerval Zanella Netto
2024-04-02 15:25           ` Palmer Dabbelt
2024-04-02 15:32             ` Adhemerval Zanella Netto
2024-04-02 16:37               ` Palmer Dabbelt
2024-04-30 17:05   ` [PATCH v6 0/3] " Palmer Dabbelt
2024-04-30 18:33     ` Adhemerval Zanella Netto
2024-05-01  1:36       ` Tatsuyuki Ishi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CA++6G0CaUR9i=j4oBCoVrHbvjtbv+jfwA-mDUoiHbGtxFya+hg@mail.gmail.com' \
    --to=andrew@sifive.com \
    --cc=ishitatsuyuki@gmail.com \
    --cc=libc-alpha@sourceware.org \
    --cc=rui314@gmail.com \
    --cc=ruiu@bluewhale.systems \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).