1 1.1 mrg //===-- sanitizer_solaris.cpp ---------------------------------------------===// 2 1.1 mrg // 3 1.1 mrg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 1.1 mrg // See https://llvm.org/LICENSE.txt for license information. 5 1.1 mrg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 1.1 mrg // 7 1.1 mrg //===----------------------------------------------------------------------===// 8 1.1 mrg // 9 1.1 mrg // This file is shared between various sanitizers' runtime libraries and 10 1.1 mrg // implements Solaris-specific functions. 11 1.1 mrg //===----------------------------------------------------------------------===// 12 1.1 mrg 13 1.1 mrg #include "sanitizer_platform.h" 14 1.1 mrg #if SANITIZER_SOLARIS 15 1.1 mrg 16 1.1 mrg #include <stdio.h> 17 1.1 mrg 18 1.1 mrg #include "sanitizer_common.h" 19 1.1 mrg #include "sanitizer_flags.h" 20 1.1 mrg #include "sanitizer_internal_defs.h" 21 1.1 mrg #include "sanitizer_libc.h" 22 1.1 mrg #include "sanitizer_placement_new.h" 23 1.1 mrg #include "sanitizer_platform_limits_posix.h" 24 1.1 mrg #include "sanitizer_procmaps.h" 25 1.1 mrg 26 1.1 mrg #include <fcntl.h> 27 1.1 mrg #include <pthread.h> 28 1.1 mrg #include <sched.h> 29 1.1 mrg #include <thread.h> 30 1.1 mrg #include <synch.h> 31 1.1 mrg #include <signal.h> 32 1.1 mrg #include <sys/mman.h> 33 1.1 mrg #include <sys/resource.h> 34 1.1 mrg #include <sys/stat.h> 35 1.1 mrg #include <sys/types.h> 36 1.1 mrg #include <dirent.h> 37 1.1 mrg #include <unistd.h> 38 1.1 mrg #include <errno.h> 39 1.1 mrg #include <stdlib.h> 40 1.1 mrg 41 1.1 mrg namespace __sanitizer { 42 1.1 mrg 43 1.1 mrg //#include "sanitizer_syscall_generic.inc" 44 1.1 mrg 45 1.1 mrg #define _REAL(func) _ ## func 46 1.1 mrg #define DECLARE__REAL(ret_type, func, ...) \ 47 1.1 mrg extern "C" ret_type _REAL(func)(__VA_ARGS__) 48 1.1 mrg #define DECLARE__REAL_AND_INTERNAL(ret_type, func, ...) \ 49 1.1 mrg DECLARE__REAL(ret_type, func, __VA_ARGS__); \ 50 1.1 mrg ret_type internal_ ## func(__VA_ARGS__) 51 1.1 mrg 52 1.1 mrg #if !defined(_LP64) && _FILE_OFFSET_BITS == 64 53 1.1 mrg #define _REAL64(func) _ ## func ## 64 54 1.1 mrg #else 55 1.1 mrg #define _REAL64(func) _REAL(func) 56 1.1 mrg #endif 57 1.1 mrg #define DECLARE__REAL64(ret_type, func, ...) \ 58 1.1 mrg extern "C" ret_type _REAL64(func)(__VA_ARGS__) 59 1.1 mrg #define DECLARE__REAL_AND_INTERNAL64(ret_type, func, ...) \ 60 1.1 mrg DECLARE__REAL64(ret_type, func, __VA_ARGS__); \ 61 1.1 mrg ret_type internal_ ## func(__VA_ARGS__) 62 1.1 mrg 63 1.1 mrg // ---------------------- sanitizer_libc.h 64 1.1 mrg DECLARE__REAL_AND_INTERNAL64(uptr, mmap, void *addr, uptr /*size_t*/ length, 65 1.1 mrg int prot, int flags, int fd, OFF_T offset) { 66 1.1 mrg return (uptr)_REAL64(mmap)(addr, length, prot, flags, fd, offset); 67 1.1 mrg } 68 1.1 mrg 69 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, munmap, void *addr, uptr length) { 70 1.1 mrg return _REAL(munmap)(addr, length); 71 1.1 mrg } 72 1.1 mrg 73 1.1 mrg DECLARE__REAL_AND_INTERNAL(int, mprotect, void *addr, uptr length, int prot) { 74 1.1 mrg return _REAL(mprotect)(addr, length, prot); 75 1.1 mrg } 76 1.1 mrg 77 1.3 mrg // Illumos' declaration of madvise cannot be made visible if _XOPEN_SOURCE 78 1.3 mrg // is defined as g++ does on Solaris. 79 1.3 mrg // 80 1.3 mrg // This declaration is consistent with Solaris 11.4. Both Illumos and Solaris 81 1.3 mrg // versions older than 11.4 declared madvise with a caddr_t as the first 82 1.3 mrg // argument, but we don't currently support Solaris versions older than 11.4, 83 1.3 mrg // and as mentioned above the declaration is not visible on Illumos so we can 84 1.3 mrg // use any declaration we like on Illumos. 85 1.3 mrg extern "C" int madvise(void *, size_t, int); 86 1.3 mrg 87 1.3 mrg int internal_madvise(uptr addr, uptr length, int advice) { 88 1.3 mrg return madvise((void *)addr, length, advice); 89 1.3 mrg } 90 1.3 mrg 91 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, close, fd_t fd) { 92 1.1 mrg return _REAL(close)(fd); 93 1.1 mrg } 94 1.1 mrg 95 1.1 mrg extern "C" int _REAL64(open)(const char *, int, ...); 96 1.1 mrg 97 1.1 mrg uptr internal_open(const char *filename, int flags) { 98 1.1 mrg return _REAL64(open)(filename, flags); 99 1.1 mrg } 100 1.1 mrg 101 1.1 mrg uptr internal_open(const char *filename, int flags, u32 mode) { 102 1.1 mrg return _REAL64(open)(filename, flags, mode); 103 1.1 mrg } 104 1.1 mrg 105 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, read, fd_t fd, void *buf, uptr count) { 106 1.1 mrg return _REAL(read)(fd, buf, count); 107 1.1 mrg } 108 1.1 mrg 109 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, write, fd_t fd, const void *buf, uptr count) { 110 1.1 mrg return _REAL(write)(fd, buf, count); 111 1.1 mrg } 112 1.1 mrg 113 1.1 mrg // FIXME: There's only _ftruncate64 beginning with Solaris 11. 114 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, ftruncate, fd_t fd, uptr size) { 115 1.1 mrg return ftruncate(fd, size); 116 1.1 mrg } 117 1.1 mrg 118 1.1 mrg DECLARE__REAL_AND_INTERNAL64(uptr, stat, const char *path, void *buf) { 119 1.1 mrg return _REAL64(stat)(path, (struct stat *)buf); 120 1.1 mrg } 121 1.1 mrg 122 1.1 mrg DECLARE__REAL_AND_INTERNAL64(uptr, lstat, const char *path, void *buf) { 123 1.1 mrg return _REAL64(lstat)(path, (struct stat *)buf); 124 1.1 mrg } 125 1.1 mrg 126 1.1 mrg DECLARE__REAL_AND_INTERNAL64(uptr, fstat, fd_t fd, void *buf) { 127 1.1 mrg return _REAL64(fstat)(fd, (struct stat *)buf); 128 1.1 mrg } 129 1.1 mrg 130 1.1 mrg uptr internal_filesize(fd_t fd) { 131 1.1 mrg struct stat st; 132 1.1 mrg if (internal_fstat(fd, &st)) 133 1.1 mrg return -1; 134 1.1 mrg return (uptr)st.st_size; 135 1.1 mrg } 136 1.1 mrg 137 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, dup, int oldfd) { 138 1.1 mrg return _REAL(dup)(oldfd); 139 1.1 mrg } 140 1.1 mrg 141 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, dup2, int oldfd, int newfd) { 142 1.1 mrg return _REAL(dup2)(oldfd, newfd); 143 1.1 mrg } 144 1.1 mrg 145 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, readlink, const char *path, char *buf, 146 1.1 mrg uptr bufsize) { 147 1.1 mrg return _REAL(readlink)(path, buf, bufsize); 148 1.1 mrg } 149 1.1 mrg 150 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, unlink, const char *path) { 151 1.1 mrg return _REAL(unlink)(path); 152 1.1 mrg } 153 1.1 mrg 154 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, rename, const char *oldpath, 155 1.1 mrg const char *newpath) { 156 1.1 mrg return _REAL(rename)(oldpath, newpath); 157 1.1 mrg } 158 1.1 mrg 159 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, sched_yield, void) { 160 1.1 mrg return sched_yield(); 161 1.1 mrg } 162 1.1 mrg 163 1.3 mrg DECLARE__REAL_AND_INTERNAL(void, usleep, u64 useconds) { 164 1.3 mrg struct timespec ts; 165 1.3 mrg ts.tv_sec = useconds / 1000000; 166 1.3 mrg ts.tv_nsec = (useconds % 1000000) * 1000; 167 1.3 mrg nanosleep(&ts, nullptr); 168 1.1 mrg } 169 1.1 mrg 170 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, execve, const char *filename, 171 1.1 mrg char *const argv[], char *const envp[]) { 172 1.1 mrg return _REAL(execve)(filename, argv, envp); 173 1.1 mrg } 174 1.1 mrg 175 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, waitpid, int pid, int *status, int options) { 176 1.1 mrg return _REAL(waitpid)(pid, status, options); 177 1.1 mrg } 178 1.1 mrg 179 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, getpid, void) { 180 1.1 mrg return _REAL(getpid)(); 181 1.1 mrg } 182 1.1 mrg 183 1.1 mrg // FIXME: This might be wrong: _getdents doesn't take a struct linux_dirent *. 184 1.1 mrg DECLARE__REAL_AND_INTERNAL64(uptr, getdents, fd_t fd, struct linux_dirent *dirp, 185 1.1 mrg unsigned int count) { 186 1.1 mrg return _REAL64(getdents)(fd, dirp, count); 187 1.1 mrg } 188 1.1 mrg 189 1.1 mrg DECLARE__REAL_AND_INTERNAL64(uptr, lseek, fd_t fd, OFF_T offset, int whence) { 190 1.1 mrg return _REAL64(lseek)(fd, offset, whence); 191 1.1 mrg } 192 1.1 mrg 193 1.1 mrg // FIXME: This might be wrong: _sigfillset doesn't take a 194 1.1 mrg // __sanitizer_sigset_t *. 195 1.1 mrg DECLARE__REAL_AND_INTERNAL(void, sigfillset, __sanitizer_sigset_t *set) { 196 1.1 mrg _REAL(sigfillset)(set); 197 1.1 mrg } 198 1.1 mrg 199 1.1 mrg // FIXME: This might be wrong: _sigprocmask doesn't take __sanitizer_sigset_t *. 200 1.1 mrg DECLARE__REAL_AND_INTERNAL(uptr, sigprocmask, int how, 201 1.1 mrg __sanitizer_sigset_t *set, 202 1.1 mrg __sanitizer_sigset_t *oldset) { 203 1.1 mrg return _REAL(sigprocmask)(how, set, oldset); 204 1.1 mrg } 205 1.1 mrg 206 1.1 mrg DECLARE__REAL_AND_INTERNAL(int, fork, void) { 207 1.1 mrg // TODO(glider): this may call user's pthread_atfork() handlers which is bad. 208 1.1 mrg return _REAL(fork)(); 209 1.1 mrg } 210 1.1 mrg 211 1.1 mrg u64 NanoTime() { 212 1.1 mrg return gethrtime(); 213 1.1 mrg } 214 1.1 mrg 215 1.1 mrg uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp) { 216 1.1 mrg // FIXME: No internal variant. 217 1.1 mrg return clock_gettime(clk_id, (timespec *)tp); 218 1.1 mrg } 219 1.1 mrg 220 1.1 mrg // ----------------- sanitizer_common.h 221 1.3 mrg void FutexWait(atomic_uint32_t *p, u32 cmp) { 222 1.3 mrg // FIXME: implement actual blocking. 223 1.3 mrg sched_yield(); 224 1.1 mrg } 225 1.1 mrg 226 1.3 mrg void FutexWake(atomic_uint32_t *p, u32 count) {} 227 1.1 mrg 228 1.1 mrg } // namespace __sanitizer 229 1.1 mrg 230 1.1 mrg #endif // SANITIZER_SOLARIS 231