mips64: add N32 ABI support

Adding MIPS N32 ABI support.

BZ issue - #345763.

Contributed and maintained by mulitple people over the years:
  Crestez Dan Leonard, Maran Pakkirisamy, Dimitrije Nikolic,
  Aleksandar Rikalo, Tamara Vlahovic.
This commit is contained in:
Petar Jovanovic
2018-06-14 15:26:09 +00:00
parent ac58a6b857
commit 9a6cf7a41c
19 changed files with 522 additions and 15 deletions

View File

@@ -170,6 +170,13 @@ AM_CPPFLAGS_@VGCONF_PLATFORM_SEC_CAPS@ = \
-DVGPV_@VGCONF_ARCH_SEC@_@VGCONF_OS@_@VGCONF_PLATVARIANT@=1
endif
if VGCONF_HAVE_ABI
AM_CPPFLAGS_@VGCONF_PLATFORM_PRI_CAPS@ += -DVGABI_@VGCONF_ABI@
if VGCONF_HAVE_PLATFORM_SEC
AM_CPPFLAGS_@VGCONF_PLATFORM_SEC_CAPS@ += -DVGABI_@VGCONF_ABI@
endif
endif
AM_FLAG_M3264_X86_LINUX = @FLAG_M32@
AM_CFLAGS_X86_LINUX = @FLAG_M32@ @PREFERRED_STACK_BOUNDARY_2@ \
$(AM_CFLAGS_BASE) -fomit-frame-pointer

View File

@@ -16,6 +16,10 @@ AM_CPPFLAGS += -DVGA_SEC_@VGCONF_ARCH_SEC@=1 \
-DVGP_SEC_@VGCONF_ARCH_PRI@_@VGCONF_OS@=1
endif
if VGCONF_HAVE_ABI
AM_CPPFLAGS += -DVGABI_@VGCONF_ABI@
endif
# Nb: Tools need to augment these flags with an arch-selection option, such
# as $(AM_FLAG_M3264_PRI).
AM_CFLAGS = -Winline -Wall -Wshadow -Wno-long-long -g \

View File

@@ -143,8 +143,13 @@ typedef unsigned long Addr;
typedef unsigned long HWord;
/* Size of GPRs */
typedef HWord RegWord;
#define FMT_REGWORD "l"
#if defined(__mips__) && (__mips == 64) && (_MIPS_SIM == _ABIN32)
typedef ULong RegWord;
# define FMT_REGWORD "ll"
#else
typedef HWord RegWord;
# define FMT_REGWORD "l"
#endif
/* Set up VEX_HOST_WORDSIZE and VEX_REGPARM. */
#undef VEX_HOST_WORDSIZE
@@ -180,7 +185,11 @@ typedef HWord RegWord;
# define VEX_REGPARM(_n) /* */
#elif defined(__mips__) && (__mips == 64)
#if _MIPS_SIM == _ABIN32
# define VEX_HOST_WORDSIZE 4
#else
# define VEX_HOST_WORDSIZE 8
#endif
# define VEX_REGPARM(_n) /* */
#elif defined(__mips__) && (__mips != 64)

View File

@@ -1874,6 +1874,37 @@ CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_MSA)
# Are we compiling for the MIPS64 n32 ABI?
AC_MSG_CHECKING([if gcc is producing mips n32 binaries])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#if !defined(_MIPS_SIM) || (defined(_MIPS_SIM) && (_MIPS_SIM != _ABIN32))
#error NO
#endif
]])], [
VGCONF_ABI=N32
FLAG_M64="-march=mips64r2 -mabi=n32"
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
# Are we compiling for the MIPS64 n64 ABI?
AC_MSG_CHECKING([if gcc is producing mips n64 binaries])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#if !defined(_MIPS_SIM) || (defined(_MIPS_SIM) && (_MIPS_SIM != _ABI64))
#error NO
#endif
]])], [
VGCONF_ABI=64
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([VGCONF_HAVE_ABI],
[test x$VGCONF_ABI != x])
AC_SUBST(VGCONF_ABI)
# does this compiler support -mmmx ?
AC_MSG_CHECKING([if gcc accepts -mmmx])

View File

@@ -65,6 +65,14 @@
#define EM_PPC64 21 // ditto
#endif
#ifndef E_MIPS_ABI_O32
#define E_MIPS_ABI_O32 0x00001000
#endif
#ifndef E_MIPS_ABI2
#define E_MIPS_ABI2 0x00000020
#endif
/* Report fatal errors */
__attribute__((noreturn))
static void barf ( const char *format, ... )
@@ -224,9 +232,17 @@ static const char *select_platform(const char *clientname)
else
if (header.ehdr32.e_machine == EM_MIPS &&
(header.ehdr32.e_ident[EI_OSABI] == ELFOSABI_SYSV ||
header.ehdr32.e_ident[EI_OSABI] == ELFOSABI_LINUX)) {
header.ehdr32.e_ident[EI_OSABI] == ELFOSABI_LINUX) &&
(header.ehdr32.e_flags & E_MIPS_ABI_O32)) {
platform = "mips32-linux";
}
else
if (header.ehdr32.e_machine == EM_MIPS &&
(header.ehdr32.e_ident[EI_OSABI] == ELFOSABI_SYSV ||
header.ehdr32.e_ident[EI_OSABI] == ELFOSABI_LINUX) &&
(header.ehdr32.e_flags & E_MIPS_ABI2)) {
platform = "mips64-linux";
}
}
else if (header.c[EI_DATA] == ELFDATA2MSB) {
if (header.ehdr32.e_machine == EM_PPC &&
@@ -237,9 +253,17 @@ static const char *select_platform(const char *clientname)
else
if (header.ehdr32.e_machine == EM_MIPS &&
(header.ehdr32.e_ident[EI_OSABI] == ELFOSABI_SYSV ||
header.ehdr32.e_ident[EI_OSABI] == ELFOSABI_LINUX)) {
header.ehdr32.e_ident[EI_OSABI] == ELFOSABI_LINUX) &&
(header.ehdr32.e_flags & E_MIPS_ABI_O32)) {
platform = "mips32-linux";
}
else
if (header.ehdr32.e_machine == EM_MIPS &&
(header.ehdr32.e_ident[EI_OSABI] == ELFOSABI_SYSV ||
header.ehdr32.e_ident[EI_OSABI] == ELFOSABI_LINUX) &&
(header.ehdr32.e_flags & E_MIPS_ABI2)) {
platform = "mips64-linux";
}
}
} else if (n_bytes >= sizeof(Elf64_Ehdr) && header.c[EI_CLASS] == ELFCLASS64) {

View File

@@ -3219,6 +3219,12 @@ Bool VG_(use_CF_info) ( /*MOD*/D3UnwindRegs* uregsHere,
/* Now we know the CFA, use it to roll back the registers we're
interested in. */
#if defined(VGA_mips64) && defined(VGABI_N32)
#define READ_REGISTER(addr) ML_(read_ULong)((addr))
#else
#define READ_REGISTER(addr) ML_(read_Addr)((addr))
#endif
# define COMPUTE(_prev, _here, _how, _off) \
do { \
switch (_how) { \
@@ -3231,7 +3237,7 @@ Bool VG_(use_CF_info) ( /*MOD*/D3UnwindRegs* uregsHere,
if (a < min_accessible \
|| a > max_accessible-sizeof(Addr)) \
return False; \
_prev = ML_(read_Addr)((void *)a); \
_prev = READ_REGISTER((void *)a); \
break; \
} \
case CFIR_CFAREL: \

View File

@@ -111,8 +111,15 @@ postamble:
/* Restore $4 from stack; holds address of two_words */
ld $4, 160($29)
sd $2, 0($4) /* Store $2 to two_words[0] */
sd $3, 8($4) /* Store $3 to two_words[1] */
#if defined(VGABI_64)
sd $2, 0($4) /* Store $2 to two_words[0] */
sd $3, 8($4) /* Store $3 to two_words[1] */
#elif defined(VGABI_N32)
sw $2, 0($4) /* Store $2 to two_words[0] */
sw $3, 4($4) /* Store $3 to two_words[1] */
#else
#error unknown mips64 abi
#endif
/* Restore callee-saved registers... */

View File

@@ -1612,6 +1612,7 @@ void VG_(redir_initialise) ( void )
complain_about_stripped_glibc_ldso
);
#if defined(VGABI_64)
add_hardwired_spec(
"ld-linux-mipsn8.so.1", "strlen",
(Addr)&VG_(mips64_linux_REDIR_FOR_strlen),
@@ -1622,6 +1623,15 @@ void VG_(redir_initialise) ( void )
(Addr)&VG_(mips64_linux_REDIR_FOR_index),
complain_about_stripped_glibc_ldso
);
#elif defined(VGABI_N32)
add_hardwired_spec(
"ld.so.1", "strchr",
(Addr)&VG_(mips64_linux_REDIR_FOR_index),
complain_about_stripped_glibc_ldso
);
#else
#error unknown mips64 ABI
#endif
}
# elif defined(VGP_x86_solaris)

View File

@@ -140,11 +140,19 @@ ML_(do_syscall_for_client_WRK):
.globl ML_(blksys_complete)
.globl ML_(blksys_committed)
.globl ML_(blksys_finished)
#if defined(VGABI_N32)
ML_(blksys_setup): .int 1b
ML_(blksys_restart): .int 2b
ML_(blksys_complete): .int 3b
ML_(blksys_committed): .int 4b
ML_(blksys_finished): .int 5b
#else
ML_(blksys_setup): .quad 1b
ML_(blksys_restart): .quad 2b
ML_(blksys_complete): .quad 3b
ML_(blksys_committed): .quad 4b
ML_(blksys_finished): .quad 5b
#endif
#endif // defined(VGP_mips64_linux)

View File

@@ -756,7 +756,10 @@ static SyscallTableEntry syscall_main_table[] = {
LINX_ (__NR_epoll_ctl, sys_epoll_ctl),
LINXY (__NR_epoll_wait, sys_epoll_wait),
PLAX_(__NR_rt_sigreturn,sys_rt_sigreturn),
/* LINXY(__NR_fcntl64,sys_fcntl64), */
#if defined(VGABI_N32)
LINXY(__NR_fcntl64, sys_fcntl64),
GENXY(__NR_statfs64, sys_statfs64),
#endif
LINX_ (__NR_set_tid_address, sys_set_tid_address),
LINX_ (__NR_semtimedop, sys_semtimedop),
PLAX_ (__NR_fadvise64, sys_fadvise64),

View File

@@ -2452,6 +2452,7 @@ void VG_(init_tt_tc) ( void )
else if (sizeof(HWord) == 4) {
vg_assert(sizeof(TTEntryH) <= 20);
# if defined(VGP_ppc32_linux) || defined(VGP_mips32_linux) \
|| (defined(VGP_mips64_linux) && defined(VGABI_N32)) \
|| defined(VGP_arm_linux)
/* On PPC32, MIPS32, ARM32 platforms, alignof(ULong) == 8, so the
structure is larger than on other 32 bit targets. */

View File

@@ -60,6 +60,9 @@ const HChar* VG_(sysnum_string)(Word sysnum)
#if defined(VGP_mips32_linux)
STATIC_ASSERT(__NR_pipe == 4042);
STATIC_ASSERT(__NR_pipe2 == 4328);
#elif defined(VGP_mips64_linux) && defined(VGABI_N32)
STATIC_ASSERT(__NR_pipe == 6021);
STATIC_ASSERT(__NR_pipe2 == 6291);
#elif defined(VGP_mips64_linux)
STATIC_ASSERT(__NR_pipe == 5021);
STATIC_ASSERT(__NR_pipe2 == 5287);

View File

@@ -106,7 +106,13 @@
# error "Unknown endianness"
# endif
# define VG_ELF_MACHINE EM_MIPS
# define VG_ELF_CLASS ELFCLASS64
# if defined(VGABI_N32)
# define VG_ELF_CLASS ELFCLASS32
# elif defined(VGABI_64)
# define VG_ELF_CLASS ELFCLASS64
# else
# error Unknown mips64 abi
# endif
# undef VG_PLAT_USES_PPCTOC
#else
# error Unknown platform

View File

@@ -66,6 +66,7 @@ typedef Int ArenaId;
#if defined(VGP_x86_linux) || \
defined(VGP_arm_linux) || \
defined(VGP_mips32_linux) || \
(defined(VGP_mips64_linux) && defined(VGABI_N32)) || \
defined(VGP_x86_solaris)
# define VG_MIN_MALLOC_SZB 8
// Nb: We always use 16 bytes for Darwin, even on 32-bits, so it can be used
@@ -77,7 +78,7 @@ typedef Int ArenaId;
defined(VGP_ppc64be_linux) || \
defined(VGP_ppc64le_linux) || \
defined(VGP_s390x_linux) || \
defined(VGP_mips64_linux) || \
(defined(VGP_mips64_linux) && !defined(VGABI_N32)) || \
defined(VGP_x86_darwin) || \
defined(VGP_amd64_darwin) || \
defined(VGP_arm64_linux) || \

View File

@@ -137,10 +137,11 @@ Addr make_address(const UWord a1, const UWord a0)
/** Log2 of BITS_PER_UWORD. */
#if defined(VGA_x86) || defined(VGA_ppc32) || defined(VGA_arm) \
|| defined(VGA_mips32)
|| defined(VGA_mips32) || (defined(VGA_mips64) && defined(VGABI_N32))
#define BITS_PER_BITS_PER_UWORD 5
#elif defined(VGA_amd64) || defined(VGA_ppc64be) || defined(VGA_ppc64le) \
|| defined(VGA_s390x) || defined(VGA_mips64) || defined(VGA_arm64)
|| defined(VGA_s390x) || (defined(VGA_mips64) && !defined(VGABI_N32)) \
|| defined(VGA_arm64) || defined(VGA_tilegx)
#define BITS_PER_BITS_PER_UWORD 6
#else
#error Unknown platform.

View File

@@ -271,6 +271,10 @@ static inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) {
const UInt __nr_Linux = 4000;
const UInt __nr_pipe = __nr_Linux + 42;
const UInt __nr_pipe2 = __nr_Linux + 328;
# elif defined(VGP_mips64_linux) && defined(VGABI_N32)
const UInt __nr_Linux = 6000;
const UInt __nr_pipe = __nr_Linux + 21;
const UInt __nr_pipe2 = __nr_Linux + 291;
# else
const UInt __nr_Linux = 5000;
const UInt __nr_pipe = __nr_Linux + 21;

View File

@@ -399,11 +399,17 @@ struct vki_f_owner_ex {
// From linux-2.6.35.9/include/asm-mips/stat.h
//----------------------------------------------------------------------
/* Size of kernel long is different from Valgrind MIPS n32 long size, so we have to
use long long instead long type. */
struct vki_stat {
unsigned int st_dev;
unsigned int st_pad0[3]; /* Reserved for st_dev expansion */
#if defined(VGABI_N32)
unsigned long long st_ino;
#else
unsigned long st_ino;
#endif
int st_mode;
unsigned int st_nlink;
@@ -414,7 +420,11 @@ struct vki_stat {
unsigned int st_rdev;
unsigned int st_pad1[3]; /* Reserved for st_rdev expansion */
#if defined(VGABI_N32)
long long st_size;
#else
long st_size;
#endif
/*
* Actually this should be timestruc_t st_atime, st_mtime and st_ctime
@@ -914,7 +924,13 @@ typedef union vki_sigval {
} vki_sigval_t;
#ifndef __VKI_ARCH_SI_PREAMBLE_SIZE
#define __VKI_ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
#if defined(VGABI_64)
#define __VKI_ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
#elif defined(VGABI_N32)
#define __VKI_ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int))
#else
#error unknown mips64 abi
#endif
#endif
#define VKI_SI_MAX_SIZE 128

View File

@@ -1,4 +1,3 @@
/*--------------------------------------------------------------------*/
/*--- System call numbers for mips-linux. ---*/
/*--- vki-scnums-mips64-linux.h ---*/
@@ -33,6 +32,8 @@
#define __VKI_SCNUMS_MIPS64_LINUX_H
// From linux/arch/mips/include/uapi/asm/unistd.h
#if defined(VGABI_64)
/*
* Linux 64-bit syscalls are in the range from 5000 to 5999.
*/
@@ -364,6 +365,340 @@
#define __NR_pkey_alloc (__NR_Linux + 324)
#define __NR_pkey_free (__NR_Linux + 325)
#define __NR_statx (__NR_Linux + 326)
#elif defined(VGABI_N32)
/*
* Linux N32 syscalls are in the range from 6000 to 6999.
* This is from linux 3.19 arch/mips/include/uapi/asm/unistd.h
*/
#define __NR_Linux 6000
#define __NR_read (__NR_Linux + 0)
#define __NR_write (__NR_Linux + 1)
#define __NR_open (__NR_Linux + 2)
#define __NR_close (__NR_Linux + 3)
#define __NR_stat (__NR_Linux + 4)
#define __NR_fstat (__NR_Linux + 5)
#define __NR_lstat (__NR_Linux + 6)
#define __NR_poll (__NR_Linux + 7)
#define __NR_lseek (__NR_Linux + 8)
#define __NR_mmap (__NR_Linux + 9)
#define __NR_mprotect (__NR_Linux + 10)
#define __NR_munmap (__NR_Linux + 11)
#define __NR_brk (__NR_Linux + 12)
#define __NR_rt_sigaction (__NR_Linux + 13)
#define __NR_rt_sigprocmask (__NR_Linux + 14)
#define __NR_ioctl (__NR_Linux + 15)
#define __NR_pread64 (__NR_Linux + 16)
#define __NR_pwrite64 (__NR_Linux + 17)
#define __NR_readv (__NR_Linux + 18)
#define __NR_writev (__NR_Linux + 19)
#define __NR_access (__NR_Linux + 20)
#define __NR_pipe (__NR_Linux + 21)
#define __NR__newselect (__NR_Linux + 22)
#define __NR_sched_yield (__NR_Linux + 23)
#define __NR_mremap (__NR_Linux + 24)
#define __NR_msync (__NR_Linux + 25)
#define __NR_mincore (__NR_Linux + 26)
#define __NR_madvise (__NR_Linux + 27)
#define __NR_shmget (__NR_Linux + 28)
#define __NR_shmat (__NR_Linux + 29)
#define __NR_shmctl (__NR_Linux + 30)
#define __NR_dup (__NR_Linux + 31)
#define __NR_dup2 (__NR_Linux + 32)
#define __NR_pause (__NR_Linux + 33)
#define __NR_nanosleep (__NR_Linux + 34)
#define __NR_getitimer (__NR_Linux + 35)
#define __NR_setitimer (__NR_Linux + 36)
#define __NR_alarm (__NR_Linux + 37)
#define __NR_getpid (__NR_Linux + 38)
#define __NR_sendfile (__NR_Linux + 39)
#define __NR_socket (__NR_Linux + 40)
#define __NR_connect (__NR_Linux + 41)
#define __NR_accept (__NR_Linux + 42)
#define __NR_sendto (__NR_Linux + 43)
#define __NR_recvfrom (__NR_Linux + 44)
#define __NR_sendmsg (__NR_Linux + 45)
#define __NR_recvmsg (__NR_Linux + 46)
#define __NR_shutdown (__NR_Linux + 47)
#define __NR_bind (__NR_Linux + 48)
#define __NR_listen (__NR_Linux + 49)
#define __NR_getsockname (__NR_Linux + 50)
#define __NR_getpeername (__NR_Linux + 51)
#define __NR_socketpair (__NR_Linux + 52)
#define __NR_setsockopt (__NR_Linux + 53)
#define __NR_getsockopt (__NR_Linux + 54)
#define __NR_clone (__NR_Linux + 55)
#define __NR_fork (__NR_Linux + 56)
#define __NR_execve (__NR_Linux + 57)
#define __NR_exit (__NR_Linux + 58)
#define __NR_wait4 (__NR_Linux + 59)
#define __NR_kill (__NR_Linux + 60)
#define __NR_uname (__NR_Linux + 61)
#define __NR_semget (__NR_Linux + 62)
#define __NR_semop (__NR_Linux + 63)
#define __NR_semctl (__NR_Linux + 64)
#define __NR_shmdt (__NR_Linux + 65)
#define __NR_msgget (__NR_Linux + 66)
#define __NR_msgsnd (__NR_Linux + 67)
#define __NR_msgrcv (__NR_Linux + 68)
#define __NR_msgctl (__NR_Linux + 69)
#define __NR_fcntl (__NR_Linux + 70)
#define __NR_flock (__NR_Linux + 71)
#define __NR_fsync (__NR_Linux + 72)
#define __NR_fdatasync (__NR_Linux + 73)
#define __NR_truncate (__NR_Linux + 74)
#define __NR_ftruncate (__NR_Linux + 75)
#define __NR_getdents (__NR_Linux + 76)
#define __NR_getcwd (__NR_Linux + 77)
#define __NR_chdir (__NR_Linux + 78)
#define __NR_fchdir (__NR_Linux + 79)
#define __NR_rename (__NR_Linux + 80)
#define __NR_mkdir (__NR_Linux + 81)
#define __NR_rmdir (__NR_Linux + 82)
#define __NR_creat (__NR_Linux + 83)
#define __NR_link (__NR_Linux + 84)
#define __NR_unlink (__NR_Linux + 85)
#define __NR_symlink (__NR_Linux + 86)
#define __NR_readlink (__NR_Linux + 87)
#define __NR_chmod (__NR_Linux + 88)
#define __NR_fchmod (__NR_Linux + 89)
#define __NR_chown (__NR_Linux + 90)
#define __NR_fchown (__NR_Linux + 91)
#define __NR_lchown (__NR_Linux + 92)
#define __NR_umask (__NR_Linux + 93)
#define __NR_gettimeofday (__NR_Linux + 94)
#define __NR_getrlimit (__NR_Linux + 95)
#define __NR_getrusage (__NR_Linux + 96)
#define __NR_sysinfo (__NR_Linux + 97)
#define __NR_times (__NR_Linux + 98)
#define __NR_ptrace (__NR_Linux + 99)
#define __NR_getuid (__NR_Linux + 100)
#define __NR_syslog (__NR_Linux + 101)
#define __NR_getgid (__NR_Linux + 102)
#define __NR_setuid (__NR_Linux + 103)
#define __NR_setgid (__NR_Linux + 104)
#define __NR_geteuid (__NR_Linux + 105)
#define __NR_getegid (__NR_Linux + 106)
#define __NR_setpgid (__NR_Linux + 107)
#define __NR_getppid (__NR_Linux + 108)
#define __NR_getpgrp (__NR_Linux + 109)
#define __NR_setsid (__NR_Linux + 110)
#define __NR_setreuid (__NR_Linux + 111)
#define __NR_setregid (__NR_Linux + 112)
#define __NR_getgroups (__NR_Linux + 113)
#define __NR_setgroups (__NR_Linux + 114)
#define __NR_setresuid (__NR_Linux + 115)
#define __NR_getresuid (__NR_Linux + 116)
#define __NR_setresgid (__NR_Linux + 117)
#define __NR_getresgid (__NR_Linux + 118)
#define __NR_getpgid (__NR_Linux + 119)
#define __NR_setfsuid (__NR_Linux + 120)
#define __NR_setfsgid (__NR_Linux + 121)
#define __NR_getsid (__NR_Linux + 122)
#define __NR_capget (__NR_Linux + 123)
#define __NR_capset (__NR_Linux + 124)
#define __NR_rt_sigpending (__NR_Linux + 125)
#define __NR_rt_sigtimedwait (__NR_Linux + 126)
#define __NR_rt_sigqueueinfo (__NR_Linux + 127)
#define __NR_rt_sigsuspend (__NR_Linux + 128)
#define __NR_sigaltstack (__NR_Linux + 129)
#define __NR_utime (__NR_Linux + 130)
#define __NR_mknod (__NR_Linux + 131)
#define __NR_personality (__NR_Linux + 132)
#define __NR_ustat (__NR_Linux + 133)
#define __NR_statfs (__NR_Linux + 134)
#define __NR_fstatfs (__NR_Linux + 135)
#define __NR_sysfs (__NR_Linux + 136)
#define __NR_getpriority (__NR_Linux + 137)
#define __NR_setpriority (__NR_Linux + 138)
#define __NR_sched_setparam (__NR_Linux + 139)
#define __NR_sched_getparam (__NR_Linux + 140)
#define __NR_sched_setscheduler (__NR_Linux + 141)
#define __NR_sched_getscheduler (__NR_Linux + 142)
#define __NR_sched_get_priority_max (__NR_Linux + 143)
#define __NR_sched_get_priority_min (__NR_Linux + 144)
#define __NR_sched_rr_get_interval (__NR_Linux + 145)
#define __NR_mlock (__NR_Linux + 146)
#define __NR_munlock (__NR_Linux + 147)
#define __NR_mlockall (__NR_Linux + 148)
#define __NR_munlockall (__NR_Linux + 149)
#define __NR_vhangup (__NR_Linux + 150)
#define __NR_pivot_root (__NR_Linux + 151)
#define __NR__sysctl (__NR_Linux + 152)
#define __NR_prctl (__NR_Linux + 153)
#define __NR_adjtimex (__NR_Linux + 154)
#define __NR_setrlimit (__NR_Linux + 155)
#define __NR_chroot (__NR_Linux + 156)
#define __NR_sync (__NR_Linux + 157)
#define __NR_acct (__NR_Linux + 158)
#define __NR_settimeofday (__NR_Linux + 159)
#define __NR_mount (__NR_Linux + 160)
#define __NR_umount2 (__NR_Linux + 161)
#define __NR_swapon (__NR_Linux + 162)
#define __NR_swapoff (__NR_Linux + 163)
#define __NR_reboot (__NR_Linux + 164)
#define __NR_sethostname (__NR_Linux + 165)
#define __NR_setdomainname (__NR_Linux + 166)
#define __NR_create_module (__NR_Linux + 167)
#define __NR_init_module (__NR_Linux + 168)
#define __NR_delete_module (__NR_Linux + 169)
#define __NR_get_kernel_syms (__NR_Linux + 170)
#define __NR_query_module (__NR_Linux + 171)
#define __NR_quotactl (__NR_Linux + 172)
#define __NR_nfsservctl (__NR_Linux + 173)
#define __NR_getpmsg (__NR_Linux + 174)
#define __NR_putpmsg (__NR_Linux + 175)
#define __NR_afs_syscall (__NR_Linux + 176)
#define __NR_reserved177 (__NR_Linux + 177)
#define __NR_gettid (__NR_Linux + 178)
#define __NR_readahead (__NR_Linux + 179)
#define __NR_setxattr (__NR_Linux + 180)
#define __NR_lsetxattr (__NR_Linux + 181)
#define __NR_fsetxattr (__NR_Linux + 182)
#define __NR_getxattr (__NR_Linux + 183)
#define __NR_lgetxattr (__NR_Linux + 184)
#define __NR_fgetxattr (__NR_Linux + 185)
#define __NR_listxattr (__NR_Linux + 186)
#define __NR_llistxattr (__NR_Linux + 187)
#define __NR_flistxattr (__NR_Linux + 188)
#define __NR_removexattr (__NR_Linux + 189)
#define __NR_lremovexattr (__NR_Linux + 190)
#define __NR_fremovexattr (__NR_Linux + 191)
#define __NR_tkill (__NR_Linux + 192)
#define __NR_reserved193 (__NR_Linux + 193)
#define __NR_futex (__NR_Linux + 194)
#define __NR_sched_setaffinity (__NR_Linux + 195)
#define __NR_sched_getaffinity (__NR_Linux + 196)
#define __NR_cacheflush (__NR_Linux + 197)
#define __NR_cachectl (__NR_Linux + 198)
#define __NR_sysmips (__NR_Linux + 199)
#define __NR_io_setup (__NR_Linux + 200)
#define __NR_io_destroy (__NR_Linux + 201)
#define __NR_io_getevents (__NR_Linux + 202)
#define __NR_io_submit (__NR_Linux + 203)
#define __NR_io_cancel (__NR_Linux + 204)
#define __NR_exit_group (__NR_Linux + 205)
#define __NR_lookup_dcookie (__NR_Linux + 206)
#define __NR_epoll_create (__NR_Linux + 207)
#define __NR_epoll_ctl (__NR_Linux + 208)
#define __NR_epoll_wait (__NR_Linux + 209)
#define __NR_remap_file_pages (__NR_Linux + 210)
#define __NR_rt_sigreturn (__NR_Linux + 211)
#define __NR_fcntl64 (__NR_Linux + 212)
#define __NR_set_tid_address (__NR_Linux + 213)
#define __NR_restart_syscall (__NR_Linux + 214)
#define __NR_semtimedop (__NR_Linux + 215)
#define __NR_fadvise64 (__NR_Linux + 216)
#define __NR_statfs64 (__NR_Linux + 217)
#define __NR_fstatfs64 (__NR_Linux + 218)
#define __NR_sendfile64 (__NR_Linux + 219)
#define __NR_timer_create (__NR_Linux + 220)
#define __NR_timer_settime (__NR_Linux + 221)
#define __NR_timer_gettime (__NR_Linux + 222)
#define __NR_timer_getoverrun (__NR_Linux + 223)
#define __NR_timer_delete (__NR_Linux + 224)
#define __NR_clock_settime (__NR_Linux + 225)
#define __NR_clock_gettime (__NR_Linux + 226)
#define __NR_clock_getres (__NR_Linux + 227)
#define __NR_clock_nanosleep (__NR_Linux + 228)
#define __NR_tgkill (__NR_Linux + 229)
#define __NR_utimes (__NR_Linux + 230)
#define __NR_mbind (__NR_Linux + 231)
#define __NR_get_mempolicy (__NR_Linux + 232)
#define __NR_set_mempolicy (__NR_Linux + 233)
#define __NR_mq_open (__NR_Linux + 234)
#define __NR_mq_unlink (__NR_Linux + 235)
#define __NR_mq_timedsend (__NR_Linux + 236)
#define __NR_mq_timedreceive (__NR_Linux + 237)
#define __NR_mq_notify (__NR_Linux + 238)
#define __NR_mq_getsetattr (__NR_Linux + 239)
#define __NR_vserver (__NR_Linux + 240)
#define __NR_waitid (__NR_Linux + 241)
/* #define __NR_sys_setaltroot (__NR_Linux + 242) */
#define __NR_add_key (__NR_Linux + 243)
#define __NR_request_key (__NR_Linux + 244)
#define __NR_keyctl (__NR_Linux + 245)
#define __NR_set_thread_area (__NR_Linux + 246)
#define __NR_inotify_init (__NR_Linux + 247)
#define __NR_inotify_add_watch (__NR_Linux + 248)
#define __NR_inotify_rm_watch (__NR_Linux + 249)
#define __NR_migrate_pages (__NR_Linux + 250)
#define __NR_openat (__NR_Linux + 251)
#define __NR_mkdirat (__NR_Linux + 252)
#define __NR_mknodat (__NR_Linux + 253)
#define __NR_fchownat (__NR_Linux + 254)
#define __NR_futimesat (__NR_Linux + 255)
#define __NR_newfstatat (__NR_Linux + 256)
#define __NR_unlinkat (__NR_Linux + 257)
#define __NR_renameat (__NR_Linux + 258)
#define __NR_linkat (__NR_Linux + 259)
#define __NR_symlinkat (__NR_Linux + 260)
#define __NR_readlinkat (__NR_Linux + 261)
#define __NR_fchmodat (__NR_Linux + 262)
#define __NR_faccessat (__NR_Linux + 263)
#define __NR_pselect6 (__NR_Linux + 264)
#define __NR_ppoll (__NR_Linux + 265)
#define __NR_unshare (__NR_Linux + 266)
#define __NR_splice (__NR_Linux + 267)
#define __NR_sync_file_range (__NR_Linux + 268)
#define __NR_tee (__NR_Linux + 269)
#define __NR_vmsplice (__NR_Linux + 270)
#define __NR_move_pages (__NR_Linux + 271)
#define __NR_set_robust_list (__NR_Linux + 272)
#define __NR_get_robust_list (__NR_Linux + 273)
#define __NR_kexec_load (__NR_Linux + 274)
#define __NR_getcpu (__NR_Linux + 275)
#define __NR_epoll_pwait (__NR_Linux + 276)
#define __NR_ioprio_set (__NR_Linux + 277)
#define __NR_ioprio_get (__NR_Linux + 278)
#define __NR_utimensat (__NR_Linux + 279)
#define __NR_signalfd (__NR_Linux + 280)
#define __NR_timerfd (__NR_Linux + 281)
#define __NR_eventfd (__NR_Linux + 282)
#define __NR_fallocate (__NR_Linux + 283)
#define __NR_timerfd_create (__NR_Linux + 284)
#define __NR_timerfd_gettime (__NR_Linux + 285)
#define __NR_timerfd_settime (__NR_Linux + 286)
#define __NR_signalfd4 (__NR_Linux + 287)
#define __NR_eventfd2 (__NR_Linux + 288)
#define __NR_epoll_create1 (__NR_Linux + 289)
#define __NR_dup3 (__NR_Linux + 290)
#define __NR_pipe2 (__NR_Linux + 291)
#define __NR_inotify_init1 (__NR_Linux + 292)
#define __NR_preadv (__NR_Linux + 293)
#define __NR_pwritev (__NR_Linux + 294)
#define __NR_rt_tgsigqueueinfo (__NR_Linux + 295)
#define __NR_perf_event_open (__NR_Linux + 296)
#define __NR_accept4 (__NR_Linux + 297)
#define __NR_recvmmsg (__NR_Linux + 298)
#define __NR_getdents64 (__NR_Linux + 299)
#define __NR_fanotify_init (__NR_Linux + 300)
#define __NR_fanotify_mark (__NR_Linux + 301)
#define __NR_prlimit64 (__NR_Linux + 302)
#define __NR_name_to_handle_at (__NR_Linux + 303)
#define __NR_open_by_handle_at (__NR_Linux + 304)
#define __NR_clock_adjtime (__NR_Linux + 305)
#define __NR_syncfs (__NR_Linux + 306)
#define __NR_sendmmsg (__NR_Linux + 307)
#define __NR_setns (__NR_Linux + 308)
#define __NR_process_vm_readv (__NR_Linux + 309)
#define __NR_process_vm_writev (__NR_Linux + 310)
#define __NR_kcmp (__NR_Linux + 311)
#define __NR_finit_module (__NR_Linux + 312)
#define __NR_sched_setattr (__NR_Linux + 313)
#define __NR_sched_getattr (__NR_Linux + 314)
#define __NR_renameat2 (__NR_Linux + 315)
#define __NR_seccomp (__NR_Linux + 316)
#define __NR_getrandom (__NR_Linux + 317)
#define __NR_memfd_create (__NR_Linux + 318)
#define __NR_bpf (__NR_Linux + 319)
#define __NR_execveat (__NR_Linux + 320)
#else
#error unknown mips64 abi
#endif
#endif /* __VKI_SCNUMS_MIPS64_LINUX_H */
/*--------------------------------------------------------------------*/

View File

@@ -1392,8 +1392,14 @@ ULong mc_LOADVn_slow ( Addr a, SizeT nBits, Bool bigendian )
folded out by compilers on 32-bit platforms. These are derived
from LOADV64 and LOADV32.
*/
#if defined (VGABI_N32)
if (LIKELY(sizeof(void*) == 4
&& nBits == 64 && VG_IS_8_ALIGNED(a))) {
#else
if (LIKELY(sizeof(void*) == 8
&& nBits == 64 && VG_IS_8_ALIGNED(a))) {
#endif
SecMap* sm = get_secmap_for_reading(a);
UWord sm_off16 = SM_OFF_16(a);
UWord vabits16 = sm->vabits16[sm_off16];
@@ -1403,8 +1409,13 @@ ULong mc_LOADVn_slow ( Addr a, SizeT nBits, Bool bigendian )
return V_BITS64_UNDEFINED;
/* else fall into the slow case */
}
#if defined (VGABI_N32)
if (LIKELY(sizeof(void*) == 4
&& nBits == 32 && VG_IS_4_ALIGNED(a))) {
#else
if (LIKELY(sizeof(void*) == 8
&& nBits == 32 && VG_IS_4_ALIGNED(a))) {
#endif
SecMap* sm = get_secmap_for_reading(a);
UWord sm_off = SM_OFF(a);
UWord vabits8 = sm->vabits8[sm_off];
@@ -1485,8 +1496,13 @@ ULong mc_LOADVn_slow ( Addr a, SizeT nBits, Bool bigendian )
/* "at least one of the addresses is invalid" */
tl_assert(pessim64 != V_BITS64_DEFINED);
#if defined (VGABI_N32)
if (szB == VG_WORDSIZE * 2 && VG_IS_WORD_ALIGNED(a)
&& n_addrs_bad < VG_WORDSIZE * 2) {
#else
if (szB == VG_WORDSIZE && VG_IS_WORD_ALIGNED(a)
&& n_addrs_bad < VG_WORDSIZE) {
#endif
/* Exemption applies. Use the previously computed pessimising
value for vbits64 and return the combined result, but don't
flag an addressing error. The pessimising value is Defined
@@ -1504,8 +1520,13 @@ ULong mc_LOADVn_slow ( Addr a, SizeT nBits, Bool bigendian )
for this case. Note that the first clause of the conditional
(VG_WORDSIZE == 8) is known at compile time, so the whole clause
will get folded out in 32 bit builds. */
#if defined (VGABI_N32)
if (VG_WORDSIZE == 4
&& VG_IS_4_ALIGNED(a) && nBits == 32 && n_addrs_bad < 4) {
#else
if (VG_WORDSIZE == 8
&& VG_IS_4_ALIGNED(a) && nBits == 32 && n_addrs_bad < 4) {
#endif
tl_assert(V_BIT_UNDEFINED == 1 && V_BIT_DEFINED == 0);
/* (really need "UifU" here...)
vbits64 UifU= pessim64 (is pessimised by it, iow) */
@@ -1545,8 +1566,13 @@ void mc_STOREVn_slow ( Addr a, SizeT nBits, ULong vbytes, Bool bigendian )
is somewhat similar to some cases extensively commented in
MC_(helperc_STOREV8).
*/
if (LIKELY(sizeof(void*) == 8
#if defined (VGABI_N32)
if (LIKELY(sizeof(void*) == 4
&& nBits == 64 && VG_IS_8_ALIGNED(a))) {
#else
if (LIKELY(sizeof(void*) == 8
&& nBits == 64 && VG_IS_8_ALIGNED(a))) {
#endif
SecMap* sm = get_secmap_for_reading(a);
UWord sm_off16 = SM_OFF_16(a);
UWord vabits16 = sm->vabits16[sm_off16];
@@ -1567,8 +1593,13 @@ void mc_STOREVn_slow ( Addr a, SizeT nBits, ULong vbytes, Bool bigendian )
}
/* else fall into the slow case */
}
#if defined (VGABI_N32)
if (LIKELY(sizeof(void*) == 4
&& nBits == 32 && VG_IS_4_ALIGNED(a))) {
#else
if (LIKELY(sizeof(void*) == 8
&& nBits == 32 && VG_IS_4_ALIGNED(a))) {
#endif
SecMap* sm = get_secmap_for_reading(a);
UWord sm_off = SM_OFF(a);
UWord vabits8 = sm->vabits8[sm_off];