Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

loongarch: add loongarch64 support for proot #382

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion src/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ typedef unsigned char byte_t;
#define OFFSETOF_STATX_UID 20
#define OFFSETOF_STATX_GID 24

#if !defined(ARCH_X86_64) && !defined(ARCH_ARM_EABI) && !defined(ARCH_X86) && !defined(ARCH_SH4)
#if !defined(ARCH_X86_64) && !defined(ARCH_ARM_EABI) && !defined(ARCH_X86) && !defined(ARCH_SH4) && !defined(ARCH_LOONGARCH64)
# if defined(__x86_64__)
# define ARCH_X86_64 1
# elif defined(__ARM_EABI__)
Expand All @@ -51,6 +51,8 @@ typedef unsigned char byte_t;
# define ARCH_X86 1
# elif defined(__SH4__)
# define ARCH_SH4 1
# elif defined(__loongarch_lp64)
# define ARCH_LOONGARCH64 1
# else
# error "Unsupported architecture"
# endif
Expand Down Expand Up @@ -170,6 +172,24 @@ typedef unsigned char byte_t;
#define OFFSETOF_STAT_GID_32 0
#define NO_MISALIGNED_ACCESS 1

#elif defined(ARCH_LOONGARCH64)

#define SYSNUMS_HEADER1 "syscall/sysnums-loongarch64.h"
#define SYSNUMS_ABI1 sysnums_loongarch64

#define SYSTRAP_SIZE 4

#define SECCOMP_ARCHS { { .value = AUDIT_ARCH_LOONGARCH64, .nb_abis = 1, .abis = { ABI_DEFAULT } } }

#define HOST_ELF_MACHINE {258, 0};
#define RED_ZONE_SIZE 0
#define OFFSETOF_STAT_UID_32 0
#define OFFSETOF_STAT_GID_32 0

#define LOADER_ADDRESS 0x2000000000
#define EXEC_PIC_ADDRESS 0x3000000000
#define INTERP_PIC_ADDRESS 0x3f00000000

#else

#error "Unsupported architecture"
Expand Down
101 changes: 101 additions & 0 deletions src/loader/assembly-loongarch64.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/* -*- c-set-style: "K&R"; c-basic-offset: 8 -*-
*
* This file is part of PRoot.
*
* Copyright (C) 2015 STMicroelectronics
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/

/* According to the LoongArch ABI, all registers have undefined values at
* program startup except:
*
* - the instruction pointer (pc)
* - the stack pointer (sp)
* - the rtld_fini pointer (a0)
*/
#define BRANCH(stack_pointer, destination) do { \
asm volatile ( \
"# Restore initial stack pointer. \n\t" \
"move $sp, %0 \n\t" \
" \n\t" \
"# Clear rtld_fini. \n\t" \
"move $a0, $zero \n\t" \
" \n\t" \
"# Start the program. \n\t" \
"jr %1 \n" \
: /* no output */ \
: "r" (stack_pointer), "r" (destination) \
: "memory", "$sp", "$a0"); \
__builtin_unreachable(); \
} while (0)

#define PREPARE_ARGS_1(arg1_) \
register word_t arg1 asm("$a0") = arg1_; \

#define PREPARE_ARGS_3(arg1_, arg2_, arg3_) \
PREPARE_ARGS_1(arg1_) \
register word_t arg2 asm("$a1") = arg2_; \
register word_t arg3 asm("$a2") = arg3_; \

#define PREPARE_ARGS_4(arg1_, arg2_, arg3_, arg4_) \
PREPARE_ARGS_3(arg1_, arg2_, arg3_) \
register word_t arg4 asm("$a3") = arg4_; \

#define PREPARE_ARGS_6(arg1_, arg2_, arg3_, arg4_, arg5_, arg6_) \
PREPARE_ARGS_4(arg1_, arg2_, arg3_, arg4_) \
register word_t arg5 asm("$a4") = arg5_; \
register word_t arg6 asm("$a5") = arg6_;

#define OUTPUT_CONTRAINTS_1 \
"r" (arg1)

#define OUTPUT_CONTRAINTS_3 \
OUTPUT_CONTRAINTS_1, \
"r" (arg2), "r" (arg3)

#define OUTPUT_CONTRAINTS_4 \
OUTPUT_CONTRAINTS_3, \
"r" (arg4)

#define OUTPUT_CONTRAINTS_6 \
OUTPUT_CONTRAINTS_4, \
"r" (arg5), "r" (arg6)

#define SYSCALL_CLOBBERLIST \
"memory", "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8"

#define SYSCALL(number_, nb_args, args...) \
({ \
register word_t number asm("$a7") = number_; \
register word_t result asm("$a0"); \
PREPARE_ARGS_##nb_args(args) \
asm volatile ( \
"syscall 0 \n\t" \
: "+r" (result) \
: "r" (number), \
OUTPUT_CONTRAINTS_##nb_args \
: SYSCALL_CLOBBERLIST); \
result; \
})

#define OPENAT 56
#define CLOSE 57
#define MMAP 222
#define EXECVE 221
#define EXIT 93
#define PRCTL 167
#define MPROTECT 226
2 changes: 2 additions & 0 deletions src/loader/loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
# include "loader/assembly-x86.h"
#elif defined(ARCH_ARM64)
# include "loader/assembly-arm64.h"
#elif defined(ARCH_LOONGARCH64)
# include "loader/assembly-loongarch64.h"
#else
# error "Unsupported architecture"
#endif
Expand Down
4 changes: 4 additions & 0 deletions src/ptrace/ptrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@
#define user_fpregs_struct user_fpsimd_struct
#endif

#if defined(ARCH_LOONGARCH64)
#define user_fpregs_struct user_fp_struct
#endif

static const char *stringify_ptrace(PTRACE_REQUEST_TYPE request)
{
#define CASE_STR(a) case a: return #a; break;
Expand Down
Loading