Skip to content

Commit

Permalink
loongarch: add loongarch64 support for proot
Browse files Browse the repository at this point in the history
  • Loading branch information
lrzlin committed Apr 15, 2024
1 parent 5f780cb commit c455794
Show file tree
Hide file tree
Showing 7 changed files with 441 additions and 3 deletions.
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
98 changes: 98 additions & 0 deletions src/loader/assembly-loongarch64.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/* -*- 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(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 \
: "memory"); \
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

0 comments on commit c455794

Please sign in to comment.