Skip to content

Update judge_client.cc (feat to support loongarch_lp64) #1079

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

Merged
merged 1 commit into from
Mar 2, 2025
Merged
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
34 changes: 34 additions & 0 deletions trunk/core/judge_client/judge_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,28 @@ struct user_regs_struct {

#endif

// https://github.com/torvalds/linux/blob/master/tools/include/nolibc/arch-loongarch.h
/* Syscalls for LoongArch :
* - stack is 16-byte aligned
* - syscall number is passed in a7
* - arguments are in a0, a1, a2, a3, a4, a5
* - the system call is performed by calling "syscall 0"
* - syscall return comes in a0
* - the arguments are cast to long and assigned into the target
* registers which are then simply passed as registers to the asm code,
* so that we don't have to experience issues with register constraints.
*/
#ifdef __loongarch_lp64 // lonngarch64 龙芯的寄存器结构
#define REG_ARG0 regs[4] // a0 (x4)
#define REG_ARG1 regs[5] // a1 (x5)
#define REG_ARG2 regs[6] // a2 (x6)
#define REG_ARG3 regs[7] // a3 (x7)
#define REG_ARG4 regs[8] // a4 (x8)
#define REG_ARG5 regs[9] // a5 (x9)
#define REG_SYSCALL regs[17] // a7 (x17) 系统调用号
#define REG_RETVAL regs[4] // a0 (x4) 返回值存放
#endif

#ifdef __i386 //32位x86寄存器
#define REG_SYSCALL orig_eax
#define REG_RET eax
Expand Down Expand Up @@ -1549,6 +1571,10 @@ int compile(int lang, char *work_dir)
LIM.rlim_max = STD_MB << 12;
LIM.rlim_cur = STD_MB << 12;
#endif
#ifdef __loongarch_lp64
LIM.rlim_max = STD_MB << 12;
LIM.rlim_cur = STD_MB << 12;
#endif
#ifdef __arm__
LIM.rlim_max = STD_MB << 11;
LIM.rlim_cur = STD_MB << 11;
Expand Down Expand Up @@ -2139,6 +2165,10 @@ void copy_shell_runtime(char *work_dir)

#endif

#ifdef __loongarch_lp64
//
#endif

#ifdef __i386
execute_cmd("/bin/cp /lib/ld-linux* %s/lib/", work_dir);
execute_cmd("/bin/cp -a /lib/i386-linux-gnu/ %s/lib/", work_dir);
Expand Down Expand Up @@ -3317,6 +3347,10 @@ void watch_solution(pid_t pidApp, char *infile, int &ACflg, int spj,
call_id=ptrace(PTRACE_GETREGS, pidCur, NULL, &reg);
call_id = ((unsigned int)reg.REG_SYSCALL) % call_array_size;
#endif
#ifdef __loongarch_lp64
ptrace(PTRACE_GETREGS, pidCur, NULL, &reg);
call_id = ((unsigned int)reg.REG_SYSCALL) % call_array_size;
#endif
#ifdef __x86_64__
ptrace(PTRACE_GETREGS, pidCur, NULL, &reg);
call_id = ((unsigned int)reg.REG_SYSCALL) % call_array_size;
Expand Down
3 changes: 3 additions & 0 deletions trunk/core/judge_client/okcalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,6 @@
#ifdef __mips__
#include "okcalls_mips.h"
#endif
#ifdef __loongarch_lp64
#include "okcalls_loongarch64.h"
#endif
66 changes: 66 additions & 0 deletions trunk/core/judge_client/okcalls_loongarch64.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
*
*
* This file is part of HUSTOJ.
*
* HUSTOJ 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.
*
* HUSTOJ 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 HUSTOJ. if not, see <http://www.gnu.org/licenses/>.
*/

// See: https://gpages.juszkiewicz.com.pl/syscalls-table/syscalls.html

#include <sys/syscall.h>
#define HOJ_MAX_LIMIT -1
//C C++
int LANG_CV[CALL_ARRAY_SIZE] = {0,1,27,48,56,62,63,64,72,78,80,94,104,112,134,135,160,184,200,214,216,220,221,248,152,301,344,136,120,8,40,232,328,440,424,472,360,24,456,504,296,168,376,382,392,511,280,488,88,312,264,408,0};
//pascal
int LANG_PV[CALL_ARRAY_SIZE] = {29,63,64,78,94,112,134,163,220,511,0};
//java
int LANG_JV[CALL_ARRAY_SIZE] = {48,56,57,63,78,79,80,94,96,98,99,112,134,135,163,172,179,214,215,220,222,226,511,0};
//ruby
int LANG_RV[CALL_ARRAY_SIZE] = {0,0};
//bash
int LANG_BV[CALL_ARRAY_SIZE] = {0,3,4,5,6,19,20,33,45,54,63,64,65,78,122,125,140,174,175,183,191,192,195,197,199,200,201,202,221,248,0};
//python
int LANG_YV[CALL_ARRAY_SIZE] = {0,3,4,5,6,16,19,32,33,41,45,48,54,64,80,85,91,96,112,122,125,128,140,144,160,174,175,176,183,186,191,192,195,196,197,199,200,201,202,208,217,220,221,288,224,240,248,256,272,304,320,322,336,352,368,338,432,400,480,384,416,448,496,0};
//php
int LANG_PHV[CALL_ARRAY_SIZE] = {0,0};
//perl
int LANG_PLV[CALL_ARRAY_SIZE] = {0,0};
//c-sharp
int LANG_CSV[CALL_ARRAY_SIZE] = {0,3,5,6,19,33,45,122,125,174,175,191,192,195,197,256,338,0};
//objective-c
int LANG_OV[CALL_ARRAY_SIZE] = {0,0};
//freebasic
int LANG_BASICV[CALL_ARRAY_SIZE] = {0,0};
//scheme
int LANG_SV[CALL_ARRAY_SIZE] = {0,0};
//lua
int LANG_LUAV[CALL_ARRAY_SIZE] = {0,0};
//nodejs
int LANG_JSV[CALL_ARRAY_SIZE] = {0,0};
//go-lang
int LANG_GOV[CALL_ARRAY_SIZE] = {0,0};
//sqlite3
int LANG_SQLV[CALL_ARRAY_SIZE] = {0,0};
//fortran
int LANG_FV[CALL_ARRAY_SIZE] = {0,3,4,5,33,45,85,122,174,197,248,0};
//matlib
int LANG_MV[CALL_ARRAY_SIZE] = {0,2,3,4,5,6,11,19,33,45,54,78,91,122,125,140,174,175,183,191,192,195,197,199,201,217,240,242,248,256,281,283,338,384,0};
//cobol
int LANG_CBV[CALL_ARRAY_SIZE] = {0,2,3,4,5,6,11,19,33,45,54,78,91,122,125,140,174,175,183,191,192,195,197,199,201,217,240,242,248,256,281,283,338,384,0};
//R
int LANG_RLV[CALL_ARRAY_SIZE]={0,11,0};
//Scratch3
int LANG_SB3V[CALL_ARRAY_SIZE]={0,11,0};
int LANG_CJV[CALL_ARRAY_SIZE]={0,11,0};