From: Petar Jovanovic Date: Thu, 14 Jun 2018 15:26:09 +0000 (+0000) Subject: mips64: add N32 ABI support X-Git-Tag: VALGRIND_3_14_0~107 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9a6cf7a41c7e7a32e0d0a369b4519b97e2569d3d;p=thirdparty%2Fvalgrind.git 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. --- diff --git a/Makefile.all.am b/Makefile.all.am index 30e79dd565..4a29695cce 100644 --- a/Makefile.all.am +++ b/Makefile.all.am @@ -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 diff --git a/Makefile.tool-tests.am b/Makefile.tool-tests.am index b27724fbb3..752b9678e4 100644 --- a/Makefile.tool-tests.am +++ b/Makefile.tool-tests.am @@ -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 \ diff --git a/VEX/pub/libvex_basictypes.h b/VEX/pub/libvex_basictypes.h index d633cde63e..53aa2cd383 100644 --- a/VEX/pub/libvex_basictypes.h +++ b/VEX/pub/libvex_basictypes.h @@ -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) diff --git a/configure.ac b/configure.ac index 03704981de..306fbc78e7 100644 --- a/configure.ac +++ b/configure.ac @@ -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]) diff --git a/coregrind/launcher-linux.c b/coregrind/launcher-linux.c index 8e7c73475a..105d023a54 100644 --- a/coregrind/launcher-linux.c +++ b/coregrind/launcher-linux.c @@ -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) { diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c index b850293683..13991b69a8 100644 --- a/coregrind/m_debuginfo/debuginfo.c +++ b/coregrind/m_debuginfo/debuginfo.c @@ -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: \ diff --git a/coregrind/m_dispatch/dispatch-mips64-linux.S b/coregrind/m_dispatch/dispatch-mips64-linux.S index dc2beee138..4a2b1b734e 100644 --- a/coregrind/m_dispatch/dispatch-mips64-linux.S +++ b/coregrind/m_dispatch/dispatch-mips64-linux.S @@ -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... */ diff --git a/coregrind/m_redir.c b/coregrind/m_redir.c index aa65eafaad..57a97a4796 100644 --- a/coregrind/m_redir.c +++ b/coregrind/m_redir.c @@ -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) diff --git a/coregrind/m_syswrap/syscall-mips64-linux.S b/coregrind/m_syswrap/syscall-mips64-linux.S index 8cc2ac0611..df30d0eb39 100644 --- a/coregrind/m_syswrap/syscall-mips64-linux.S +++ b/coregrind/m_syswrap/syscall-mips64-linux.S @@ -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) diff --git a/coregrind/m_syswrap/syswrap-mips64-linux.c b/coregrind/m_syswrap/syswrap-mips64-linux.c index c644ecd711..062fb38044 100644 --- a/coregrind/m_syswrap/syswrap-mips64-linux.c +++ b/coregrind/m_syswrap/syswrap-mips64-linux.c @@ -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), diff --git a/coregrind/m_transtab.c b/coregrind/m_transtab.c index 6ef9ceae29..ef2e3df863 100644 --- a/coregrind/m_transtab.c +++ b/coregrind/m_transtab.c @@ -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. */ diff --git a/coregrind/m_vkiscnums.c b/coregrind/m_vkiscnums.c index 03a64a4f90..996345e91e 100644 --- a/coregrind/m_vkiscnums.c +++ b/coregrind/m_vkiscnums.c @@ -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); diff --git a/coregrind/pub_core_machine.h b/coregrind/pub_core_machine.h index a8b8bc852f..d6af843df2 100644 --- a/coregrind/pub_core_machine.h +++ b/coregrind/pub_core_machine.h @@ -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 diff --git a/coregrind/pub_core_mallocfree.h b/coregrind/pub_core_mallocfree.h index b59717bc08..5ed01d340d 100644 --- a/coregrind/pub_core_mallocfree.h +++ b/coregrind/pub_core_mallocfree.h @@ -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) || \ diff --git a/drd/drd_bitmap.h b/drd/drd_bitmap.h index 488d895338..bf53164446 100644 --- a/drd/drd_bitmap.h +++ b/drd/drd_bitmap.h @@ -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. diff --git a/include/pub_tool_basics.h b/include/pub_tool_basics.h index ef0aa74e19..9ad0f70d72 100644 --- a/include/pub_tool_basics.h +++ b/include/pub_tool_basics.h @@ -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; diff --git a/include/vki/vki-mips64-linux.h b/include/vki/vki-mips64-linux.h index 34ee6f4e32..cedee0be3e 100644 --- a/include/vki/vki-mips64-linux.h +++ b/include/vki/vki-mips64-linux.h @@ -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 diff --git a/include/vki/vki-scnums-mips64-linux.h b/include/vki/vki-scnums-mips64-linux.h index 1a15bf8045..7481768fdf 100644 --- a/include/vki/vki-scnums-mips64-linux.h +++ b/include/vki/vki-scnums-mips64-linux.h @@ -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 */ /*--------------------------------------------------------------------*/ diff --git a/memcheck/mc_main.c b/memcheck/mc_main.c index 6908942cce..f1dc900c2a 100644 --- a/memcheck/mc_main.c +++ b/memcheck/mc_main.c @@ -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];