annotate libsanitizer/sanitizer_common/sanitizer_rtems.cpp @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 //===-- sanitizer_rtems.cpp -----------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 // This file is shared between various sanitizers' runtime libraries and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 // implements RTEMS-specific functions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 #include "sanitizer_rtems.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 #if SANITIZER_RTEMS
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 #define posix_memalign __real_posix_memalign
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 #define free __real_free
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 #define memset __real_memset
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #include "sanitizer_file.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 #include "sanitizer_symbolizer.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 #include <errno.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 #include <fcntl.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 #include <pthread.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 #include <sched.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 #include <stdio.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 #include <stdlib.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 #include <string.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 #include <unistd.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 // There is no mmap on RTEMS. Use memalign, etc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 #define __mmap_alloc_aligned posix_memalign
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 #define __mmap_free free
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 #define __mmap_memset memset
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 namespace __sanitizer {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 #include "sanitizer_syscall_generic.inc"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 void NORETURN internal__exit(int exitcode) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 _exit(exitcode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 uptr internal_sched_yield() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 return sched_yield();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 uptr internal_getpid() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 return getpid();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 bool FileExists(const char *filename) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 struct stat st;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 if (stat(filename, &st))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 // Sanity check: filename is a regular file.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 return S_ISREG(st.st_mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 uptr GetThreadSelf() { return static_cast<uptr>(pthread_self()); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 tid_t GetTid() { return GetThreadSelf(); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 void Abort() { abort(); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 int Atexit(void (*function)(void)) { return atexit(function); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 void SleepForSeconds(int seconds) { sleep(seconds); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 void SleepForMillis(int millis) { usleep(millis * 1000); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 bool SupportsColoredOutput(fd_t fd) { return false; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 void GetThreadStackTopAndBottom(bool at_initialization,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 uptr *stack_top, uptr *stack_bottom) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 pthread_attr_t attr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 pthread_attr_init(&attr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 CHECK_EQ(pthread_getattr_np(pthread_self(), &attr), 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 void *base = nullptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 size_t size = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 CHECK_EQ(pthread_attr_getstack(&attr, &base, &size), 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 CHECK_EQ(pthread_attr_destroy(&attr), 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 *stack_bottom = reinterpret_cast<uptr>(base);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 *stack_top = *stack_bottom + size;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 void GetThreadStackAndTls(bool main, uptr *stk_addr, uptr *stk_size,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 uptr *tls_addr, uptr *tls_size) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 uptr stack_top, stack_bottom;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 GetThreadStackTopAndBottom(main, &stack_top, &stack_bottom);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 *stk_addr = stack_bottom;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 *stk_size = stack_top - stack_bottom;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 *tls_addr = *tls_size = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 void InitializePlatformEarly() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 void MaybeReexec() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 void CheckASLR() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 void CheckMPROTECT() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 void DisableCoreDumperIfNecessary() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 void InstallDeadlySignalHandlers(SignalHandlerType handler) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 void SetAlternateSignalStack() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 void UnsetAlternateSignalStack() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 void InitTlsSize() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 void PrintModuleMap() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 void SignalContext::DumpAllRegisters(void *context) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 const char *DescribeSignalOrException(int signo) { UNIMPLEMENTED(); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 enum MutexState { MtxUnlocked = 0, MtxLocked = 1, MtxSleeping = 2 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 BlockingMutex::BlockingMutex() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 internal_memset(this, 0, sizeof(*this));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 void BlockingMutex::Lock() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 CHECK_EQ(owner_, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 atomic_uint32_t *m = reinterpret_cast<atomic_uint32_t *>(&opaque_storage_);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 if (atomic_exchange(m, MtxLocked, memory_order_acquire) == MtxUnlocked)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 while (atomic_exchange(m, MtxSleeping, memory_order_acquire) != MtxUnlocked) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 internal_sched_yield();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 void BlockingMutex::Unlock() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 atomic_uint32_t *m = reinterpret_cast<atomic_uint32_t *>(&opaque_storage_);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 u32 v = atomic_exchange(m, MtxUnlocked, memory_order_release);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 CHECK_NE(v, MtxUnlocked);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 void BlockingMutex::CheckLocked() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 atomic_uint32_t *m = reinterpret_cast<atomic_uint32_t *>(&opaque_storage_);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 CHECK_NE(MtxUnlocked, atomic_load(m, memory_order_relaxed));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 uptr GetPageSize() { return getpagesize(); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 uptr GetMmapGranularity() { return GetPageSize(); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 uptr GetMaxVirtualAddress() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 return (1ULL << 32) - 1; // 0xffffffff
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 void *MmapOrDie(uptr size, const char *mem_type, bool raw_report) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 void* ptr = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 int res = __mmap_alloc_aligned(&ptr, GetPageSize(), size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 if (UNLIKELY(res))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 ReportMmapFailureAndDie(size, mem_type, "allocate", res, raw_report);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 __mmap_memset(ptr, 0, size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 IncreaseTotalMmap(size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 return ptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 void *MmapOrDieOnFatalError(uptr size, const char *mem_type) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 void* ptr = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 int res = __mmap_alloc_aligned(&ptr, GetPageSize(), size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 if (UNLIKELY(res)) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 if (res == ENOMEM)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 return nullptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 ReportMmapFailureAndDie(size, mem_type, "allocate", false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 __mmap_memset(ptr, 0, size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 IncreaseTotalMmap(size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 return ptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 void *MmapAlignedOrDieOnFatalError(uptr size, uptr alignment,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 const char *mem_type) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 CHECK(IsPowerOfTwo(size));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 CHECK(IsPowerOfTwo(alignment));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 void* ptr = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 int res = __mmap_alloc_aligned(&ptr, alignment, size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 if (res)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 ReportMmapFailureAndDie(size, mem_type, "align allocate", res, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 __mmap_memset(ptr, 0, size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 IncreaseTotalMmap(size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 return ptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 void *MmapNoReserveOrDie(uptr size, const char *mem_type) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 return MmapOrDie(size, mem_type, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 void UnmapOrDie(void *addr, uptr size) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 if (!addr || !size) return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 __mmap_free(addr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 DecreaseTotalMmap(size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 fd_t OpenFile(const char *filename, FileAccessMode mode, error_t *errno_p) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 int flags;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 switch (mode) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 case RdOnly: flags = O_RDONLY; break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 case WrOnly: flags = O_WRONLY | O_CREAT | O_TRUNC; break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 case RdWr: flags = O_RDWR | O_CREAT; break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 fd_t res = open(filename, flags, 0660);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 if (internal_iserror(res, errno_p))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 return kInvalidFd;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 return res;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 void CloseFile(fd_t fd) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 close(fd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 bool ReadFromFile(fd_t fd, void *buff, uptr buff_size, uptr *bytes_read,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 error_t *error_p) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 uptr res = read(fd, buff, buff_size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 if (internal_iserror(res, error_p))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 if (bytes_read)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 *bytes_read = res;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 bool WriteToFile(fd_t fd, const void *buff, uptr buff_size, uptr *bytes_written,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 error_t *error_p) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 uptr res = write(fd, buff, buff_size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 if (internal_iserror(res, error_p))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 if (bytes_written)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 *bytes_written = res;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 void ReleaseMemoryPagesToOS(uptr beg, uptr end) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 void DumpProcessMap() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 // There is no page protection so everything is "accessible."
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 bool IsAccessibleMemoryRange(uptr beg, uptr size) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 char **GetArgv() { return nullptr; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 char **GetEnviron() { return nullptr; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 const char *GetEnv(const char *name) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 return getenv(name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 uptr ReadBinaryName(/*out*/char *buf, uptr buf_len) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 internal_strncpy(buf, "StubBinaryName", buf_len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 return internal_strlen(buf);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 uptr ReadLongProcessName(/*out*/ char *buf, uptr buf_len) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 internal_strncpy(buf, "StubProcessName", buf_len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 return internal_strlen(buf);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 bool IsPathSeparator(const char c) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 return c == '/';
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 bool IsAbsolutePath(const char *path) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 return path != nullptr && IsPathSeparator(path[0]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 void ReportFile::Write(const char *buffer, uptr length) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 SpinMutexLock l(mu);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 static const char *kWriteError =
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 "ReportFile::Write() can't output requested buffer!\n";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 ReopenIfNecessary();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 if (length != write(fd, buffer, length)) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 write(fd, kWriteError, internal_strlen(kWriteError));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 Die();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 uptr MainThreadStackBase, MainThreadStackSize;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 uptr MainThreadTlsBase, MainThreadTlsSize;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 } // namespace __sanitizer
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 #endif // SANITIZER_RTEMS