]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
mips64: add N32 ABI support
authorPetar Jovanovic <mips32r2@gmail.com>
Thu, 14 Jun 2018 15:26:09 +0000 (15:26 +0000)
committerPetar Jovanovic <mips32r2@gmail.com>
Thu, 14 Jun 2018 17:40:08 +0000 (17:40 +0000)
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.

19 files changed:
Makefile.all.am
Makefile.tool-tests.am
VEX/pub/libvex_basictypes.h
configure.ac
coregrind/launcher-linux.c
coregrind/m_debuginfo/debuginfo.c
coregrind/m_dispatch/dispatch-mips64-linux.S
coregrind/m_redir.c
coregrind/m_syswrap/syscall-mips64-linux.S
coregrind/m_syswrap/syswrap-mips64-linux.c
coregrind/m_transtab.c
coregrind/m_vkiscnums.c
coregrind/pub_core_machine.h
coregrind/pub_core_mallocfree.h
drd/drd_bitmap.h
include/pub_tool_basics.h
include/vki/vki-mips64-linux.h
include/vki/vki-scnums-mips64-linux.h
memcheck/mc_main.c

index 30e79dd5653944c0e671cf85a535765f92838933..4a29695cce1d709301a18390cf8d9a44737bf620 100644 (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
index b27724fbb3c0bd742396de66480b38d292c860c5..752b9678e4e6a527a667b0dc9b49c187bc7f5938 100644 (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 \
index d633cde63eeae063b83c2e446b109b05acf79f25..53aa2cd3830ee4b6f9752769cc665f69ae369c44 100644 (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)
index 03704981de8ba5777c14db1d997ac4c281757a9b..306fbc78e7ed4e9a4d5d4cc0552e0be83fab3022 100644 (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])
index 8e7c73475a0c344053b34aecfbea78d7f3272619..105d023a545ba5d3c7b2e80fcb5ba97b24292ad9 100644 (file)
 #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) {
index b8502936836f50a301d95a156fc3a46ae80970cc..13991b69a8c80ad4bb3c2f3c614701037ca08406 100644 (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:                           \
index dc2beee138c139558ba4ae994408463daa499991..4a2b1b734e29481925ea8b63fa96b62e3f16fab5 100644 (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... */
 
index aa65eafaad6009d43f99f5b1adcd08415c7c8d96..57a97a4796f49a392b5e9c0307331192d1dc19d7 100644 (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)
index 8cc2ac0611bc28c30dcda500599e80b11f2f17b4..df30d0eb399b85690f883497dda11deffbc12264 100644 (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)
 
index c644ecd711a000cf9f2e066280feeaa20e915584..062fb38044a0cd349fae21f2c6f66e8c6551d6c0 100644 (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),
index 6ef9ceae2951b6fa83b99d2b9efc26a8d55589d3..ef2e3df863cb55fcebebf4ae4277cb52b8d9ffaa 100644 (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. */
index 03a64a4f9019f4a9718e988849a54a48e3a5f87b..996345e91e1ae38c70d25ce54dab9de0ab808230 100644 (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);
index a8b8bc852f9f91987906335e5aa5b3d7ce9ee021..d6af843df21d1ee0f22809852357494e894d0288 100644 (file)
 #    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
index b59717bc084d4d5d2e2fbbec623a02702747a814..5ed01d340d7700833c5e27d9ba8d44c335898466 100644 (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)    || \
index 488d895338fe77cfbd2b32a76ffcdfb18011d08d..bf5316444688b616ff71d7de9aa83228d95965aa 100644 (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.
index ef0aa74e19300e08844fb9b49daa975c76856e54..9ad0f70d72b37d53ae298c53a75a7fab1672cdb5 100644 (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;
index 34ee6f4e32f7cfa96950d6b3bfca9af555a9b85a..cedee0be3eba5cff1f39c13ee7e6ed1f455a0edc 100644 (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
index 1a15bf80452978dfcaea3e4f692b3241a8550908..7481768fdf29e37b8a6924d186be609bcbd9f8f2 100644 (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.
  */
 #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 */
 
 /*--------------------------------------------------------------------*/
index 6908942cce97cb6f47c0a9428672da906135c720..f1dc900c2ae87bb4a2d377cae90d756d1edf7f17 100644 (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];