From: Rich Felker <dalias@libc.org>
To: 王洪亮 <wanghongliang@loongson.cn>
Cc: musl@lists.openwall.com, liuxue@loongson.cn, lvjianmin@loongson.cn
Subject: Re: [musl] add loongarch64 port
Date: Tue, 22 Mar 2022 08:59:36 -0400 [thread overview]
Message-ID: <20220322125933.GB7074@brightrain.aerifal.cx> (raw)
In-Reply-To: <b8869794-0624-6a5f-df15-1840609306a1@loongson.cn>
On Tue, Mar 22, 2022 at 11:52:35AM +0800, 王洪亮 wrote:
> Hi,
>
> Thank you for give us some useful suggestions on the first submit
>
> from 翟小娟 <zhaixiaojuan@loongson.cn>.
>
> we review code and make changes on code specification, code style
>
> and code errors.
>
>
> The new patch has been published in
>
> https://github.com/loongson/musl/tree/loongarch-v1.0.
>
>
> The linux kernel has been published in
>
> https://github.com/loongson/linux/tree/loongarch-next.
>
>
> we alse published gcc, glibc in https://github.com/loongson
>
> and submitting to the community.
>
>
> we can supply a physical machine remote login for test musl.
>
> It has been compiled and run the libc-test successfully.
>
>
> Please code review, thanks!
>
>
> Hongliang Wang
>
> >From f5df725607675b370daec09a14ad130c792fa0d2 Mon Sep 17 00:00:00 2001
> From: wanghongliang <wanghongliang@loongson.cn>
> Date: Mon, 21 Mar 2022 06:13:20 +0800
> Subject: [PATCH] add loongarch64 port.
>
> Author: xiaojuanZhai <zhaixiaojuan@loongson.cn>
> Author: meidanLi <limeidan@loongson.cn>
> Author: guoqiChen <chenguoqi@loongson.cn>
> Author: xiaolinZhao <zhaoxiaolin@loongson.cn>
> Author: Fanpeng <fanpeng@loongson.cn>
> Author: jiantaoShan <shanjiantao@loongson.cn>
> Author: xuhuiQiang <qiangxuhui@loongson.cn>
> Author: jingyunHua <huajingyun@loongson.cn>
> Author: liuxue <liuxue@loongson.cn>
> Author: wanghongliang <wanghongliang@loongson.cn>
>
> Signed-off-by: wanghongliang <wanghongliang@loongson.cn>
> ---
> arch/loongarch64/atomic_arch.h | 53 ++++
> arch/loongarch64/bits/alltypes.h.in | 20 ++
> arch/loongarch64/bits/fcntl.h | 40 +++
> arch/loongarch64/bits/fenv.h | 20 ++
> arch/loongarch64/bits/float.h | 16 ++
> arch/loongarch64/bits/hwcap.h | 14 +
> arch/loongarch64/bits/posix.h | 2 +
> arch/loongarch64/bits/ptrace.h | 4 +
> arch/loongarch64/bits/reg.h | 66 +++++
> arch/loongarch64/bits/setjmp.h | 1 +
> arch/loongarch64/bits/signal.h | 79 ++++++
> arch/loongarch64/bits/stat.h | 20 ++
> arch/loongarch64/bits/stdint.h | 20 ++
> arch/loongarch64/bits/syscall.h.in | 307 +++++++++++++++++++++
> arch/loongarch64/bits/user.h | 5 +
> arch/loongarch64/crt_arch.h | 14 +
> arch/loongarch64/kstat.h | 21 ++
> arch/loongarch64/pthread_arch.h | 13 +
> arch/loongarch64/reloc.h | 35 +++
> arch/loongarch64/syscall_arch.h | 137 +++++++++
> configure | 1 +
> crt/loongarch64/crti.s | 15 +
> crt/loongarch64/crtn.s | 12 +
> include/elf.h | 66 +++++
> src/fenv/loongarch64/fenv.S | 72 +++++
> src/ldso/loongarch64/dlsym.s | 12 +
> src/setjmp/loongarch64/longjmp.S | 37 +++
> src/setjmp/loongarch64/setjmp.S | 34 +++
> src/signal/loongarch64/restore.s | 10 +
> src/signal/loongarch64/sigsetjmp.s | 29 ++
> src/thread/loongarch64/__set_thread_area.s | 7 +
> src/thread/loongarch64/__unmapself.s | 7 +
> src/thread/loongarch64/clone.s | 28 ++
> src/thread/loongarch64/syscall_cp.s | 29 ++
> 34 files changed, 1246 insertions(+)
> create mode 100644 arch/loongarch64/atomic_arch.h
> create mode 100644 arch/loongarch64/bits/alltypes.h.in
> create mode 100644 arch/loongarch64/bits/fcntl.h
> create mode 100644 arch/loongarch64/bits/fenv.h
> create mode 100644 arch/loongarch64/bits/float.h
> create mode 100644 arch/loongarch64/bits/hwcap.h
> create mode 100644 arch/loongarch64/bits/posix.h
> create mode 100644 arch/loongarch64/bits/ptrace.h
> create mode 100644 arch/loongarch64/bits/reg.h
> create mode 100644 arch/loongarch64/bits/setjmp.h
> create mode 100644 arch/loongarch64/bits/signal.h
> create mode 100644 arch/loongarch64/bits/stat.h
> create mode 100644 arch/loongarch64/bits/stdint.h
> create mode 100644 arch/loongarch64/bits/syscall.h.in
> create mode 100644 arch/loongarch64/bits/user.h
> create mode 100644 arch/loongarch64/crt_arch.h
> create mode 100644 arch/loongarch64/kstat.h
> create mode 100644 arch/loongarch64/pthread_arch.h
> create mode 100644 arch/loongarch64/reloc.h
> create mode 100644 arch/loongarch64/syscall_arch.h
> create mode 100644 crt/loongarch64/crti.s
> create mode 100644 crt/loongarch64/crtn.s
> create mode 100644 src/fenv/loongarch64/fenv.S
> create mode 100644 src/ldso/loongarch64/dlsym.s
> create mode 100644 src/setjmp/loongarch64/longjmp.S
> create mode 100644 src/setjmp/loongarch64/setjmp.S
> create mode 100644 src/signal/loongarch64/restore.s
> create mode 100644 src/signal/loongarch64/sigsetjmp.s
> create mode 100644 src/thread/loongarch64/__set_thread_area.s
> create mode 100644 src/thread/loongarch64/__unmapself.s
> create mode 100644 src/thread/loongarch64/clone.s
> create mode 100644 src/thread/loongarch64/syscall_cp.s
>
> diff --git a/arch/loongarch64/atomic_arch.h b/arch/loongarch64/atomic_arch.h
> new file mode 100644
> index 00000000..bf4805c9
> --- /dev/null
> +++ b/arch/loongarch64/atomic_arch.h
> @@ -0,0 +1,53 @@
> +#define a_ll a_ll
> +static inline int a_ll(volatile int *p)
> +{
> + int v;
> + __asm__ __volatile__ (
> + "ll.w %0, %1"
> + : "=r"(v)
> + : "ZC"(*p));
> + return v;
> +}
> +
> +#define a_sc a_sc
> +static inline int a_sc(volatile int *p, int v)
> +{
> + int r;
> + __asm__ __volatile__ (
> + "sc.w %0, %1"
> + : "=r"(r), "=ZC"(*p)
> + : "0"(v) : "memory");
> + return r;
> +}
> +
> +#define a_ll_p a_ll_p
> +static inline void *a_ll_p(volatile void *p)
> +{
> + void *v;
> + __asm__ __volatile__ (
> + "ll.d %0, %1"
> + : "=r"(v)
> + : "ZC"(*(void *volatile *)p));
> + return v;
> +}
> +
> +#define a_sc_p a_sc_p
> +static inline int a_sc_p(volatile void *p, void *v)
> +{
> + long r;
> + __asm__ __volatile__ (
> + "sc.d %0, %1"
> + : "=r"(r), "=ZC"(*(void *volatile *)p)
> + : "0"(v)
> + : "memory");
> + return r;
> +}
> +
> +#define a_barrier a_barrier
> +static inline void a_barrier()
> +{
> + __asm__ __volatile__ ("dbar 0" : : : "memory");
> +}
> +
> +#define a_pre_llsc a_barrier
> +#define a_post_llsc a_barrier
I don't see anything wrong here standing out, but haven't reviewed the
ISA's requirements on the use of ll/sc to be sure. If anyone else has
knowledge to review this part that would be great.
> diff --git a/arch/loongarch64/bits/alltypes.h.in b/arch/loongarch64/bits/alltypes.h.in
> new file mode 100644
> index 00000000..38871b5f
> --- /dev/null
> +++ b/arch/loongarch64/bits/alltypes.h.in
> @@ -0,0 +1,20 @@
> +#define _Addr long
> +#define _Int64 long
> +#define _Reg long
> +
> +#define __BYTE_ORDER 1234
> +#define __LONG_MAX 0x7fffffffffffffffL
> +
> +TYPEDEF __builtin_va_list va_list;
> +TYPEDEF __builtin_va_list __isoc_va_list;
> +
> +#ifndef __cplusplus
> +TYPEDEF int wchar_t;
> +#endif
> +
> +TYPEDEF float float_t;
> +TYPEDEF double double_t;
> +
> +TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
> +
> +TYPEDEF unsigned nlink_t;
va_list and __isoc_va_list are no longer defined by the arch's
alltypes.h.in, so they can be removed. I think the rest of that is ok.
> diff --git a/arch/loongarch64/bits/fcntl.h b/arch/loongarch64/bits/fcntl.h
> new file mode 100644
> index 00000000..9bcbb7ff
> --- /dev/null
> +++ b/arch/loongarch64/bits/fcntl.h
> @@ -0,0 +1,40 @@
> +#define O_CREAT 0100
> +#define O_EXCL 0200
> +#define O_NOCTTY 0400
> +#define O_TRUNC 01000
> +#define O_APPEND 02000
> +#define O_NONBLOCK 04000
> +#define O_DSYNC 010000
> +#define O_SYNC 04010000
> +#define O_RSYNC 04010000
> +#define O_DIRECTORY 0200000
> +#define O_NOFOLLOW 0400000
> +#define O_CLOEXEC 02000000
> +
> +#define O_ASYNC 020000
> +#define O_DIRECT 040000
> +#define O_LARGEFILE 0100000
> +#define O_NOATIME 01000000
> +#define O_PATH 010000000
> +#define O_TMPFILE 020000000
> +#define O_NDELAY O_NONBLOCK
> +
> +#define F_DUPFD 0
> +#define F_GETFD 1
> +#define F_SETFD 2
> +#define F_GETFL 3
> +#define F_SETFL 4
> +
> +#define F_SETOWN 8
> +#define F_GETOWN 9
> +#define F_SETSIG 10
> +#define F_GETSIG 11
> +
> +#define F_GETLK 5
> +#define F_SETLK 6
> +#define F_SETLKW 7
> +
> +#define F_SETOWN_EX 15
> +#define F_GETOWN_EX 16
> +
> +#define F_GETOWNER_UIDS 17
AFAICT this file is identical to the generic one (with 32/64 bit #if
evaluated already) so it can and should be dropped.
> +++ b/arch/loongarch64/bits/signal.h
> @@ -0,0 +1,79 @@
> +#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
> + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
> +
> +#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
> +#define MINSIGSTKSZ 4096
> +#define SIGSTKSZ 16384
> +#endif
> +
> +typedef unsigned long greg_t, gregset_t[32];
> +
> +typedef struct sigcontext {
> + unsigned long pc;
> + gregset_t gregs;
> + unsigned int flags;
> + unsigned long extcontext[0] __attribute__((__aligned__(16)));
> +}mcontext_t;
[0] is not valid, and having a flexible array member here is possibly
not even useful since I don't think it would be valid to access it via
uc->uc_mcontext.extcontext[] since the instance of mcontext_t inside
the ucontext struct does not have FAM space belonging to it, even if
additional space was allocated past the end of the ucontext_t. In
other words, I think compilers would be justified in treating attempts
to access it this way as UB and optimizing them out.
> diff --git a/arch/loongarch64/bits/stat.h b/arch/loongarch64/bits/stat.h
> new file mode 100644
> index 00000000..b620e142
> --- /dev/null
> +++ b/arch/loongarch64/bits/stat.h
> @@ -0,0 +1,20 @@
> +struct stat {
> + dev_t st_dev;
> + int __pad1[3];
> + ino_t st_ino;
> + mode_t st_mode;
> + nlink_t st_nlink;
> + uid_t st_uid;
> + gid_t st_gid;
> + dev_t st_rdev;
> + unsigned int __pad2[2];
> + off_t st_size;
> + int __pad3;
> + struct timespec st_atim;
> + struct timespec st_mtim;
> + struct timespec st_ctim;
> + blksize_t st_blksize;
> + unsigned int __pad4;
> + blkcnt_t st_blocks;
> + int __pad5[14];
> +};
__pad1[3] looks wrong -- st_ino will be aligned on a 64-bit boundary
so there can't be an odd number of 32-bit ints before it. Naturally,
it will be aligned with additional padding, but the intent here was
probably to make all the padding explicit. Moreover, this isn't
reflecting a kernel structure, just a userspace type that musl gets to
define, so I'm not sure why it's being defined for a new arch with
lots of gratuitous padding rather than just using a generic
definition. I guess it was just copied from the mips64 one (which also
has these problems).
If you're already using this in production and don't want to break
ABI, I don't see any real need to change it though. It doesn't really
matter. Making it __pad1[4] would still be a good idea (and we should
fix that on mips64) -- that doesn't break ABI.
> diff --git a/arch/loongarch64/pthread_arch.h b/arch/loongarch64/pthread_arch.h
> new file mode 100644
> index 00000000..27f50e4c
> --- /dev/null
> +++ b/arch/loongarch64/pthread_arch.h
> @@ -0,0 +1,13 @@
> +static inline uintptr_t __get_tp()
> +{
> + uintptr_t tp;
> + __asm__ ("or %0, $tp, $zero" : "=r" (tp) );
> + return tp;
> +}
> +
> +#define TLS_ABOVE_TP
> +#define GAP_ABOVE_TP 0
> +
> +#define DTP_OFFSET 0
> +
> +#define MC_PC pc
This can be done as something like:
static inline uintptr_t __get_tp()
{
register uintptr_t tp __asm__("tp");
__asm__ ("" : "=r" (tp) );
return tp;
}
if the compiler doesn't botch it. Historically clang had trouble with
that, so if that's the case, just stick with what you had -- it's not
too costly doing a gratuitous move.
Rich
next prev parent reply other threads:[~2022-03-22 12:59 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-22 3:52 王洪亮
2022-03-22 12:59 ` Rich Felker [this message]
2022-03-22 15:06 ` Jeffrey Walton
2022-03-22 16:04 ` Rich Felker
2022-03-24 3:01 ` 王洪亮
2022-03-24 2:22 ` 王洪亮
2022-03-22 19:03 ` Rich Felker
2022-03-22 20:36 ` Arnd Bergmann
2022-03-24 1:53 ` 王洪亮
2022-03-24 1:35 ` 王洪亮
2022-03-29 8:12 ` [musl] " 王洪亮
2022-03-29 8:26 ` Arnd Bergmann
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=20220322125933.GB7074@brightrain.aerifal.cx \
--to=dalias@libc.org \
--cc=liuxue@loongson.cn \
--cc=lvjianmin@loongson.cn \
--cc=musl@lists.openwall.com \
--cc=wanghongliang@loongson.cn \
/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.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/musl/
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 NNTP newsgroup(s).