sanitizer_win.cc revision ed996f79710f532bf231537e44d5c8c9c9d57e8d
17f9c5a220b2768a450696bbd157a0e6f2e9ceea3Alexey Samsonov//===-- sanitizer_win.cc --------------------------------------------------===//
2c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//
3c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//                     The LLVM Compiler Infrastructure
4c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//
5c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// This file is distributed under the University of Illinois Open Source
6c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// License. See LICENSE.TXT for details.
7c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//
8c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//===----------------------------------------------------------------------===//
9c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//
10c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// This file is shared between AddressSanitizer and ThreadSanitizer
11c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// run-time libraries and implements windows-specific functions from
12c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// sanitizer_libc.h.
13c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//===----------------------------------------------------------------------===//
14c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#ifdef _WIN32
15c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#include <windows.h>
16c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
179929ffd1c4737d2c50829dcefcb0b8f1926a05ffAlexey Samsonov#include "sanitizer_common.h"
18c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#include "sanitizer_libc.h"
19c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
20c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonovnamespace __sanitizer {
21c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
22e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov// --------------------- sanitizer_common.h
23230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonovint GetPid() {
24230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov  return GetProcessId(GetCurrentProcess());
25230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov}
26230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov
27ed996f79710f532bf231537e44d5c8c9c9d57e8dAlexey Samsonovvoid GetThreadStackTopAndBottom(bool at_initialization, uptr *stack_top,
28e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov                                uptr *stack_bottom) {
29e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov  CHECK(stack_top);
30e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov  CHECK(stack_bottom);
31e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov  MEMORY_BASIC_INFORMATION mbi;
32e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov  CHECK(VirtualQuery(&mbi /* on stack */, &mbi, sizeof(mbi)) != 0);
33e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov  // FIXME: is it possible for the stack to not be a single allocation?
34e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov  // Are these values what ASan expects to get (reserved, not committed;
35e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov  // including stack guard page) ?
36e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov  *stack_top = (uptr)mbi.BaseAddress + mbi.RegionSize;
37e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov  *stack_bottom = (uptr)mbi.AllocationBase;
38e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov}
39e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov
40e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov
41a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonovvoid *MmapOrDie(uptr size, const char *mem_type) {
42230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov  void *rv = VirtualAlloc(0, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
43a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov  if (rv == 0) {
44a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov    Report("ERROR: Failed to allocate 0x%zx (%zd) bytes of %s\n",
45a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov           size, size, mem_type);
46a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov    CHECK("unable to mmap" && 0);
47a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov  }
48230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov  return rv;
49230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov}
50230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov
51230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonovvoid UnmapOrDie(void *addr, uptr size) {
528c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  if (VirtualFree(addr, size, MEM_DECOMMIT) == 0) {
53a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov    Report("ERROR: Failed to deallocate 0x%zx (%zd) bytes at address %p\n",
54a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov           size, size, addr);
55a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov    CHECK("unable to unmap" && 0);
568c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  }
57230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov}
58230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov
59e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov// ------------------ sanitizer_libc.h
60c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonovvoid *internal_mmap(void *addr, uptr length, int prot, int flags,
61c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov                    int fd, u64 offset) {
628c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
63c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov}
64c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
651f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonovint internal_munmap(void *addr, uptr length) {
668c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
671f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov}
681f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov
69a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovint internal_close(fd_t fd) {
708c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
71a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov}
72a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov
73c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonovfd_t internal_open(const char *filename, bool write) {
748c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
75c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov}
76c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
77a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovuptr internal_read(fd_t fd, void *buf, uptr count) {
788c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
79a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov}
80a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov
81a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovuptr internal_write(fd_t fd, const void *buf, uptr count) {
828c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  if (fd != 2)
838c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov    UNIMPLEMENTED();
84a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov  HANDLE err = GetStdHandle(STD_ERROR_HANDLE);
85a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov  if (err == 0)
86a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov    return 0;  // FIXME: this might not work on some apps.
87a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov  DWORD ret;
88a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov  if (!WriteFile(err, buf, count, &ret, 0))
89a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov    return 0;
90a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov  return ret;
91a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov}
92a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov
938e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonovuptr internal_filesize(fd_t fd) {
948c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
958e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov}
968e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov
978e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonovint internal_dup2(int oldfd, int newfd) {
988c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
998e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov}
1008e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov
1011f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonovint internal_sscanf(const char *str, const char *format, ...) {
1028c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov  UNIMPLEMENTED();
1031f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov}
1041f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov
105c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov}  // namespace __sanitizer
106c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov
107c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#endif  // _WIN32
108