[7/14,LoongArch] Linux ABI

Message ID CAKjxQHk49s9MB7eNE0BOMKWDVYxYEStGgKWi_t3VuAkM9waaGQ@mail.gmail.com
State Superseded
Headers
Series None |

Commit Message

Paul Hua Aug. 19, 2021, 4:05 a.m. UTC
  From 883324812c75c37d4e64fcbf686f1376bccadbc6 Mon Sep 17 00:00:00 2001
From: caiyinyu <caiyinyu@loongson.cn>
Date: Tue, 27 Jul 2021 15:53:52 +0800
Subject: [PATCH 07/14] LoongArch: Linux ABI

Linux-specific code that is required for maintaining ABI compatibility.

        * sysdeps/loongarch/dl-irel.h: New file.
        * sysdeps/loongarch/libc-start.h: Likewise.
        * sysdeps/loongarch/nptl/bits/struct_rwlock.h: Likewise.
        * sysdeps/loongarch/nptl/pthread-offsets.h: Likewise.
        * sysdeps/loongarch/nptl/pthreaddef.h: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/bits/mman.h: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/bits/sigcontext.h: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/getcontext.S: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/makecontext.c: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/register-dump.h: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/setcontext.S: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/swapcontext.S: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/sys/procfs.h: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/sys/user.h: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h: Likewise.
        * sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym: Likewise.
---
 sysdeps/loongarch/dl-irel.h                   |  48 +++++++
 sysdeps/loongarch/libc-start.h                |  25 ++++
 sysdeps/loongarch/nptl/bits/struct_rwlock.h   |  44 ++++++
 sysdeps/loongarch/nptl/pthread-offsets.h      |  15 ++
 sysdeps/loongarch/nptl/pthreaddef.h           |  35 +++++
 .../unix/sysv/linux/loongarch/bits/fcntl.h    |  61 ++++++++
 sysdeps/unix/sysv/linux/loongarch/bits/mman.h |  42 ++++++
 .../sysv/linux/loongarch/bits/sigcontext.h    |  49 +++++++
 .../unix/sysv/linux/loongarch/getcontext.S    |  74 ++++++++++
 .../unix/sysv/linux/loongarch/makecontext.c   |  78 ++++++++++
 .../unix/sysv/linux/loongarch/register-dump.h |  61 ++++++++
 .../unix/sysv/linux/loongarch/setcontext.S    | 115 +++++++++++++++
 .../sysv/linux/loongarch/sigcontextinfo.h     |  31 ++++
 .../unix/sysv/linux/loongarch/swapcontext.S   | 123 ++++++++++++++++
 .../unix/sysv/linux/loongarch/sys/procfs.h    | 133 ++++++++++++++++++
 .../unix/sysv/linux/loongarch/sys/ucontext.h  |  80 +++++++++++
 sysdeps/unix/sysv/linux/loongarch/sys/user.h  |  31 ++++
 .../sysv/linux/loongarch/ucontext-macros.h    |  42 ++++++
 .../unix/sysv/linux/loongarch/ucontext_i.sym  |  33 +++++
 19 files changed, 1120 insertions(+)
 create mode 100644 sysdeps/loongarch/dl-irel.h
 create mode 100644 sysdeps/loongarch/libc-start.h
 create mode 100644 sysdeps/loongarch/nptl/bits/struct_rwlock.h
 create mode 100644 sysdeps/loongarch/nptl/pthread-offsets.h
 create mode 100644 sysdeps/loongarch/nptl/pthreaddef.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/mman.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/sigcontext.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/getcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/makecontext.c
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/register-dump.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/setcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/swapcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/procfs.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/user.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym
  

Comments

Joseph Myers Aug. 19, 2021, 4:47 p.m. UTC | #1
On Thu, 19 Aug 2021, Paul Hua via Libc-alpha wrote:

> diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/mman.h

The definitions here look exactly like those in 
bits/mman-map-flags-generic.h.  So you shouldn't need this file at all.

> diff --git a/sysdeps/unix/sysv/linux/loongarch/sys/procfs.h

You shouldn't have an architecture-specific version of this file.  
Everything architecture-specific should be in bits/ headers instead.  See 
my commit

commit d62f9ec0cce26a275ec68f4564814041a33395b1
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Tue Sep 25 16:50:30 2018 +0000

    Complete sys/procfs.h unification.

and prior commits in that series for more details (and generally check 
glibc history for any changes unifying architecture-specific files, since 
whenever you started work on the port, in order to find any other such 
cases where you have no-longer-appropriate architecture-specific files).
  

Patch

diff --git a/sysdeps/loongarch/dl-irel.h b/sysdeps/loongarch/dl-irel.h
new file mode 100644
index 0000000000..852f6505b5
--- /dev/null
+++ b/sysdeps/loongarch/dl-irel.h
@@ -0,0 +1,48 @@ 
+/* Machine-dependent ELF indirect relocation inline functions.  LoongArch
+   version.  Copyright (C) 2021 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_IREL_H
+#define _DL_IREL_H
+
+#include <stdio.h>
+#include <unistd.h>
+
+#define ELF_MACHINE_IRELA 1
+
+static inline ElfW (Addr) __attribute ((always_inline))
+elf_ifunc_invoke (ElfW (Addr) addr)
+{
+  return ((ElfW (Addr) (*) (void)) (addr)) ();
+}
+
+static inline void __attribute ((always_inline))
+elf_irela (const ElfW (Rela) * reloc)
+{
+  ElfW (Addr) *const reloc_addr = (void *) reloc->r_offset;
+  const unsigned long int r_type = ELFW (R_TYPE) (reloc->r_info);
+
+  if (__glibc_likely (r_type == R_LARCH_IRELATIVE))
+    {
+      ElfW (Addr) value = elf_ifunc_invoke (reloc->r_addend);
+      *reloc_addr = value;
+    }
+  else
+    __libc_fatal ("Unexpected reloc type in static binary.\n");
+}
+
+#endif /* dl-irel.h */
diff --git a/sysdeps/loongarch/libc-start.h b/sysdeps/loongarch/libc-start.h
new file mode 100644
index 0000000000..961d0b4d76
--- /dev/null
+++ b/sysdeps/loongarch/libc-start.h
@@ -0,0 +1,25 @@ 
+/* LoongArch definitions for libc main startup.
+   Copyright (C) 2021 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 SHARED
+#define ARCH_SETUP_IREL()
+#define ARCH_APPLY_IREL() apply_irel ()
+#ifndef ARCH_SETUP_TLS
+#define ARCH_SETUP_TLS() __libc_setup_tls ()
+#endif
+#endif /* !SHARED */
diff --git a/sysdeps/loongarch/nptl/bits/struct_rwlock.h
b/sysdeps/loongarch/nptl/bits/struct_rwlock.h
new file mode 100644
index 0000000000..12b6a469bd
--- /dev/null
+++ b/sysdeps/loongarch/nptl/bits/struct_rwlock.h
@@ -0,0 +1,44 @@ 
+/* LoongArch internal rwlock struct definitions.
+   Copyright (C) 2021 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 _RWLOCK_INTERNAL_H
+#define _RWLOCK_INTERNAL_H
+
+/* There is a lot of padding in this structure.  While it's not strictly
+   necessary on LoongArch, we're going to leave it in to be on the safe side in
+   case it's needed in the future.  Most other architectures have the padding,
+   so this gives us the same extensibility as everyone else has.  */
+struct __pthread_rwlock_arch_t
+{
+  unsigned int __readers;
+  unsigned int __writers;
+  unsigned int __wrphase_futex;
+  unsigned int __writers_futex;
+  unsigned int __pad3;
+  unsigned int __pad4;
+  int __cur_writer;
+  int __shared;
+  unsigned long int __pad1;
+  unsigned long int __pad2;
+  unsigned int __flags;
+};
+
+#define __PTHREAD_RWLOCK_INITIALIZER(__flags) \
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags
+
+#endif
diff --git a/sysdeps/loongarch/nptl/pthread-offsets.h
b/sysdeps/loongarch/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..415c3c113f
--- /dev/null
+++ b/sysdeps/loongarch/nptl/pthread-offsets.h
@@ -0,0 +1,15 @@ 
+#if __WORDSIZE == 64
+#define __PTHREAD_MUTEX_KIND_OFFSET 16
+#else
+#define __PTHREAD_MUTEX_KIND_OFFSET 12
+#endif
+
+#if __WORDSIZE == 64
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 48
+#else
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 27
+#else
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 24
+#endif
+#endif
diff --git a/sysdeps/loongarch/nptl/pthreaddef.h
b/sysdeps/loongarch/nptl/pthreaddef.h
new file mode 100644
index 0000000000..954b184f5c
--- /dev/null
+++ b/sysdeps/loongarch/nptl/pthreaddef.h
@@ -0,0 +1,35 @@ 
+/* pthread machine parameter definitions,  LoongArch version.
+   Copyright (C) 2021 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/>.  */
+
+/* Default stack size.  */
+#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
+
+/* Minimum guard size.  */
+#define ARCH_MIN_GUARD_SIZE 0
+
+/* Required stack pointer alignment at beginning.  */
+#define STACK_ALIGN 16
+
+/* Minimal stack size after allocating thread descriptor and guard size.  */
+#define MINIMAL_REST_STACK 2048
+
+/* Alignment requirement for TCB.  */
+#define TCB_ALIGNMENT 16
+
+/* Location of current stack frame.  */
+#define CURRENT_STACK_FRAME __builtin_frame_address (0)
diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
b/sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
new file mode 100644
index 0000000000..a39985e1a7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
@@ -0,0 +1,61 @@ 
+/* O_*, F_*, FD_* bit values for the generic Linux/LoongArch ABI.
+   Copyright (C) 2021 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 _FCNTL_H
+#error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
+#endif
+
+#include <bits/wordsize.h>
+
+/* In 64-bit ISA files are always with 64bit off_t and F_*LK64 are the same as
+   non-64-bit versions.  It will need to be revised for 128-bit.  */
+#if __WORDSIZE == 64
+#define __O_LARGEFILE 0
+
+#define F_GETLK64 5  /* Get record locking info.  */
+#define F_SETLK64 6  /* Set record locking info (non-blocking).  */
+#define F_SETLKW64 7 /* Set record locking info (blocking).  */
+#endif
+
+struct flock
+{
+  short int l_type;   /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */
+  short int l_whence; /* Where `l_start' is relative to (like `lseek').  */
+#ifndef __USE_FILE_OFFSET64
+  __off_t l_start; /* Offset where the lock begins.  */
+  __off_t l_len;   /* Size of the locked area; zero means until EOF.  */
+#else
+  __off64_t l_start; /* Offset where the lock begins.  */
+  __off64_t l_len;   /* Size of the locked area; zero means until EOF.  */
+#endif
+  __pid_t l_pid; /* Process holding the lock.  */
+};
+
+#ifdef __USE_LARGEFILE64
+struct flock64
+{
+  short int l_type;   /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */
+  short int l_whence; /* Where `l_start' is relative to (like `lseek').  */
+  __off64_t l_start;  /* Offset where the lock begins.  */
+  __off64_t l_len;    /* Size of the locked area; zero means until EOF.  */
+  __pid_t l_pid;      /* Process holding the lock.  */
+};
+#endif
+
+/* Include generic Linux declarations.  */
+#include <bits/fcntl-linux.h>
diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/mman.h
b/sysdeps/unix/sysv/linux/loongarch/bits/mman.h
new file mode 100644
index 0000000000..de718e69ec
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/bits/mman.h
@@ -0,0 +1,42 @@ 
+/* Definitions for POSIX memory map interface.  Linux/LoongArch version.
+   Copyright (C) 2021 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 _SYS_MMAN_H
+#error "Never use <bits/mman.h> directly; include <sys/mman.h> instead."
+#endif
+
+#ifdef __USE_MISC
+#define MAP_GROWSDOWN 0x00100  /* Stack-like segment.  */
+#define MAP_DENYWRITE 0x00800  /* ETXTBSY.  */
+#define MAP_EXECUTABLE 0x01000 /* Mark it as an executable.  */
+#define MAP_LOCKED 0x02000     /* Lock the mapping.  */
+#define MAP_NORESERVE 0x04000  /* Don't check for reservations.  */
+#define MAP_POPULATE 0x08000   /* Populate (prefault) pagetables.  */
+#define MAP_NONBLOCK 0x10000   /* Do not block on IO.  */
+#define MAP_STACK 0x20000      /* Allocation is for a stack.  */
+#define MAP_HUGETLB 0x40000    /* Create huge page mapping.  */
+#define MAP_SYNC \
+  0x80000 /* Perform synchronous page \
+      faults for the mapping.  */
+#define MAP_FIXED_NOREPLACE \
+  0x100000 /* MAP_FIXED but do not unmap \
+       underlying mapping.  */
+#endif
+
+/* Include generic Linux declarations.  */
+#include <bits/mman-linux.h>
diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/sigcontext.h
b/sysdeps/unix/sysv/linux/loongarch/bits/sigcontext.h
new file mode 100644
index 0000000000..124bda8f15
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/bits/sigcontext.h
@@ -0,0 +1,49 @@ 
+/* Copyright (C) 2021 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 _BITS_SIGCONTEXT_H
+#define _BITS_SIGCONTEXT_H
+
+/*
+ * Keep this struct definition in sync with the sigcontext fragment
+ * in arch/loongarch/kernel/asm-offsets.c
+ */
+
+#define FPU_REG_WIDTH 256
+#define FPU_ALIGN __attribute__ ((aligned (32)))
+
+struct sigcontext
+{
+  unsigned long long sc_pc;
+  unsigned long long sc_regs[32];
+  unsigned int sc_flags;
+
+  unsigned int sc_fcsr;
+  unsigned int sc_vcsr;
+  unsigned long long sc_fcc;
+
+  unsigned long long sc_scr[4];
+
+  union
+  {
+    unsigned int val32[FPU_REG_WIDTH / 32];
+    unsigned long long val64[FPU_REG_WIDTH / 64];
+  } sc_fpregs[32] FPU_ALIGN;
+  unsigned char sc_reserved[4096] __attribute__ ((__aligned__ (16)));
+};
+
+#endif /* _BITS_SIGCONTEXT_H */
diff --git a/sysdeps/unix/sysv/linux/loongarch/getcontext.S
b/sysdeps/unix/sysv/linux/loongarch/getcontext.S
new file mode 100644
index 0000000000..3a64857a42
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/getcontext.S
@@ -0,0 +1,74 @@ 
+/* Save current context.
+   Copyright (C) 2021 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 "ucontext-macros.h"
+
+/* int getcontext (ucontext_t *ucp) */
+
+ .text
+LEAF (__getcontext)
+ SAVE_INT_REG (ra,   1, a0)
+ SAVE_INT_REG (sp,   3, a0)
+ SAVE_INT_REG (zero, 4, a0) /* return 0 by overwriting a0.  */
+ SAVE_INT_REG (x,   21, a0)
+ SAVE_INT_REG (fp,  22, a0)
+ SAVE_INT_REG (s0,  23, a0)
+ SAVE_INT_REG (s1,  24, a0)
+ SAVE_INT_REG (s2,  25, a0)
+ SAVE_INT_REG (s3,  26, a0)
+ SAVE_INT_REG (s4,  27, a0)
+ SAVE_INT_REG (s5,  28, a0)
+ SAVE_INT_REG (s6,  29, a0)
+ SAVE_INT_REG (s7,  30, a0)
+ SAVE_INT_REG (s8,  31, a0)
+ st.d ra, a0, MCONTEXT_PC
+
+#ifndef __loongarch_soft_float
+ movfcsr2gr a1, $r0
+
+ SAVE_FP_REG (fs0,  24, a0)
+ SAVE_FP_REG (fs1,  25, a0)
+ SAVE_FP_REG (fs2,  26, a0)
+ SAVE_FP_REG (fs3,  27, a0)
+ SAVE_FP_REG (fs4,  28, a0)
+ SAVE_FP_REG (fs5,  29, a0)
+ SAVE_FP_REG (fs6,  30, a0)
+ SAVE_FP_REG (fs7,  31, a0)
+
+ st.w a1, a0, MCONTEXT_FCSR
+#endif /* __loongarch_soft_float */
+
+/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */
+ li.d a3, _NSIG8
+ li.d a2, UCONTEXT_SIGMASK
+ add.d a2, a2, a0
+ ori a1, zero,0
+ li.d a0, SIG_BLOCK
+
+ li.d a7, SYS_ify (rt_sigprocmask)
+ syscall 0
+ blt a0, zero, 99f
+
+ jirl $r0, $r1, 0
+
+99:
+ b __syscall_error
+
+PSEUDO_END (__getcontext)
+
+weak_alias (__getcontext, getcontext)
diff --git a/sysdeps/unix/sysv/linux/loongarch/makecontext.c
b/sysdeps/unix/sysv/linux/loongarch/makecontext.c
new file mode 100644
index 0000000000..36c84ef3c6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/makecontext.c
@@ -0,0 +1,78 @@ 
+/* Copyright (C) 2021 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 <sys/asm.h>
+#include <sys/ucontext.h>
+#include <stdarg.h>
+#include <assert.h>
+
+void
+__makecontext (ucontext_t *ucp, void (*func) (void), int argc, long int a0,
+        long int a1, long int a2, long int a3, long int a4, ...)
+{
+  extern void __start_context (void) attribute_hidden;
+  long int i, sp;
+
+  _Static_assert(LARCH_REG_NARGS == 8,
+ "__makecontext assumes 8 argument registers");
+
+  /* Set up the stack.  */
+  sp = ((long int) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size) & ALMASK;
+
+  /* Set up the register context.
+     ra = s0 = 0, terminating the stack for backtracing purposes.
+     s1 = the function we must call.
+     s2 = the subsequent context to run.  */
+  ucp->uc_mcontext.__gregs[LARCH_REG_RA] = 0;
+  ucp->uc_mcontext.__gregs[LARCH_REG_S0] = 0;
+  ucp->uc_mcontext.__gregs[LARCH_REG_S1] = (long int) func;
+  ucp->uc_mcontext.__gregs[LARCH_REG_S2] = (long int) ucp->uc_link;
+  ucp->uc_mcontext.__gregs[LARCH_REG_SP] = sp;
+  ucp->uc_mcontext.__pc = (long int) &__start_context;
+
+  /* Put args in a0-a7, then put any remaining args on the stack.  */
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 0] = a0;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 1] = a1;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 2] = a2;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 3] = a3;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 4] = a4;
+
+  if (__glibc_unlikely (argc > 5))
+    {
+      va_list vl;
+      va_start (vl, a4);
+
+      long reg_args = argc < LARCH_REG_NARGS ? argc : LARCH_REG_NARGS;
+      for (i = 5; i < reg_args; i++)
+ ucp->uc_mcontext.__gregs[LARCH_REG_A0 + i] = va_arg (vl, long);
+
+      long int stack_args = argc - reg_args;
+      if (stack_args > 0)
+ {
+   sp = (sp - stack_args * sizeof (long int)) & ALMASK;
+   ucp->uc_mcontext.__gregs[LARCH_REG_SP] = sp;
+   for (i = 0; i < stack_args; i++)
+     ((long int *) sp)[i] = va_arg (vl, long int);
+ }
+
+      va_end (vl);
+    }
+}
+
+weak_alias (__makecontext, makecontext)
diff --git a/sysdeps/unix/sysv/linux/loongarch/register-dump.h
b/sysdeps/unix/sysv/linux/loongarch/register-dump.h
new file mode 100644
index 0000000000..9000fc3184
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/register-dump.h
@@ -0,0 +1,61 @@ 
+/* Dump registers.
+   Copyright (C) 2021 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 <unistd.h>
+#include <string.h>
+#include <_itoa.h>
+
+static void
+hexvalue (unsigned long int value, char *buf, size_t len)
+{
+  char *cp = _itoa_word (value, buf + len, 16, 0);
+  while (cp > buf)
+    *--cp = '0';
+}
+
+#define REGDUMP_NREGS 32
+#define REGDUMP_PER_LINE (80 / (__WORDSIZE / 4 + 4))
+
+static void
+register_dump (int fd, ucontext_t *ctx)
+{
+  int i;
+  char regvalue[__WORDSIZE / 4 + 1];
+  char str[82 * ((REGDUMP_NREGS + REGDUMP_PER_LINE - 1) / REGDUMP_PER_LINE)];
+
+  static const char names[REGDUMP_NREGS][4]
+    = {"pc", "ra", "tp", "sp", "a0", "a1", "a2", "a3", "a4", "a5", "a6",
+       "a7", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "x",
+       "fp", "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8"};
+
+  str[0] = 0;
+  for (i = 0; i < REGDUMP_NREGS; i++)
+    {
+      strcat (str, names[i]);
+      strcat (str, " ");
+      hexvalue (ctx->uc_mcontext.__gregs[i], regvalue, __WORDSIZE / 4);
+      strcat (str, regvalue);
+
+      if ((i + 1) % REGDUMP_PER_LINE == 0)
+ strcat (str, "\n");
+    }
+
+  write (fd, str, strlen (str));
+}
+
+#define REGISTER_DUMP register_dump (fd, ctx)
diff --git a/sysdeps/unix/sysv/linux/loongarch/setcontext.S
b/sysdeps/unix/sysv/linux/loongarch/setcontext.S
new file mode 100644
index 0000000000..0070829261
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/setcontext.S
@@ -0,0 +1,115 @@ 
+/* Set current context.
+   Copyright (C) 2021 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 "sys/regdef.h"
+#include "ucontext-macros.h"
+
+/*  int __setcontext (const ucontext_t *ucp)
+
+  Restores the machine context in UCP and thereby resumes execution
+  in that context.
+
+  This implementation is intended to be used for *synchronous* context
+  switches only.  Therefore, it does not have to restore anything
+  other than the PRESERVED state.  */
+
+ .text
+LEAF (__setcontext)
+
+ addi.d sp, sp, -16
+ st.d a0, sp, 0 /* Save ucp to stack */
+
+/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */
+ li.d a3, _NSIG8
+ li.d a2, 0
+ li.d a1, UCONTEXT_SIGMASK
+ add.d a1, a1, a0
+ li.d a0, SIG_SETMASK
+
+ li.d a7, SYS_ify (rt_sigprocmask)
+ syscall 0
+
+ blt a0, $r0, 99f
+
+ ld.d t0, sp, 0 /* Load ucp to t0 */
+ cfi_def_cfa (12, 0)
+
+#ifndef __loongarch_soft_float
+ ld.w t1, t0, MCONTEXT_FCSR
+
+ RESTORE_FP_REG(fs0,  24, t0)
+ RESTORE_FP_REG(fs1,  25, t0)
+ RESTORE_FP_REG(fs2,  26, t0)
+ RESTORE_FP_REG(fs3,  27, t0)
+ RESTORE_FP_REG(fs4,  28, t0)
+ RESTORE_FP_REG(fs5,  29, t0)
+ RESTORE_FP_REG(fs6,  30, t0)
+ RESTORE_FP_REG(fs7,  31, t0)
+
+ movgr2fcsr $r0, t1
+#endif /* __loongarch_soft_float */
+
+/* Note the contents of argument registers will be random
+   unless makecontext() has been called.  */
+ RESTORE_INT_REG(ra,   1, t0)
+ RESTORE_INT_REG(sp,   3, t0)
+ RESTORE_INT_REG(a0,   4, t0)
+ RESTORE_INT_REG(a1,   5, t0)
+ RESTORE_INT_REG(a2,   6, t0)
+ RESTORE_INT_REG(a3,   7, t0)
+ RESTORE_INT_REG(a4,   8, t0)
+ RESTORE_INT_REG(a5,   9, t0)
+ RESTORE_INT_REG(a6,  10, t0)
+ RESTORE_INT_REG(a7,  11, t0)
+ RESTORE_INT_REG(x,   21, t0)
+ RESTORE_INT_REG(fp,  22, t0)
+ RESTORE_INT_REG(s0,  23, t0)
+ RESTORE_INT_REG(s1,  24, t0)
+ RESTORE_INT_REG(s2,  25, t0)
+ RESTORE_INT_REG(s3,  26, t0)
+ RESTORE_INT_REG(s4,  27, t0)
+ RESTORE_INT_REG(s5,  28, t0)
+ RESTORE_INT_REG(s6,  29, t0)
+ RESTORE_INT_REG(s7,  30, t0)
+ RESTORE_INT_REG(s8,  31, t0)
+
+ ld.d t1, t0, MCONTEXT_PC
+ jirl $r0,t1,0
+
+99:
+ addi.d sp, sp, 16
+ b __syscall_error
+
+PSEUDO_END (__setcontext)
+weak_alias (__setcontext, setcontext)
+
+LEAF (__start_context)
+
+ /* Terminate call stack by noting ra == 0.  Happily, s0 == 0 here.  */
+ cfi_register (1, 23)
+
+ /* Call the function passed to makecontext.  */
+ jirl $r1,s1,0
+
+ /* Invoke subsequent context if present, else exit(0).  */
+ ori a0, s2, 0
+ beqz s2, 1f
+ bl __setcontext
+1:
+ b exit
+
+PSEUDO_END (__start_context)
diff --git a/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
b/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
new file mode 100644
index 0000000000..c593dc0c52
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
@@ -0,0 +1,31 @@ 
+/* Copyright (C) 2021 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 _SIGCONTEXTINFO_H
+#define _SIGCONTEXTINFO_H
+
+#include <stdint.h>
+#include <sys/ucontext.h>
+
+static inline uintptr_t
+sigcontext_get_pc (const ucontext_t *ctx)
+{
+  return ctx->uc_mcontext.__pc;
+}
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/loongarch/swapcontext.S
b/sysdeps/unix/sysv/linux/loongarch/swapcontext.S
new file mode 100644
index 0000000000..1f6e3d815a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/swapcontext.S
@@ -0,0 +1,123 @@ 
+/* Save and set current context.
+   Copyright (C) 2021 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 "ucontext-macros.h"
+
+/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp) */
+
+LEAF (__swapcontext)
+ ori a2, sp, 0 /* Save sp to a2 */
+ addi.d sp, sp, -16
+ st.d a1, sp, 0
+ ori t0, a1, 0
+
+ SAVE_INT_REG (ra,   1, a0)
+ SAVE_INT_REG (a2,   3, a0) /* Store sp */
+ SAVE_INT_REG (zero, 4, a0) /* return 0 by overwriting a0 */
+ SAVE_INT_REG (x,   21, a0)
+ SAVE_INT_REG (fp,  22, a0)
+ SAVE_INT_REG (s0,  23, a0)
+ SAVE_INT_REG (s1,  24, a0)
+ SAVE_INT_REG (s2,  25, a0)
+ SAVE_INT_REG (s3,  26, a0)
+ SAVE_INT_REG (s4,  27, a0)
+ SAVE_INT_REG (s5,  28, a0)
+ SAVE_INT_REG (s6,  29, a0)
+ SAVE_INT_REG (s7,  30, a0)
+ SAVE_INT_REG (s8,  31, a0)
+
+ st.d ra, a0, MCONTEXT_PC
+#ifndef __loongarch_soft_float
+ movfcsr2gr a1, $r0
+
+ SAVE_FP_REG (fs0,  24, a0)
+ SAVE_FP_REG (fs1,  25, a0)
+ SAVE_FP_REG (fs2,  26, a0)
+ SAVE_FP_REG (fs3,  27, a0)
+ SAVE_FP_REG (fs4,  28, a0)
+ SAVE_FP_REG (fs5,  29, a0)
+ SAVE_FP_REG (fs6,  30, a0)
+ SAVE_FP_REG (fs7,  31, a0)
+
+ st.w a1, a0, MCONTEXT_FCSR
+#endif /* __loongarch_soft_float */
+
+/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, _NSIG8) */
+ li.d a3, _NSIG8
+ li.d a2, UCONTEXT_SIGMASK
+ add.d a2, a2, a0
+ li.d a1, UCONTEXT_SIGMASK
+ add.d a1, a1, t0
+ li.d a0, SIG_SETMASK
+
+ li.d a7, SYS_ify (rt_sigprocmask)
+ syscall 0
+
+ blt a0, zero, 99f
+
+#ifndef __loongarch_soft_float
+ ld.d t0, sp, 0 /* Load a1 to t0 */
+ ld.w t1, t0, MCONTEXT_FCSR
+
+ RESTORE_FP_REG (fs0,  24, t0)
+ RESTORE_FP_REG (fs1,  25, t0)
+ RESTORE_FP_REG (fs2,  26, t0)
+ RESTORE_FP_REG (fs3,  27, t0)
+ RESTORE_FP_REG (fs4,  28, t0)
+ RESTORE_FP_REG (fs5,  29, t0)
+ RESTORE_FP_REG (fs6,  30, t0)
+ RESTORE_FP_REG (fs7,  31, t0)
+
+ movgr2fcsr $r0, t1
+#endif /* __loongarch_soft_float */
+
+/* Note the contents of argument registers will be random
+   unless makecontext() has been called.  */
+ RESTORE_INT_REG (ra,   1, t0)
+ RESTORE_INT_REG (sp,   3, t0)
+ RESTORE_INT_REG (a0,   4, t0)
+ RESTORE_INT_REG (a1,   5, t0)
+ RESTORE_INT_REG (a2,   6, t0)
+ RESTORE_INT_REG (a3,   7, t0)
+ RESTORE_INT_REG (a4,   8, t0)
+ RESTORE_INT_REG (a5,   9, t0)
+ RESTORE_INT_REG (a6,  10, t0)
+ RESTORE_INT_REG (a7,  11, t0)
+ RESTORE_INT_REG (x,   21, t0)
+ RESTORE_INT_REG (fp,  22, t0)
+ RESTORE_INT_REG (s0,  23, t0)
+ RESTORE_INT_REG (s1,  24, t0)
+ RESTORE_INT_REG (s2,  25, t0)
+ RESTORE_INT_REG (s3,  26, t0)
+ RESTORE_INT_REG (s4,  27, t0)
+ RESTORE_INT_REG (s5,  28, t0)
+ RESTORE_INT_REG (s6,  29, t0)
+ RESTORE_INT_REG (s7,  30, t0)
+ RESTORE_INT_REG (s8,  31, t0)
+
+ ld.d t1, t0, MCONTEXT_PC
+ jirl $r0, t1, 0
+
+
+99:
+ addi.d sp, sp, 16
+ b __syscall_error
+
+PSEUDO_END (__swapcontext)
+
+weak_alias (__swapcontext, swapcontext)
diff --git a/sysdeps/unix/sysv/linux/loongarch/sys/procfs.h
b/sysdeps/unix/sysv/linux/loongarch/sys/procfs.h
new file mode 100644
index 0000000000..72c3376148
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sys/procfs.h
@@ -0,0 +1,133 @@ 
+/* Copyright (C) 2021 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 _SYS_PROCFS_H
+#define _SYS_PROCFS_H 1
+
+/* This is somehow modelled after the file of the same name on SysVr4
+   systems.  It provides a definition of the core file format for ELF
+   used on Linux.  */
+
+#include <features.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/user.h>
+#include <sys/ucontext.h>
+
+__BEGIN_DECLS
+
+/* Type for a general-purpose register.  */
+typedef uint64_t elf_greg_t;
+
+/* And the whole bunch of them.  We could have used `struct
+   pt_regs' directly in the typedef, but tradition says that
+   the register set is an array, which does have some peculiar
+   semantics, so leave it that way.  */
+#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t))
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+#define ELF_NFPREG 34 /* 32 FPRs + 8-byte byte-vec for fcc + 4-byte FCR */
+typedef union
+{
+  double d;
+  float f;
+} elf_fpreg_t;
+typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+
+typedef union
+{
+  double d[2];
+  float f[4];
+} __attribute__ ((__aligned__ (16))) elf_lsxregset_t[32];
+typedef union
+{
+  double d[4];
+  float f[8];
+} __attribute__ ((__aligned__ (32))) elf_lasxregset_t[32];
+
+struct elf_siginfo
+{
+  int si_signo; /* Signal number.  */
+  int si_code; /* Extra code.  */
+  int si_errno; /* Errno.  */
+};
+
+/* Definitions to generate Intel SVR4-like core files.  These mostly
+   have the same names as the SVR4 types with "elf_" tacked on the
+   front to prevent clashes with linux definitions, and the typedef
+   forms have been avoided.  This is mostly like the SVR4 structure,
+   but more Linuxy, with things that Linux does not support and which
+   gdb doesn't really use excluded.  Fields present but not used are
+   marked with "XXX".  */
+struct elf_prstatus
+{
+  struct elf_siginfo pr_info; /* Info associated with signal.  */
+  short int pr_cursig; /* Current signal.  */
+  unsigned long int pr_sigpend; /* Set of pending signals.  */
+  unsigned long int pr_sighold; /* Set of held signals.  */
+  __pid_t pr_pid;
+  __pid_t pr_ppid;
+  __pid_t pr_pgrp;
+  __pid_t pr_sid;
+  struct timeval pr_utime;  /* User time.  */
+  struct timeval pr_stime;  /* System time.  */
+  struct timeval pr_cutime; /* Cumulative user time.  */
+  struct timeval pr_cstime; /* Cumulative system time.  */
+  elf_gregset_t pr_reg;     /* GP registers.  */
+  int pr_fpvalid;     /* True if math copro being used.  */
+};
+
+#define ELF_PRARGSZ (80) /* Number of chars for args */
+
+struct elf_prpsinfo
+{
+  char pr_state;      /* Numeric process state.  */
+  char pr_sname;      /* Char for pr_state.  */
+  char pr_zomb;      /* Zombie.  */
+  char pr_nice;      /* Nice val.  */
+  unsigned long int pr_flag; /* Flags.  */
+  unsigned int pr_uid;
+  unsigned int pr_gid;
+  int pr_pid, pr_ppid, pr_pgrp, pr_sid;
+  /* Lots missing */
+  char pr_fname[16];        /* Filename of executable.  */
+  char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list.  */
+};
+
+/* The rest of this file provides the types for emulation of the
+   Solaris <proc_service.h> interfaces that should be implemented by
+   users of libthread_db.  */
+
+/* Addresses.  */
+typedef void *psaddr_t;
+
+/* Register sets.  Linux has different names.  */
+typedef elf_gregset_t prgregset_t;
+typedef elf_fpregset_t prfpregset_t;
+
+/* We don't have any differences between processes and threads,
+   therefore habe only ine PID type.  */
+typedef __pid_t lwpid_t;
+
+/* Process status and info.  In the end we do provide typedefs for them.  */
+typedef struct elf_prstatus prstatus_t;
+typedef struct elf_prpsinfo prpsinfo_t;
+
+__END_DECLS
+
+#endif /* sys/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
new file mode 100644
index 0000000000..5cb13c1f88
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
@@ -0,0 +1,80 @@ 
+/* Copyright (C) 2021 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/>.  */
+
+/* Don't rely on this, the interface is currently messed up and may need to
+   be broken to be fixed.  */
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+
+#include <bits/types/sigset_t.h>
+#include <bits/types/stack_t.h>
+
+typedef unsigned long int __loongarch_mc_gp_state[32];
+
+#ifdef __USE_MISC
+#define LARCH_NGREG 32
+
+#define LARCH_REG_RA 1
+#define LARCH_REG_SP 3
+#define LARCH_REG_S0 23
+#define LARCH_REG_S1 24
+#define LARCH_REG_A0 4
+#define LARCH_REG_S2 25
+#define LARCH_REG_NARGS 8
+
+typedef unsigned long int greg_t;
+
+/* Container for all general registers.  */
+typedef __loongarch_mc_gp_state gregset_t;
+
+/* Container for floating-point state.  */
+typedef union __loongarch_mc_fp_state fpregset_t;
+#endif
+
+union __loongarch_mc_fp_state
+{
+  unsigned int __val32[256 / 32];
+  unsigned long long __val64[256 / 64];
+};
+
+typedef struct mcontext_t
+{
+  unsigned long long __pc;
+  unsigned long long __gregs[32];
+  unsigned int __flags;
+
+  unsigned int __fcsr;
+  unsigned int __vcsr;
+  unsigned long long __fcc;
+  unsigned long long __scr[4];
+  union __loongarch_mc_fp_state __fpregs[32] __attribute__
((__aligned__ (32)));
+} mcontext_t;
+
+/* Userlevel context.  */
+typedef struct ucontext_t
+{
+  unsigned long int __uc_flags;
+  struct ucontext_t *uc_link;
+  stack_t uc_stack;
+  sigset_t uc_sigmask;
+  mcontext_t uc_mcontext;
+} ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/loongarch/sys/user.h
b/sysdeps/unix/sysv/linux/loongarch/sys/user.h
new file mode 100644
index 0000000000..a0bc549bf9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sys/user.h
@@ -0,0 +1,31 @@ 
+/* Copyright (C) 2021 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 _SYS_USER_H
+#define _SYS_USER_H 1
+
+#include <stdint.h>
+
+struct user_regs_struct
+{
+  uint64_t gpr[32];
+  uint64_t pc;
+  uint64_t badvaddr;
+  uint64_t reserved[11];
+};
+
+#endif /* _SYS_USER_H */
diff --git a/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
b/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
new file mode 100644
index 0000000000..2a8d70fee6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
@@ -0,0 +1,42 @@ 
+/* Macros for ucontext routines.
+   Copyright (C) 2021 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 _LINUX_LOONGARCH_UCONTEXT_MACROS_H
+#define _LINUX_LOONGARCH_UCONTEXT_MACROS_H
+
+#include <sysdep.h>
+#include <sys/asm.h>
+
+#include "ucontext_i.h"
+
+#define SAVE_FP_REG(name, num, base) \
+  FREG_S name, base, ((num) *SZFREG + MCONTEXT_FPREGS)
+
+#define RESTORE_FP_REG(name, num, base) \
+  FREG_L name, base, ((num) *SZFREG + MCONTEXT_FPREGS)
+
+#define SAVE_INT_REG(name, num, base) \
+  REG_S name, base, ((num) *SZREG + MCONTEXT_GREGS)
+
+#define RESTORE_INT_REG(name, num, base) \
+  REG_L name, base, ((num) *SZREG + MCONTEXT_GREGS)
+
+#define SAVE_REG(name, offset, base) REG_S name, base, (offset)
+
+#define RESTORE_REG(name, offset, base) REG_L name, base, (offset)
+#endif /* _LINUX_LOONGARCH_UCONTEXT_MACROS_H */
diff --git a/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym
b/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym
new file mode 100644
index 0000000000..d7f612fea2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym
@@ -0,0 +1,33 @@ 
+#include <inttypes.h>
+#include <signal.h>
+#include <stddef.h>
+#include <sys/ucontext.h>
+
+-- Constants used by the rt_sigprocmask call.
+
+SIG_BLOCK
+SIG_SETMASK
+
+_NSIG8 (_NSIG / 8)
+
+-- Offsets of the fields in the ucontext_t structure.
+#define ucontext(member) offsetof (ucontext_t, member)
+#define stack(member) ucontext (uc_stack.member)
+#define mcontext(member) ucontext (uc_mcontext.member)
+
+UCONTEXT_FLAGS ucontext (__uc_flags)
+UCONTEXT_LINK ucontext (uc_link)
+UCONTEXT_STACK ucontext (uc_stack)
+UCONTEXT_MCONTEXT ucontext (uc_mcontext)
+UCONTEXT_SIGMASK ucontext (uc_sigmask)
+
+STACK_SP stack (ss_sp)
+STACK_SIZE stack (ss_size)
+STACK_FLAGS stack (ss_flags)
+
+MCONTEXT_PC mcontext (__pc)
+MCONTEXT_FCSR mcontext (__fcsr)
+MCONTEXT_GREGS mcontext (__gregs)
+MCONTEXT_FPREGS mcontext (__fpregs)
+
+UCONTEXT_SIZE sizeof (ucontext_t)