authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-07 01:24:00+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-10-07 01:24:00+02:00
log790fc8cd98020c26b65a4af69e25c4e853d463be
tree61f4183d8f8c2b3886be1178066c38088f6b9530
parentd5c9d8529534745c9feae6b67cdc01d53f11a0d9
parent4cc1b060ebd76a9fc5ffda8cc83ad48dc11855d7
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #21499 from alexrp/loongarch-gnusf

Add `loongarch64-linux-gnusf` target support

28 files changed, 1267 insertions(+), 37 deletions(-)

lib/libc/glibc/abilists
Binary files a/lib/libc/glibc/abilists and b/lib/libc/glibc/abilists differ
lib/libc/include/loongarch64-linux-gnusf/bits/endianness.h created+11
...@@ -0,0 +1,11 @@
1#ifndef _BITS_ENDIANNESS_H
2#define _BITS_ENDIANNESS_H 1
3
4#ifndef _BITS_ENDIAN_H
5#error "Never use <bits/endianness.h> directly; include <endian.h> instead."
6#endif
7
8/* LoongArch is little-endian. */
9#define __BYTE_ORDER __LITTLE_ENDIAN
10
11#endif /* bits/endianness.h */
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/fcntl.h created+61
...@@ -0,0 +1,61 @@
1/* O_*, F_*, FD_* bit values for the generic Linux/LoongArch ABI.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library. If not, see
17 <https://www.gnu.org/licenses/>. */
18
19#ifndef _FCNTL_H
20#error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
21#endif
22
23#include <bits/wordsize.h>
24
25/* In 64-bit ISA files are always with 64bit off_t and F_*LK64 are the same as
26 non-64-bit versions. It will need to be revised for 128-bit. */
27#if __WORDSIZE == 64
28#define __O_LARGEFILE 0
29
30#define F_GETLK64 5 /* Get record locking info. */
31#define F_SETLK64 6 /* Set record locking info (non-blocking). */
32#define F_SETLKW64 7 /* Set record locking info (blocking). */
33#endif
34
35struct flock
36{
37 short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
38 short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
39#ifndef __USE_FILE_OFFSET64
40 __off_t l_start; /* Offset where the lock begins. */
41 __off_t l_len; /* Size of the locked area; zero means until EOF. */
42#else
43 __off64_t l_start; /* Offset where the lock begins. */
44 __off64_t l_len; /* Size of the locked area; zero means until EOF. */
45#endif
46 __pid_t l_pid; /* Process holding the lock. */
47};
48
49#ifdef __USE_LARGEFILE64
50struct flock64
51{
52 short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
53 short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
54 __off64_t l_start; /* Offset where the lock begins. */
55 __off64_t l_len; /* Size of the locked area; zero means until EOF. */
56 __pid_t l_pid; /* Process holding the lock. */
57};
58#endif
59
60/* Include generic Linux declarations. */
61#include <bits/fcntl-linux.h>
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/fenv.h created+90
...@@ -0,0 +1,90 @@
1/* Floating point environment.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library. If not, see
17 <https://www.gnu.org/licenses/>. */
18
19#ifndef _FENV_H
20#error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
21#endif
22
23/* Define bits representing the exception. We use the bit positions
24 of the appropriate bits in the FPU control word. */
25enum
26{
27 FE_INEXACT =
28#define FE_INEXACT 0x010000
29 FE_INEXACT,
30 FE_UNDERFLOW =
31#define FE_UNDERFLOW 0x020000
32 FE_UNDERFLOW,
33 FE_OVERFLOW =
34#define FE_OVERFLOW 0x040000
35 FE_OVERFLOW,
36 FE_DIVBYZERO =
37#define FE_DIVBYZERO 0x080000
38 FE_DIVBYZERO,
39 FE_INVALID =
40#define FE_INVALID 0x100000
41 FE_INVALID,
42};
43
44#define FE_ALL_EXCEPT \
45 (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
46
47/* The LoongArch FPU supports all of the four defined rounding modes. We
48 use again the bit positions in the FPU control word as the values
49 for the appropriate macros. */
50enum
51{
52 FE_TONEAREST =
53#define FE_TONEAREST 0x000
54 FE_TONEAREST,
55 FE_TOWARDZERO =
56#define FE_TOWARDZERO 0x100
57 FE_TOWARDZERO,
58 FE_UPWARD =
59#define FE_UPWARD 0x200
60 FE_UPWARD,
61 FE_DOWNWARD =
62#define FE_DOWNWARD 0x300
63 FE_DOWNWARD
64};
65
66/* Type representing exception flags. */
67typedef unsigned int fexcept_t;
68
69/* Type representing floating-point environment. This function corresponds
70 to the layout of the block written by the `fstenv'. */
71typedef struct
72{
73 unsigned int __fp_control_register;
74} fenv_t;
75
76/* If the default argument is used we use this value. */
77#define FE_DFL_ENV ((const fenv_t *) -1)
78
79#ifdef __USE_GNU
80/* Floating-point environment where none of the exception is masked. */
81#define FE_NOMASK_ENV ((const fenv_t *) -257)
82#endif
83
84#if __GLIBC_USE (IEC_60559_BFP_EXT_C23)
85/* Type representing floating-point control modes. */
86typedef unsigned int femode_t;
87
88/* Default floating-point control modes. */
89#define FE_DFL_MODE ((const femode_t *) -1L)
90#endif
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/hwcap.h created+38
...@@ -0,0 +1,38 @@
1/* Defines for bits in AT_HWCAP. LoongArch64 Linux version.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
18
19#if !defined (_SYS_AUXV_H)
20# error "Never include <bits/hwcap.h> directly; use <sys/auxv.h> instead."
21#endif
22
23/* The following must match the kernel's <asm/hwcap.h>. */
24/* HWCAP flags */
25#define HWCAP_LOONGARCH_CPUCFG (1 << 0)
26#define HWCAP_LOONGARCH_LAM (1 << 1)
27#define HWCAP_LOONGARCH_UAL (1 << 2)
28#define HWCAP_LOONGARCH_FPU (1 << 3)
29#define HWCAP_LOONGARCH_LSX (1 << 4)
30#define HWCAP_LOONGARCH_LASX (1 << 5)
31#define HWCAP_LOONGARCH_CRC32 (1 << 6)
32#define HWCAP_LOONGARCH_COMPLEX (1 << 7)
33#define HWCAP_LOONGARCH_CRYPTO (1 << 8)
34#define HWCAP_LOONGARCH_LVZ (1 << 9)
35#define HWCAP_LOONGARCH_LBT_X86 (1 << 10)
36#define HWCAP_LOONGARCH_LBT_ARM (1 << 11)
37#define HWCAP_LOONGARCH_LBT_MIPS (1 << 12)
38#define HWCAP_LOONGARCH_PTW (1 << 13)
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/link.h created+76
...@@ -0,0 +1,76 @@
1/* Machine-specific declarations for dynamic linker interface.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library. If not, see
17 <https://www.gnu.org/licenses/>. */
18
19#ifndef _LINK_H
20#error "Never include <bits/link.h> directly; use <link.h> instead."
21#endif
22
23#ifndef __loongarch_soft_float
24typedef float La_loongarch_vr
25 __attribute__ ((__vector_size__ (16), __aligned__ (16)));
26typedef float La_loongarch_xr
27 __attribute__ ((__vector_size__ (32), __aligned__ (16)));
28
29typedef union
30{
31 double fpreg[4];
32 La_loongarch_vr vr[2];
33 La_loongarch_xr xr[1];
34} La_loongarch_vector __attribute__ ((__aligned__ (16)));
35#endif
36
37typedef struct La_loongarch_regs
38{
39 unsigned long int lr_reg[8]; /* a0 - a7 */
40#ifndef __loongarch_soft_float
41 La_loongarch_vector lr_vec[8]; /* fa0 - fa7 or vr0 - vr7 or xr0 - xr7*/
42#endif
43 unsigned long int lr_ra;
44 unsigned long int lr_sp;
45} La_loongarch_regs;
46
47/* Return values for calls from PLT on LoongArch. */
48typedef struct La_loongarch_retval
49{
50 unsigned long int lrv_a0;
51 unsigned long int lrv_a1;
52#ifndef __loongarch_soft_float
53 La_loongarch_vector lrv_vec0;
54 La_loongarch_vector lrv_vec1;
55#endif
56} La_loongarch_retval;
57
58__BEGIN_DECLS
59
60extern ElfW (Addr) la_loongarch_gnu_pltenter (ElfW (Sym) *__sym,
61 unsigned int __ndx,
62 uintptr_t *__refcook,
63 uintptr_t *__defcook,
64 La_loongarch_regs *__regs,
65 unsigned int *__flags,
66 const char *__symname,
67 long int *__framesizep);
68extern unsigned int la_loongarch_gnu_pltexit (ElfW (Sym) *__sym,
69 unsigned int __ndx,
70 uintptr_t *__refcook,
71 uintptr_t *__defcook,
72 const La_loongarch_regs *__inregs,
73 La_loongarch_retval *__outregs,
74 const char *__symname);
75
76__END_DECLS
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/link_lavcurrent.h created+25
...@@ -0,0 +1,25 @@
1/* Data structure for communication from the run-time dynamic linker for
2 loaded ELF shared objects. LAV_CURRENT definition.
3 Copyright (C) 2023-2024 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <https://www.gnu.org/licenses/>. */
19
20#ifndef _LINK_H
21# error "Never include <bits/link_lavcurrent.h> directly; use <link.h> instead."
22#endif
23
24/* Version numbers for la_version handshake interface. */
25#define LAV_CURRENT 3
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/long-double.h created+21
...@@ -0,0 +1,21 @@
1/* Properties of long double type. ldbl-128 version.
2 Copyright (C) 2016-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19/* long double is distinct from double, so there is nothing to
20 define here. */
21#define __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI 0
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/procfs.h created+52
...@@ -0,0 +1,52 @@
1/* Types for registers for sys/procfs.h.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library. If not, see
18 <https://www.gnu.org/licenses/>. */
19
20#ifndef _SYS_PROCFS_H
21# error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
22#endif
23
24/* Type for a general-purpose register. */
25typedef __uint64_t elf_greg_t;
26
27/* And the whole bunch of them. We could have used `struct
28 pt_regs' directly in the typedef, but tradition says that
29 the register set is an array, which does have some peculiar
30 semantics, so leave it that way. */
31#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t))
32typedef elf_greg_t elf_gregset_t[ELF_NGREG];
33
34#define ELF_NFPREG 34 /* 32 FPRs + 8-byte byte-vec for fcc + 4-byte FCR */
35typedef union
36{
37 double d;
38 float f;
39} elf_fpreg_t;
40typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
41
42typedef union
43{
44 double d[2];
45 float f[4];
46} __attribute__ ((__aligned__ (16))) elf_lsxregset_t[32];
47
48typedef union
49{
50 double d[4];
51 float f[8];
52} __attribute__ ((__aligned__ (32))) elf_lasxregset_t[32];
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/pthread_stack_min.h created+20
...@@ -0,0 +1,20 @@
1/* Definition of PTHREAD_STACK_MIN. LoongArch Linux version.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public License as
7 published by the Free Software Foundation; either version 2.1 of the
8 License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library. If not, see
17 <https://www.gnu.org/licenses/>. */
18
19/* Minimum size for a thread. At least two pages with 64k pages. */
20#define PTHREAD_STACK_MIN 131072
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/setjmp.h created+42
...@@ -0,0 +1,42 @@
1/* Define the machine-dependent type `jmp_buf'.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library. If not, see
17 <https://www.gnu.org/licenses/>. */
18
19#ifndef _LOONGARCH_BITS_SETJMP_H
20#define _LOONGARCH_BITS_SETJMP_H
21
22typedef struct __jmp_buf_internal_tag
23{
24 /* Program counter. */
25 long int __pc;
26 /* Stack pointer. */
27 long int __sp;
28 /* Reserved */
29 long int __x;
30 /* Frame pointer. */
31 long int __fp;
32 /* Callee-saved registers. */
33 long int __regs[9];
34
35#ifndef __loongarch_soft_float
36 /* Callee-saved floating point registers. */
37 double __fpregs[8];
38#endif
39
40} __jmp_buf[1];
41
42#endif /* _LOONGARCH_BITS_SETJMP_H */
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/shmlba.h created+24
...@@ -0,0 +1,24 @@
1/* Define SHMLBA. LoongArch version.
2 Copyright (C) 2023-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#ifndef _SYS_SHM_H
20# error "Never use <bits/shmlba.h> directly; include <sys/shm.h> instead."
21#endif
22
23/* Segment low boundary address multiple. */
24#define SHMLBA 0x10000
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/sigstack.h created+32
...@@ -0,0 +1,32 @@
1/* sigstack, sigaltstack definitions.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#ifndef _BITS_SIGSTACK_H
20#define _BITS_SIGSTACK_H 1
21
22#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
23# error "Never include this file directly. Use <signal.h> instead"
24#endif
25
26/* Minimum stack size for a signal handler. */
27#define MINSIGSTKSZ 4096
28
29/* System default stack size. */
30#define SIGSTKSZ 16384
31
32#endif /* bits/sigstack.h */
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/struct_stat.h created+127
...@@ -0,0 +1,127 @@
1/* Definition for struct stat.
2 Copyright (C) 2020-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library. If not, see
17 <https://www.gnu.org/licenses/>. */
18
19#if !defined _SYS_STAT_H && !defined _FCNTL_H
20# error "Never include <bits/struct_stat.h> directly; use <sys/stat.h> instead."
21#endif
22
23#ifndef _BITS_STRUCT_STAT_H
24#define _BITS_STRUCT_STAT_H 1
25
26#include <bits/endian.h>
27#include <bits/wordsize.h>
28
29#if defined __USE_FILE_OFFSET64
30# define __field64(type, type64, name) type64 name
31#elif __WORDSIZE == 64 || defined __INO_T_MATCHES_INO64_T
32# if defined __INO_T_MATCHES_INO64_T && !defined __OFF_T_MATCHES_OFF64_T
33# error "ino_t and off_t must both be the same type"
34# endif
35# define __field64(type, type64, name) type name
36#elif __BYTE_ORDER == __LITTLE_ENDIAN
37# define __field64(type, type64, name) \
38 type name __attribute__((__aligned__ (__alignof__ (type64)))); int __##name##_pad
39#else
40# define __field64(type, type64, name) \
41 int __##name##_pad __attribute__((__aligned__ (__alignof__ (type64)))); type name
42#endif
43
44struct stat
45 {
46 __dev_t st_dev; /* Device. */
47 __field64(__ino_t, __ino64_t, st_ino); /* File serial number. */
48 __mode_t st_mode; /* File mode. */
49 __nlink_t st_nlink; /* Link count. */
50 __uid_t st_uid; /* User ID of the file's owner. */
51 __gid_t st_gid; /* Group ID of the file's group.*/
52 __dev_t st_rdev; /* Device number, if device. */
53 __dev_t __pad1;
54 __field64(__off_t, __off64_t, st_size); /* Size of file, in bytes. */
55 __blksize_t st_blksize; /* Optimal block size for I/O. */
56 int __pad2;
57 __field64(__blkcnt_t, __blkcnt64_t, st_blocks); /* 512-byte blocks */
58#ifdef __USE_XOPEN2K8
59 /* Nanosecond resolution timestamps are stored in a format
60 equivalent to 'struct timespec'. This is the type used
61 whenever possible but the Unix namespace rules do not allow the
62 identifier 'timespec' to appear in the <sys/stat.h> header.
63 Therefore we have to handle the use of this header in strictly
64 standard-compliant sources special. */
65 struct timespec st_atim; /* Time of last access. */
66 struct timespec st_mtim; /* Time of last modification. */
67 struct timespec st_ctim; /* Time of last status change. */
68# define st_atime st_atim.tv_sec /* Backward compatibility. */
69# define st_mtime st_mtim.tv_sec
70# define st_ctime st_ctim.tv_sec
71#else
72 __time_t st_atime; /* Time of last access. */
73 unsigned long int st_atimensec; /* Nscecs of last access. */
74 __time_t st_mtime; /* Time of last modification. */
75 unsigned long int st_mtimensec; /* Nsecs of last modification. */
76 __time_t st_ctime; /* Time of last status change. */
77 unsigned long int st_ctimensec; /* Nsecs of last status change. */
78#endif
79 int __glibc_reserved[2];
80 };
81
82#undef __field64
83
84#ifdef __USE_LARGEFILE64
85struct stat64
86 {
87 __dev_t st_dev; /* Device. */
88 __ino64_t st_ino; /* File serial number. */
89 __mode_t st_mode; /* File mode. */
90 __nlink_t st_nlink; /* Link count. */
91 __uid_t st_uid; /* User ID of the file's owner. */
92 __gid_t st_gid; /* Group ID of the file's group.*/
93 __dev_t st_rdev; /* Device number, if device. */
94 __dev_t __pad1;
95 __off64_t st_size; /* Size of file, in bytes. */
96 __blksize_t st_blksize; /* Optimal block size for I/O. */
97 int __pad2;
98 __blkcnt64_t st_blocks; /* Nr. 512-byte blocks allocated. */
99#ifdef __USE_XOPEN2K8
100 /* Nanosecond resolution timestamps are stored in a format
101 equivalent to 'struct timespec'. This is the type used
102 whenever possible but the Unix namespace rules do not allow the
103 identifier 'timespec' to appear in the <sys/stat.h> header.
104 Therefore we have to handle the use of this header in strictly
105 standard-compliant sources special. */
106 struct timespec st_atim; /* Time of last access. */
107 struct timespec st_mtim; /* Time of last modification. */
108 struct timespec st_ctim; /* Time of last status change. */
109#else
110 __time_t st_atime; /* Time of last access. */
111 unsigned long int st_atimensec; /* Nscecs of last access. */
112 __time_t st_mtime; /* Time of last modification. */
113 unsigned long int st_mtimensec; /* Nsecs of last modification. */
114 __time_t st_ctime; /* Time of last status change. */
115 unsigned long int st_ctimensec; /* Nsecs of last status change. */
116#endif
117 int __glibc_reserved[2];
118 };
119#endif
120
121/* Tell code we have these members. */
122#define _STATBUF_ST_BLKSIZE
123#define _STATBUF_ST_RDEV
124/* Nanosecond resolution time values are supported. */
125#define _STATBUF_ST_NSEC
126
127#endif /* _BITS_STRUCT_STAT_H */
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/timesize.h created+20
...@@ -0,0 +1,20 @@
1/* Bit size of the time_t type at glibc build time, general case.
2 Copyright (C) 2018-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19/* Size in bits of the 'time_t' type of the default ABI. */
20#define __TIMESIZE 64
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/bits/wordsize.h created+19
...@@ -0,0 +1,19 @@
1/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
17
18#define __WORDSIZE 64
19#define __WORDSIZE_TIME64_COMPAT32 0
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/fpu_control.h created+119
...@@ -0,0 +1,119 @@
1/* FPU control word bits.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library. If not, see
17 <https://www.gnu.org/licenses/>. */
18
19#ifndef _FPU_CONTROL_H
20#define _FPU_CONTROL_H
21
22/* LoongArch FPU floating point control register bits.
23 *
24 * 31-29 -> reserved (read as 0, can not changed by software)
25 * 28 -> cause bit for invalid exception
26 * 27 -> cause bit for division by zero exception
27 * 26 -> cause bit for overflow exception
28 * 25 -> cause bit for underflow exception
29 * 24 -> cause bit for inexact exception
30 * 23-21 -> reserved (read as 0, can not changed by software)
31 * 20 -> flag invalid exception
32 * 19 -> flag division by zero exception
33 * 18 -> flag overflow exception
34 * 17 -> flag underflow exception
35 * 16 -> flag inexact exception
36 * 9-8 -> rounding control
37 * 7-5 -> reserved (read as 0, can not changed by software)
38 * 4 -> enable exception for invalid exception
39 * 3 -> enable exception for division by zero exception
40 * 2 -> enable exception for overflow exception
41 * 1 -> enable exception for underflow exception
42 * 0 -> enable exception for inexact exception
43 *
44 *
45 * Rounding Control:
46 * 00 - rounding ties to even (RNE)
47 * 01 - rounding toward zero (RZ)
48 * 10 - rounding (up) toward plus infinity (RP)
49 * 11 - rounding (down) toward minus infinity (RM)
50 */
51
52#include <features.h>
53
54#ifdef __loongarch_soft_float
55
56#define _FPU_RESERVED 0xffffffff
57#define _FPU_DEFAULT 0x00000000
58typedef unsigned int fpu_control_t;
59#define _FPU_GETCW(cw) (cw) = 0
60#define _FPU_SETCW(cw) (void) (cw)
61extern fpu_control_t __fpu_control;
62
63#else /* __loongarch_soft_float */
64
65/* Masks for interrupts. */
66#define _FPU_MASK_V 0x10 /* Invalid operation */
67#define _FPU_MASK_Z 0x08 /* Division by zero */
68#define _FPU_MASK_O 0x04 /* Overflow */
69#define _FPU_MASK_U 0x02 /* Underflow */
70#define _FPU_MASK_I 0x01 /* Inexact operation */
71
72/* Flush denormalized numbers to zero. */
73#define _FPU_FLUSH_TZ 0x1000000
74
75/* Rounding control. */
76#define _FPU_RC_NEAREST 0x000 /* RECOMMENDED */
77#define _FPU_RC_ZERO 0x100
78#define _FPU_RC_UP 0x200
79#define _FPU_RC_DOWN 0x300
80/* Mask for rounding control. */
81#define _FPU_RC_MASK 0x300
82
83#define _FPU_RESERVED 0x0
84
85#define _FPU_DEFAULT 0x0
86#define _FPU_IEEE 0x1F
87
88/* Type of the control word. */
89typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
90
91/* Macros for accessing the hardware control word. */
92extern fpu_control_t __loongarch_fpu_getcw (void) __THROW;
93extern void __loongarch_fpu_setcw (fpu_control_t) __THROW;
94#define _FPU_GETCW(cw) __asm__ volatile ("movfcsr2gr %0,$fcsr0" : "=r"(cw))
95#define _FPU_SETCW(cw) __asm__ volatile ("movgr2fcsr $fcsr0,%0" : : "r"(cw))
96
97/* Default control word set at startup. */
98extern fpu_control_t __fpu_control;
99
100# define _FCLASS_SNAN (1 << 0)
101# define _FCLASS_QNAN (1 << 1)
102# define _FCLASS_MINF (1 << 2)
103# define _FCLASS_MNORM (1 << 3)
104# define _FCLASS_MSUBNORM (1 << 4)
105# define _FCLASS_MZERO (1 << 5)
106# define _FCLASS_PINF (1 << 6)
107# define _FCLASS_PNORM (1 << 7)
108# define _FCLASS_PSUBNORM (1 << 8)
109# define _FCLASS_PZERO (1 << 9)
110
111# define _FCLASS_ZERO (_FCLASS_MZERO | _FCLASS_PZERO)
112# define _FCLASS_SUBNORM (_FCLASS_MSUBNORM | _FCLASS_PSUBNORM)
113# define _FCLASS_NORM (_FCLASS_MNORM | _FCLASS_PNORM)
114# define _FCLASS_INF (_FCLASS_MINF | _FCLASS_PINF)
115# define _FCLASS_NAN (_FCLASS_SNAN | _FCLASS_QNAN)
116
117#endif /* __loongarch_soft_float */
118
119#endif /* fpu_control.h */
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/gnu/lib-names-lp64s.h created+27
...@@ -0,0 +1,27 @@
1/* This file is automatically generated. */
2#ifndef __GNU_LIB_NAMES_H
3# error "Never use <gnu/lib-names-lp64s.h> directly; include <gnu/lib-names.h> instead."
4#endif
5
6#define LD_LINUX_LOONGARCH_LP64S_SO "ld-linux-loongarch-lp64s.so.1"
7#define LD_SO "ld-linux-loongarch-lp64s.so.1"
8#define LIBANL_SO "libanl.so.1"
9#define LIBBROKENLOCALE_SO "libBrokenLocale.so.1"
10#define LIBC_MALLOC_DEBUG_SO "libc_malloc_debug.so.0"
11#define LIBC_SO "libc.so.6"
12#define LIBDL_SO "libdl.so.2"
13#define LIBGCC_S_SO "libgcc_s.so.1"
14#define LIBMVEC_SO "libmvec.so.1"
15#define LIBM_SO "libm.so.6"
16#define LIBNSL_SO "libnsl.so.1"
17#define LIBNSS_COMPAT_SO "libnss_compat.so.2"
18#define LIBNSS_DB_SO "libnss_db.so.2"
19#define LIBNSS_DNS_SO "libnss_dns.so.2"
20#define LIBNSS_FILES_SO "libnss_files.so.2"
21#define LIBNSS_HESIOD_SO "libnss_hesiod.so.2"
22#define LIBNSS_LDAP_SO "libnss_ldap.so.2"
23#define LIBPTHREAD_SO "libpthread.so.0"
24#define LIBRESOLV_SO "libresolv.so.2"
25#define LIBRT_SO "librt.so.1"
26#define LIBTHREAD_DB_SO "libthread_db.so.1"
27#define LIBUTIL_SO "libutil.so.1"
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/gnu/lib-names.h created+16
...@@ -0,0 +1,16 @@
1/* This file is automatically generated.
2 It defines macros to allow user program to find the shared
3 library files which come as part of GNU libc. */
4#ifndef __GNU_LIB_NAMES_H
5#define __GNU_LIB_NAMES_H 1
6
7#include <bits/wordsize.h>
8
9#if __WORDSIZE == 64 && defined __loongarch_soft_float
10# include <gnu/lib-names-lp64s.h>
11#endif
12#if __WORDSIZE == 64 && defined __loongarch_double_float
13# include <gnu/lib-names-lp64d.h>
14#endif
15
16#endif /* gnu/lib-names.h */
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/gnu/stubs-lp64s.h created+38
...@@ -0,0 +1,38 @@
1/* This file is automatically generated.
2 It defines a symbol `__stub_FUNCTION' for each function
3 in the C library which is a stub, meaning it will fail
4 every time called, usually setting errno to ENOSYS. */
5
6#ifdef _LIBC
7 #error Applications may not define the macro _LIBC
8#endif
9
10#define __stub___compat_bdflush
11#define __stub___compat_create_module
12#define __stub___compat_get_kernel_syms
13#define __stub___compat_query_module
14#define __stub___compat_uselib
15#define __stub_chflags
16#define __stub_fchflags
17#define __stub_feclearexcept
18#define __stub_fedisableexcept
19#define __stub_feenableexcept
20#define __stub_fegetenv
21#define __stub_fegetexcept
22#define __stub_fegetexceptflag
23#define __stub_fegetmode
24#define __stub_fegetround
25#define __stub_feholdexcept
26#define __stub_feraiseexcept
27#define __stub_fesetenv
28#define __stub_fesetexcept
29#define __stub_fesetexceptflag
30#define __stub_fesetmode
31#define __stub_fesetround
32#define __stub_fetestexcept
33#define __stub_feupdateenv
34#define __stub_gtty
35#define __stub_revoke
36#define __stub_setlogin
37#define __stub_sigreturn
38#define __stub_stty
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/gnu/stubs.h created+12
...@@ -0,0 +1,12 @@
1/* This file is automatically generated.
2 This file selects the right generated file of `__stub_FUNCTION' macros
3 based on the architecture being compiled for. */
4
5#include <bits/wordsize.h>
6
7#if __WORDSIZE == 64 && defined __loongarch_soft_float
8# include <gnu/stubs-lp64s.h>
9#endif
10#if __WORDSIZE == 64 && defined __loongarch_double_float
11# include <gnu/stubs-lp64d.h>
12#endif
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/ieee754.h created+170
...@@ -0,0 +1,170 @@
1/* Copyright (C) 1992-2024 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
17
18#ifndef _IEEE754_H
19#define _IEEE754_H 1
20
21#include <features.h>
22
23#include <bits/endian.h>
24
25__BEGIN_DECLS
26
27union ieee754_float
28 {
29 float f;
30
31 /* This is the IEEE 754 single-precision format. */
32 struct
33 {
34#if __BYTE_ORDER == __BIG_ENDIAN
35 unsigned int negative:1;
36 unsigned int exponent:8;
37 unsigned int mantissa:23;
38#endif /* Big endian. */
39#if __BYTE_ORDER == __LITTLE_ENDIAN
40 unsigned int mantissa:23;
41 unsigned int exponent:8;
42 unsigned int negative:1;
43#endif /* Little endian. */
44 } ieee;
45
46 /* This format makes it easier to see if a NaN is a signalling NaN. */
47 struct
48 {
49#if __BYTE_ORDER == __BIG_ENDIAN
50 unsigned int negative:1;
51 unsigned int exponent:8;
52 unsigned int quiet_nan:1;
53 unsigned int mantissa:22;
54#endif /* Big endian. */
55#if __BYTE_ORDER == __LITTLE_ENDIAN
56 unsigned int mantissa:22;
57 unsigned int quiet_nan:1;
58 unsigned int exponent:8;
59 unsigned int negative:1;
60#endif /* Little endian. */
61 } ieee_nan;
62 };
63
64#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */
65
66
67union ieee754_double
68 {
69 double d;
70
71 /* This is the IEEE 754 double-precision format. */
72 struct
73 {
74#if __BYTE_ORDER == __BIG_ENDIAN
75 unsigned int negative:1;
76 unsigned int exponent:11;
77 /* Together these comprise the mantissa. */
78 unsigned int mantissa0:20;
79 unsigned int mantissa1:32;
80#endif /* Big endian. */
81#if __BYTE_ORDER == __LITTLE_ENDIAN
82 /* Together these comprise the mantissa. */
83 unsigned int mantissa1:32;
84 unsigned int mantissa0:20;
85 unsigned int exponent:11;
86 unsigned int negative:1;
87#endif /* Little endian. */
88 } ieee;
89
90 /* This format makes it easier to see if a NaN is a signalling NaN. */
91 struct
92 {
93#if __BYTE_ORDER == __BIG_ENDIAN
94 unsigned int negative:1;
95 unsigned int exponent:11;
96 unsigned int quiet_nan:1;
97 /* Together these comprise the mantissa. */
98 unsigned int mantissa0:19;
99 unsigned int mantissa1:32;
100#else
101 /* Together these comprise the mantissa. */
102 unsigned int mantissa1:32;
103 unsigned int mantissa0:19;
104 unsigned int quiet_nan:1;
105 unsigned int exponent:11;
106 unsigned int negative:1;
107#endif
108 } ieee_nan;
109 };
110
111#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */
112
113
114union ieee854_long_double
115 {
116 long double d;
117
118 /* This is the IEEE 854 quad-precision format. */
119 struct
120 {
121#if __BYTE_ORDER == __BIG_ENDIAN
122 unsigned int negative:1;
123 unsigned int exponent:15;
124 /* Together these comprise the mantissa. */
125 unsigned int mantissa0:16;
126 unsigned int mantissa1:32;
127 unsigned int mantissa2:32;
128 unsigned int mantissa3:32;
129#endif /* Big endian. */
130#if __BYTE_ORDER == __LITTLE_ENDIAN
131 /* Together these comprise the mantissa. */
132 unsigned int mantissa3:32;
133 unsigned int mantissa2:32;
134 unsigned int mantissa1:32;
135 unsigned int mantissa0:16;
136 unsigned int exponent:15;
137 unsigned int negative:1;
138#endif /* Little endian. */
139 } ieee;
140
141 /* This format makes it easier to see if a NaN is a signalling NaN. */
142 struct
143 {
144#if __BYTE_ORDER == __BIG_ENDIAN
145 unsigned int negative:1;
146 unsigned int exponent:15;
147 unsigned int quiet_nan:1;
148 /* Together these comprise the mantissa. */
149 unsigned int mantissa0:15;
150 unsigned int mantissa1:32;
151 unsigned int mantissa2:32;
152 unsigned int mantissa3:32;
153#else
154 /* Together these comprise the mantissa. */
155 unsigned int mantissa3:32;
156 unsigned int mantissa2:32;
157 unsigned int mantissa1:32;
158 unsigned int mantissa0:15;
159 unsigned int quiet_nan:1;
160 unsigned int exponent:15;
161 unsigned int negative:1;
162#endif
163 } ieee_nan;
164 };
165
166#define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent. */
167
168__END_DECLS
169
170#endif /* ieee754.h */
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/sys/asm.h created+78
...@@ -0,0 +1,78 @@
1/* Miscellaneous macros.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library. If not, see
17 <https://www.gnu.org/licenses/>. */
18
19#ifndef _SYS_ASM_H
20#define _SYS_ASM_H
21
22#include <sys/regdef.h>
23#include <sysdeps/generic/sysdep.h>
24
25/* Macros to handle different pointer/register sizes for 32/64-bit code. */
26#define SZREG 8
27#define SZFREG 8
28#define SZVREG 16
29#define SZXREG 32
30#define REG_L ld.d
31#define REG_S st.d
32#define SRLI srli.d
33#define SLLI slli.d
34#define ADDI addi.d
35#define ADD add.d
36#define SUB sub.d
37#define BSTRINS bstrins.d
38#define LI li.d
39#define FREG_L fld.d
40#define FREG_S fst.d
41
42/* Declare leaf routine.
43 The usage of macro LEAF/ENTRY is as follows:
44 1. LEAF(fcn) -- the align value of fcn is .align 3 (default value)
45 2. LEAF(fcn, 6) -- the align value of fcn is .align 6
46*/
47#define LEAF_IMPL(symbol, aln, ...) \
48 .text; \
49 .globl symbol; \
50 .align aln; \
51 .type symbol, @function; \
52symbol: \
53 cfi_startproc;
54
55
56#define LEAF(...) LEAF_IMPL(__VA_ARGS__, 3)
57#define ENTRY(...) LEAF(__VA_ARGS__)
58
59#define LEAF_NO_ALIGN(symbol) \
60 .text; \
61 .globl symbol; \
62 .type symbol, @function; \
63symbol: \
64 cfi_startproc;
65
66#define ENTRY_NO_ALIGN(symbol) LEAF_NO_ALIGN(symbol)
67
68
69/* Mark end of function. */
70#undef END
71#define END(function) \
72 cfi_endproc; \
73 .size function, .- function;
74
75/* Stack alignment. */
76#define ALMASK ~15
77
78#endif /* sys/asm.h */
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/sys/ucontext.h created+64
...@@ -0,0 +1,64 @@
1/* struct ucontext definition.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library. If not, see
18 <https://www.gnu.org/licenses/>. */
19
20/* Don't rely on this, the interface is currently messed up and may need to
21 be broken to be fixed. */
22#ifndef _SYS_UCONTEXT_H
23#define _SYS_UCONTEXT_H 1
24
25#include <features.h>
26
27#include <bits/types/sigset_t.h>
28#include <bits/types/stack_t.h>
29
30#ifdef __USE_MISC
31#define LARCH_NGREG 32
32
33#define LARCH_REG_RA 1
34#define LARCH_REG_SP 3
35#define LARCH_REG_S0 23
36#define LARCH_REG_S1 24
37#define LARCH_REG_A0 4
38#define LARCH_REG_S2 25
39#define LARCH_REG_NARGS 8
40
41typedef unsigned long int greg_t;
42/* Container for all general registers. */
43typedef greg_t gregset_t[32];
44#endif
45
46typedef struct mcontext_t
47{
48 unsigned long long __pc;
49 unsigned long long __gregs[32];
50 unsigned int __flags;
51 unsigned long long __extcontext[0] __attribute__((__aligned__(16)));
52} mcontext_t;
53
54/* Userlevel context. */
55typedef struct ucontext_t
56{
57 unsigned long int __uc_flags;
58 struct ucontext_t *uc_link;
59 stack_t uc_stack;
60 sigset_t uc_sigmask;
61 mcontext_t uc_mcontext;
62} ucontext_t;
63
64#endif /* sys/ucontext.h */
\ No newline at end of file
lib/libc/include/loongarch64-linux-gnusf/sys/user.h created+42
...@@ -0,0 +1,42 @@
1/* struct user_regs_struct definition for LoongArch.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#ifndef _SYS_USER_H
20#define _SYS_USER_H 1
21
22#include <stdint.h>
23
24struct user_regs_struct
25{
26 /* Saved main processor registers. */
27 uint64_t regs[32];
28
29 /* Saved special registers. */
30 uint64_t orig_a0;
31 uint64_t csr_era;
32 uint64_t csr_badv;
33 uint64_t reserved[10];
34};
35
36struct user_fp_struct {
37 uint64_t fpr[32];
38 uint64_t fcc;
39 uint32_t fcsr;
40};
41
42#endif /* _SYS_USER_H */
\ No newline at end of file
lib/std/zig/target.zig+1
...@@ -35,6 +35,7 @@ pub const available_libcs = [_]ArchOsAbi{...@@ -35,6 +35,7 @@ pub const available_libcs = [_]ArchOsAbi{
35 .{ .arch = .x86, .os = .linux, .abi = .musl },35 .{ .arch = .x86, .os = .linux, .abi = .musl },
36 .{ .arch = .x86, .os = .windows, .abi = .gnu },36 .{ .arch = .x86, .os = .windows, .abi = .gnu },
37 .{ .arch = .loongarch64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 } },37 .{ .arch = .loongarch64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 } },
38 .{ .arch = .loongarch64, .os = .linux, .abi = .gnusf, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 } },
38 .{ .arch = .loongarch64, .os = .linux, .abi = .musl },39 .{ .arch = .loongarch64, .os = .linux, .abi = .musl },
39 .{ .arch = .m68k, .os = .linux, .abi = .gnu },40 .{ .arch = .m68k, .os = .linux, .abi = .gnu },
40 .{ .arch = .m68k, .os = .linux, .abi = .musl },41 .{ .arch = .m68k, .os = .linux, .abi = .musl },
src/glibc.zig+37-37
...@@ -845,12 +845,8 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi...@@ -845,12 +845,8 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
845 stubs_asm.shrinkRetainingCapacity(0);845 stubs_asm.shrinkRetainingCapacity(0);
846 try stubs_asm.appendSlice(".text\n");846 try stubs_asm.appendSlice(".text\n");
847847
848 var inc_i: usize = 0;
849
850 const fn_inclusions_len = mem.readInt(u16, metadata.inclusions[inc_i..][0..2], .little);
851 inc_i += 2;
852
853 var sym_i: usize = 0;848 var sym_i: usize = 0;
849 var sym_name_buf = std.ArrayList(u8).init(arena);
854 var opt_symbol_name: ?[]const u8 = null;850 var opt_symbol_name: ?[]const u8 = null;
855 var versions_buffer: [32]u8 = undefined;851 var versions_buffer: [32]u8 = undefined;
856 var versions_len: usize = undefined;852 var versions_len: usize = undefined;
...@@ -871,32 +867,38 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi...@@ -871,32 +867,38 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
871 // twice, which causes a "duplicate symbol" assembler error.867 // twice, which causes a "duplicate symbol" assembler error.
872 var versions_written = std.AutoArrayHashMap(Version, void).init(arena);868 var versions_written = std.AutoArrayHashMap(Version, void).init(arena);
873869
870 var inc_fbs = std.io.fixedBufferStream(metadata.inclusions);
871 var inc_reader = inc_fbs.reader();
872
873 const fn_inclusions_len = try inc_reader.readInt(u16, .little);
874
874 while (sym_i < fn_inclusions_len) : (sym_i += 1) {875 while (sym_i < fn_inclusions_len) : (sym_i += 1) {
875 const sym_name = opt_symbol_name orelse n: {876 const sym_name = opt_symbol_name orelse n: {
876 const name = mem.sliceTo(metadata.inclusions[inc_i..], 0);877 sym_name_buf.clearRetainingCapacity();
877 inc_i += name.len + 1;878 try inc_reader.streamUntilDelimiter(sym_name_buf.writer(), 0, null);
878879
879 opt_symbol_name = name;880 opt_symbol_name = sym_name_buf.items;
880 versions_buffer = undefined;881 versions_buffer = undefined;
881 versions_len = 0;882 versions_len = 0;
882 break :n name;883
884 break :n sym_name_buf.items;
883 };885 };
884 const targets = mem.readInt(u32, metadata.inclusions[inc_i..][0..4], .little);886 const targets = try std.leb.readUleb128(u64, inc_reader);
885 inc_i += 4;887 var lib_index = try inc_reader.readByte();
886888
887 const lib_index = metadata.inclusions[inc_i];889 const is_terminal = (lib_index & (1 << 7)) != 0;
888 inc_i += 1;890 if (is_terminal) {
889 const is_terminal = (targets & (1 << 31)) != 0;891 lib_index &= ~@as(u8, 1 << 7);
890 if (is_terminal) opt_symbol_name = null;892 opt_symbol_name = null;
893 }
891894
892 // Test whether the inclusion applies to our current library and target.895 // Test whether the inclusion applies to our current library and target.
893 const ok_lib_and_target =896 const ok_lib_and_target =
894 (lib_index == lib_i) and897 (lib_index == lib_i) and
895 ((targets & (@as(u32, 1) << @as(u5, @intCast(target_targ_index)))) != 0);898 ((targets & (@as(u64, 1) << @as(u6, @intCast(target_targ_index)))) != 0);
896899
897 while (true) {900 while (true) {
898 const byte = metadata.inclusions[inc_i];901 const byte = try inc_reader.readByte();
899 inc_i += 1;
900 const last = (byte & 0b1000_0000) != 0;902 const last = (byte & 0b1000_0000) != 0;
901 const ver_i = @as(u7, @truncate(byte));903 const ver_i = @as(u7, @truncate(byte));
902 if (ok_lib_and_target and ver_i <= target_ver_index) {904 if (ok_lib_and_target and ver_i <= target_ver_index) {
...@@ -1027,8 +1029,7 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi...@@ -1027,8 +1029,7 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
1027 , .{wordDirective(target)});1029 , .{wordDirective(target)});
1028 }1030 }
10291031
1030 const obj_inclusions_len = mem.readInt(u16, metadata.inclusions[inc_i..][0..2], .little);1032 const obj_inclusions_len = try inc_reader.readInt(u16, .little);
1031 inc_i += 2;
10321033
1033 sym_i = 0;1034 sym_i = 0;
1034 opt_symbol_name = null;1035 opt_symbol_name = null;
...@@ -1036,33 +1037,32 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi...@@ -1036,33 +1037,32 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
1036 versions_len = undefined;1037 versions_len = undefined;
1037 while (sym_i < obj_inclusions_len) : (sym_i += 1) {1038 while (sym_i < obj_inclusions_len) : (sym_i += 1) {
1038 const sym_name = opt_symbol_name orelse n: {1039 const sym_name = opt_symbol_name orelse n: {
1039 const name = mem.sliceTo(metadata.inclusions[inc_i..], 0);1040 sym_name_buf.clearRetainingCapacity();
1040 inc_i += name.len + 1;1041 try inc_reader.streamUntilDelimiter(sym_name_buf.writer(), 0, null);
10411042
1042 opt_symbol_name = name;1043 opt_symbol_name = sym_name_buf.items;
1043 versions_buffer = undefined;1044 versions_buffer = undefined;
1044 versions_len = 0;1045 versions_len = 0;
1045 break :n name;
1046 };
1047 const targets = mem.readInt(u32, metadata.inclusions[inc_i..][0..4], .little);
1048 inc_i += 4;
1049
1050 const size = mem.readInt(u16, metadata.inclusions[inc_i..][0..2], .little);
1051 inc_i += 2;
10521046
1053 const lib_index = metadata.inclusions[inc_i];1047 break :n sym_name_buf.items;
1054 inc_i += 1;1048 };
1055 const is_terminal = (targets & (1 << 31)) != 0;1049 const targets = try std.leb.readUleb128(u64, inc_reader);
1056 if (is_terminal) opt_symbol_name = null;1050 const size = try std.leb.readUleb128(u16, inc_reader);
1051 var lib_index = try inc_reader.readByte();
1052
1053 const is_terminal = (lib_index & (1 << 7)) != 0;
1054 if (is_terminal) {
1055 lib_index &= ~@as(u8, 1 << 7);
1056 opt_symbol_name = null;
1057 }
10571058
1058 // Test whether the inclusion applies to our current library and target.1059 // Test whether the inclusion applies to our current library and target.
1059 const ok_lib_and_target =1060 const ok_lib_and_target =
1060 (lib_index == lib_i) and1061 (lib_index == lib_i) and
1061 ((targets & (@as(u32, 1) << @as(u5, @intCast(target_targ_index)))) != 0);1062 ((targets & (@as(u64, 1) << @as(u6, @intCast(target_targ_index)))) != 0);
10621063
1063 while (true) {1064 while (true) {
1064 const byte = metadata.inclusions[inc_i];1065 const byte = try inc_reader.readByte();
1065 inc_i += 1;
1066 const last = (byte & 0b1000_0000) != 0;1066 const last = (byte & 0b1000_0000) != 0;
1067 const ver_i = @as(u7, @truncate(byte));1067 const ver_i = @as(u7, @truncate(byte));
1068 if (ok_lib_and_target and ver_i <= target_ver_index) {1068 if (ok_lib_and_target and ver_i <= target_ver_index) {
tools/process_headers.zig+5
...@@ -209,6 +209,11 @@ const glibc_targets = [_]LibCTarget{...@@ -209,6 +209,11 @@ const glibc_targets = [_]LibCTarget{
209 .arch = MultiArch{ .specific = .loongarch64 },209 .arch = MultiArch{ .specific = .loongarch64 },
210 .abi = MultiAbi{ .specific = Abi.gnu },210 .abi = MultiAbi{ .specific = Abi.gnu },
211 },211 },
212 LibCTarget{
213 .name = "loongarch64-linux-gnu-lp64s",
214 .arch = MultiArch{ .specific = .loongarch64 },
215 .abi = MultiAbi{ .specific = Abi.gnusf },
216 },
212};217};
213218
214const musl_targets = [_]LibCTarget{219const musl_targets = [_]LibCTarget{