From: caiyinyu <caiyinyu@loongson.cn>
To: Adhemerval Zanella Netto <adhemerval.zanella@linaro.org>,
libc-alpha@sourceware.org
Cc: xry111@xry111.site
Subject: Re: [PATCH] LoongArch: Add glibc.cpu.hwcap support.
Date: Wed, 20 Sep 2023 21:20:43 +0800 [thread overview]
Message-ID: <ed02d1f1-981a-146d-f773-cc16fc70e9cb@loongson.cn> (raw)
In-Reply-To: <4f85c85a-a99c-473c-a251-f299da76eade@linaro.org>
在 2023/9/20 下午8:49, Adhemerval Zanella Netto 写道:
>
> On 20/09/23 07:15, caiyinyu wrote:
>
>>> Maybe add a comment, similar to s390 and x86_64, on how the GLIBC_TUNABLES
>>> should behave regarding parsing here. The powerpc and s390 allows the
>>> setup of disable a hwcap tunable by appending '-', as:
>>>
>>> GLIBC_TUNABLES=glibc.cpu.hwcaps=-xxx,yyy,zzz,....
>> The only valid input of " glibc.cpu.hwcaps " are: LASX LSX UAL which i mentioned in
>>
>> comimt message "Usage Notes" parts. "-" and "+" are not allowed.
>>
>> If you set GLIBC_TUNABLES=glibc.cpu.hwcaps=UAL on the lasx platform,
>>
>> which supports all three features, the other features will be disabled.
>>
>> Usage Notes:
>> 1. Only valid inputs: LASX, LSX, UAL. Case-sensitive, comma-separated, no spaces.
>> 2. Example: `export GLIBC_TUNABLES=glibc.cpu.hwcaps=LASX,UAL` turns on LASX & UAL.
>> *Unmentioned features turn off.* With default ifunc: lasx > lsx > unaligned >
>> aligned > generic, effect is: lasx > unaligned > aligned > generic; lsx off.
>> 3. Incorrect GLIBC_TUNABLES settings will show error messages.
>> For example: On lsx platforms, you cannot enable lasx features. If you do
>> that, you will get error messages.
>> 4. Valid input examples:
>> - GLIBC_TUNABLES=glibc.cpu.hwcaps=LASX: lasx > aligned > generic.
>> - GLIBC_TUNABLES=glibc.cpu.hwcaps=LSX,UAL: lsx > unaligned > aligned > generic.
>> - GLIBC_TUNABLES=glibc.cpu.hwcaps=LASX,UAL,LASX,UAL,LSX,LASX,UAL: Repetitions
>> allowed but not recommended. Results in: lasx > lsx > unaligned > aligned >
>> generic.
>>
> I still don't see why loongarch should be different than x86, s390x,
> and powerpc for the glibc.cpu.hwcap. The current documentation
> (manual/tunables.texi) specify that tunable allows the user enable
> and disable each feature; so it means that we will need to update it
> with the loongarch exception.
>
> So I think it would be better to follow current pratice, add support
> for disable a ifunc selection hwcap, and also update the documentation
> to cite loongarch and the supported hwcaps.
Alright, I will revert this commit first.
>
>>> And it not clear how loongarch will handle. If I understand correclty,
>>> setting:
>>>
>>> GLIBC_TUNABLES=glibc.cpu.hwcaps=LSX
>>>
>>> will set the 'hwcap' to HWCAP_LOONGARCH_UAL | HWCAP_LOONGARCH_LSX | HWCAP_LOONGARCH_LASX)
>>> because CHECK_GLIBC_IFUNC_CPU_OFF 'or' everything (which does not seem
>>> correct).
>> hwcap is just an intermediate temporary variable used to validate the input and collect valid features from it.
>>
>> Note the following:
>>
>> +
>> + p += len + 1;
>> + }
>> + while (*c != '\0');
>> +
>> + GLRO (dl_larch_cpu_features).hwcap &= hwcap;
>> +}
>>
> Because the way you added the hwcap support is totally redundant, since
> it always assumes ual, lsx, and lasx. So GLIBC_TUNABLES=glibc.cpu.hwcaps=UAL
> has absolute no effect, since either the machine already support UAL
> or it will _dl_fatal_printf. Same for LSX and LASX.
>
> Also, I do not think it is a good idea to abort the execution on
> TUNABLE_CALLBACK (set_hwcaps). On s390x and powerpc, if the hwcap
> is not supported at runtime it would just not set the selection.
>
>>> So I would expect that it would follow what powerpc/s390 does, so
>>> we could eventually consolidate this code.
>>>
>>>> + const char *p = valp->strval;
>>>> + size_t len;
>>>> + unsigned long hwcap = 0;
>>>> + const char *c;
>>>> +
>>>> + do {
>>> Put the bracet on a newline.
>>>
>>>> + for (c = p; *c != ','; c++)
>>>> + if (*c == '\0')
>>>> + break;
>>>> +
>>>> + len = c - p;
>>>> +
>>>> + switch(len)
>>> Space after 'switch'.
>>>
>>>> + {
>>>> + default:
>>>> + _dl_fatal_printf (
>>>> + "The valid values of glibc.cpu.hwcaps is UAL, LASX, LSX!!\n"
>>>> + );
>>> I think the ');' should be on previou sline.
>>>
>>>> + break;
>>>> + case 3:
>>>> + {
>>>> + CHECK_GLIBC_IFUNC_CPU_OFF (p, LSX, 3);
>>>> + CHECK_GLIBC_IFUNC_CPU_OFF (p, UAL, 3);
>>>> + _dl_fatal_printf (
>>>> + "Some features are invalid or not supported on this machine!!\n"
>>>> + "The valid values of glibc.cpu.hwcaps is UAL, LASX, LSX!!\n"
>>>> + );
>>>> + }
>>>> + break;
>>>> + case 4:
>>>> + {
>>>> + CHECK_GLIBC_IFUNC_CPU_OFF (p, LASX, 4);
>>>> + _dl_fatal_printf (
>>>> + "Some features are invalid or not supported on this machine!!\n"
>>>> + "The valid values of glibc.cpu.hwcaps is UAL, LASX, LSX!!\n"
>>>> + );
>>>> + }
>>>> + break;
>>>> + }
>>>> +
>>>> + p += len + 1;
>>>> + }
>>>> + while (*c != '\0');
>>>> +
>>>> + GLRO (dl_larch_cpu_features).hwcap &= hwcap;
>>>> +}
>>>> diff --git a/sysdeps/loongarch/dl-get-cpu-features.c b/sysdeps/loongarch/dl-get-cpu-features.c
>>>> new file mode 100644
>>>> index 0000000000..7cd9bc15c3
>>>> --- /dev/null
>>>> +++ b/sysdeps/loongarch/dl-get-cpu-features.c
>>>> @@ -0,0 +1,25 @@
>>>> +/* Define _dl_larch_get_cpu_features.
>>>> + Copyright (C) 2023 Free Software Foundation, Inc.
>>>> +
>>>> + 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>
>>>> +
>>>> +const struct cpu_features *
>>>> +_dl_larch_get_cpu_features (void)
>>>> +{
>>>> + return &GLRO(dl_larch_cpu_features);
>>>> +}
>>>> diff --git a/sysdeps/loongarch/dl-machine.h b/sysdeps/loongarch/dl-machine.h
>>>> index 57913cefaa..b395a9283e 100644
>>>> --- a/sysdeps/loongarch/dl-machine.h
>>>> +++ b/sysdeps/loongarch/dl-machine.h
>>>> @@ -29,6 +29,8 @@
>>>> #include <dl-static-tls.h>
>>>> #include <dl-machine-rel.h>
>>>>
>>>> +#include <cpu-features.c>
>>>> +
>>>> #ifndef _RTLD_PROLOGUE
>>>> # define _RTLD_PROLOGUE(entry) \
>>>> ".globl\t" __STRING (entry) "\n\t" \
>>>> @@ -53,6 +55,23 @@
>>>> #define ELF_MACHINE_NO_REL 1
>>>> #define ELF_MACHINE_NO_RELA 0
>>>>
>>>> +#define DL_PLATFORM_INIT dl_platform_init ()
>>>> +
>>>> +static inline void __attribute__ ((unused))
>>>> +dl_platform_init (void)
>>>> +{
>>>> + if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
>>>> + /* Avoid an empty string which would disturb us. */
>>>> + GLRO(dl_platform) = NULL;
>>>> +
>>>> +#ifdef SHARED
>>>> + /* init_cpu_features has been called early from __libc_start_main in
>>>> + static executable. */
>>>> + init_cpu_features (&GLRO(dl_larch_cpu_features));
>>>> +#endif
>>>> +}
>>>> +
>>>> +
>>>> /* Return nonzero iff ELF header is compatible with the running host. */
>>>> static inline int
>>>> elf_machine_matches_host (const ElfW (Ehdr) *ehdr)
>>>> @@ -290,9 +309,9 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
>>>> if (profile != 0)
>>>> {
>>>> #if !defined __loongarch_soft_float
>>>> - if (SUPPORT_LASX)
>>>> + if (RTLD_SUPPORT_LASX)
>>>> gotplt[0] = (ElfW(Addr)) &_dl_runtime_profile_lasx;
>>>> - else if (SUPPORT_LSX)
>>>> + else if (RTLD_SUPPORT_LSX)
>>>> gotplt[0] = (ElfW(Addr)) &_dl_runtime_profile_lsx;
>>>> else
>>>> #endif
>>>> @@ -310,9 +329,9 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
>>>> indicated by the offset on the stack, and then jump to
>>>> the resolved address. */
>>>> #if !defined __loongarch_soft_float
>>>> - if (SUPPORT_LASX)
>>>> + if (RTLD_SUPPORT_LASX)
>>>> gotplt[0] = (ElfW(Addr)) &_dl_runtime_resolve_lasx;
>>>> - else if (SUPPORT_LSX)
>>>> + else if (RTLD_SUPPORT_LSX)
>>>> gotplt[0] = (ElfW(Addr)) &_dl_runtime_resolve_lsx;
>>>> else
>>>> #endif
>>>> diff --git a/sysdeps/loongarch/dl-tunables.list b/sysdeps/loongarch/dl-tunables.list
>>>> new file mode 100644
>>>> index 0000000000..66b3427516
>>>> --- /dev/null
>>>> +++ b/sysdeps/loongarch/dl-tunables.list
>>>> @@ -0,0 +1,25 @@
>>>> +# LoongArch specific tunables.
>>>> +# 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
>>>> +# <http://www.gnu.org/licenses/>.
>>>> +
>>>> +glibc {
>>>> + cpu {
>>>> + hwcaps {
>>>> + type: STRING
>>>> + }
>>>> + }
>>>> +}
>>>> diff --git a/sysdeps/unix/sysv/linux/loongarch/cpu-features.c b/sysdeps/unix/sysv/linux/loongarch/cpu-features.c
>>>> new file mode 100644
>>>> index 0000000000..1290c4ce9f
>>>> --- /dev/null
>>>> +++ b/sysdeps/unix/sysv/linux/loongarch/cpu-features.c
>>>> @@ -0,0 +1,29 @@
>>>> +/* Initialize CPU feature data. LoongArch64 version.
>>>> + This file is part of the GNU C Library.
>>>> + Copyright (C) 2023 Free Software Foundation, Inc.
>>>> +
>>>> + 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
>>>> + <http://www.gnu.org/licenses/>. */
>>>> +
>>>> +#include <cpu-features.h>
>>>> +#include <elf/dl-hwcaps.h>
>>>> +#include <elf/dl-tunables.h>
>>>> +extern void TUNABLE_CALLBACK (set_hwcaps) (tunable_val_t *) attribute_hidden;
>>>> +
>>>> +static inline void
>>>> +init_cpu_features (struct cpu_features *cpu_features)
>>>> +{
>>>> + GLRO (dl_larch_cpu_features).hwcap = GLRO (dl_hwcap);
>>>> + TUNABLE_GET (glibc, cpu, hwcaps, tunable_val_t *, TUNABLE_CALLBACK (set_hwcaps));
>>> The initial space number seems odd here.
>>>
>>>> +}
>>>> diff --git a/sysdeps/unix/sysv/linux/loongarch/cpu-features.h b/sysdeps/unix/sysv/linux/loongarch/cpu-features.h
>>>> index d1a280a5ee..450963cebc 100644
>>>> --- a/sysdeps/unix/sysv/linux/loongarch/cpu-features.h
>>>> +++ b/sysdeps/unix/sysv/linux/loongarch/cpu-features.h
>>>> @@ -19,13 +19,23 @@
>>>> #ifndef _CPU_FEATURES_LOONGARCH64_H
>>>> #define _CPU_FEATURES_LOONGARCH64_H
>>>>
>>>> +#include <stdint.h>
>>>> #include <sys/auxv.h>
>>>>
>>>> -#define SUPPORT_UAL (GLRO (dl_hwcap) & HWCAP_LOONGARCH_UAL)
>>>> -#define SUPPORT_LSX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LSX)
>>>> -#define SUPPORT_LASX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LASX)
>>>> +struct cpu_features
>>>> + {
>>>> + uint64_t hwcap;
>>>> + };
>>> The indentation seems off here.
>>>
>>>>
>>>> +/* Get a pointer to the CPU features structure. */
>>>> +extern const struct cpu_features *_dl_larch_get_cpu_features (void)
>>>> + __attribute__ ((pure));
>>>> +
>>>> +#define SUPPORT_UAL (GLRO (dl_larch_cpu_features).hwcap & HWCAP_LOONGARCH_UAL)
>>>> +#define SUPPORT_LSX (GLRO (dl_larch_cpu_features).hwcap & HWCAP_LOONGARCH_LSX)
>>>> +#define SUPPORT_LASX (GLRO (dl_larch_cpu_features).hwcap & HWCAP_LOONGARCH_LASX)
>>>> +#define RTLD_SUPPORT_LSX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LSX)
>>>> +#define RTLD_SUPPORT_LASX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LASX)
>>> For GLRO, it is considered a variable access to there is no need of space.
>>>
>>>> #define INIT_ARCH()
>>>>
>>>> #endif /* _CPU_FEATURES_LOONGARCH64_H */
>>>> -
>>>> diff --git a/sysdeps/unix/sysv/linux/loongarch/dl-procinfo.c b/sysdeps/unix/sysv/linux/loongarch/dl-procinfo.c
>>>> new file mode 100644
>>>> index 0000000000..6217fda983
>>>> --- /dev/null
>>>> +++ b/sysdeps/unix/sysv/linux/loongarch/dl-procinfo.c
>>>> @@ -0,0 +1,60 @@
>>>> +/* Data for LoongArch64 version of processor capability information.
>>>> + Linux 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
>>>> + <http://www.gnu.org/licenses/>. */
>>>> +
>>>> +/* If anything should be added here check whether the size of each string
>>>> + is still ok with the given array size.
>>>> +
>>>> + All the #ifdefs in the definitions are quite irritating but
>>>> + necessary if we want to avoid duplicating the information. There
>>>> + are three different modes:
>>>> +
>>>> + - PROCINFO_DECL is defined. This means we are only interested in
>>>> + declarations.
>>>> +
>>>> + - PROCINFO_DECL is not defined:
>>>> +
>>>> + + if SHARED is defined the file is included in an array
>>>> + initializer. The .element = { ... } syntax is needed.
>>>> +
>>>> + + if SHARED is not defined a normal array initialization is
>>>> + needed.
>>>> + */
>>>> +
>>>> +#ifndef PROCINFO_CLASS
>>>> +# define PROCINFO_CLASS
>>>> +#endif
>>>> +
>>>> +#if !IS_IN (ldconfig)
>>>> +# if !defined PROCINFO_DECL && defined SHARED
>>>> + ._dl_larch_cpu_features
>>>> +# else
>>>> +PROCINFO_CLASS struct cpu_features _dl_larch_cpu_features
>>>> +# endif
>>>> +# ifndef PROCINFO_DECL
>>>> += { }
>>>> +# endif
>>>> +# if !defined SHARED || defined PROCINFO_DECL
>>>> +;
>>>> +# else
>>>> +,
>>>> +# endif
>>>> +#endif
>>>> +
>>>> +#undef PROCINFO_DECL
>>>> +#undef PROCINFO_CLASS
>>>> diff --git a/sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c b/sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c
>>>> new file mode 100644
>>>> index 0000000000..455fd71abc
>>>> --- /dev/null
>>>> +++ b/sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c
>>>> @@ -0,0 +1,21 @@
>>>> +/* Operating system support for run-time dynamic linker. LoongArch 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
>>>> + <http://www.gnu.org/licenses/>. */
>>>> +
>>>> +#include <config.h>
>>>> +#include <sysdeps/loongarch/cpu-tunables.c>
>>>> +#include <sysdeps/unix/sysv/linux/dl-sysdep.c>
>>>> diff --git a/sysdeps/unix/sysv/linux/loongarch/libc-start.c b/sysdeps/unix/sysv/linux/loongarch/libc-start.c
>>>> new file mode 100644
>>>> index 0000000000..f1346ece0a
>>>> --- /dev/null
>>>> +++ b/sysdeps/unix/sysv/linux/loongarch/libc-start.c
>>>> @@ -0,0 +1,34 @@
>>>> +/* Override csu/libc-start.c on LoongArch64.
>>>> + 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
>>>> + <http://www.gnu.org/licenses/>. */
>>>> +
>>>> +#ifndef SHARED
>>>> +
>>>> +/* Mark symbols hidden in static PIE for early self relocation to work. */
>>>> +# if BUILD_PIE_DEFAULT
>>>> +# pragma GCC visibility push(hidden)
>>>> +# endif
>>>> +
>>>> +# include <ldsodefs.h>
>>>> +# include <cpu-features.c>
>>>> +
>>>> +extern struct cpu_features _dl_larch_cpu_features;
>>>> +
>>>> +# define ARCH_INIT_CPU_FEATURES() init_cpu_features (&_dl_larch_cpu_features)
>>>> +
>>>> +#endif
>>>> +#include <csu/libc-start.c>
>>> I think this patch misses a proper testcase, similar to one I suggested
>>> when powerpc added a similar support (check 21841f0d562f0e944c4d267a28cc3ebd19c847e9).
>>> Check sysdeps/unix/sysv/linux/powerpc/tst-hwcap-tunables.c on a way to
>>> proper check it.
>> I will add a proper testcase in the upcoming patch.
next prev parent reply other threads:[~2023-09-20 13:21 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-17 9:48 [PATCH] LoongArch: Add glibc.cpu.hwcap support caiyinyu
2023-09-19 9:33 ` Adhemerval Zanella Netto
2023-09-20 10:15 ` caiyinyu
2023-09-20 12:49 ` Adhemerval Zanella Netto
2023-09-20 13:20 ` caiyinyu [this message]
2023-09-19 10:11 ` Xi Ruoyao
2023-09-20 10:51 ` caiyinyu
2023-09-20 11:53 ` caiyinyu
-- strict thread matches above, loose matches on Subject: below --
2024-04-23 12:48 caiyinyu
2024-04-23 20:10 ` Adhemerval Zanella Netto
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
List information: https://www.gnu.org/software/libc/involved.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ed02d1f1-981a-146d-f773-cc16fc70e9cb@loongson.cn \
--to=caiyinyu@loongson.cn \
--cc=adhemerval.zanella@linaro.org \
--cc=libc-alpha@sourceware.org \
--cc=xry111@xry111.site \
/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).