mirror of
git://sourceware.org/git/valgrind.git
synced 2026-01-12 00:19:31 +08:00
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:
@@ -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
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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)
|
||||
|
||||
31
configure.ac
31
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])
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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: \
|
||||
|
||||
@@ -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... */
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) || \
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user