blob: 45f94e9e0abd06ce926417014d2c2a64f8ffb38f [file] [log] [blame]
Kostya Serebryany019b76f2011-11-30 01:07:02 +00001//===-- asan_linux.cc -----------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file is a part of AddressSanitizer, an address sanity checker.
11//
12// Linux-specific details.
13//===----------------------------------------------------------------------===//
Kostya Serebryany5dfa4da2011-12-01 21:40:52 +000014#ifdef __linux__
Kostya Serebryany019b76f2011-11-30 01:07:02 +000015
16#include "asan_internal.h"
17
18#include <sys/mman.h>
19#include <sys/syscall.h>
Kostya Serebryany6c4bd802011-12-28 22:58:01 +000020#include <sys/types.h>
21#include <fcntl.h>
Kostya Serebryany019b76f2011-11-30 01:07:02 +000022#include <unistd.h>
23
24extern char _DYNAMIC[];
25
26namespace __asan {
27
28void *AsanDoesNotSupportStaticLinkage() {
29 // This will fail to link with -static.
30 return &_DYNAMIC;
31}
32
Kostya Serebryany019b76f2011-11-30 01:07:02 +000033void *asan_mmap(void *addr, size_t length, int prot, int flags,
34 int fd, uint64_t offset) {
35# if __WORDSIZE == 64
Kostya Serebryany6c4bd802011-12-28 22:58:01 +000036 return (void *)syscall(__NR_mmap, addr, length, prot, flags, fd, offset);
Kostya Serebryany019b76f2011-11-30 01:07:02 +000037# else
Kostya Serebryany6c4bd802011-12-28 22:58:01 +000038 return (void *)syscall(__NR_mmap2, addr, length, prot, flags, fd, offset);
Kostya Serebryany019b76f2011-11-30 01:07:02 +000039# endif
40}
41
Kostya Serebryany6c4bd802011-12-28 22:58:01 +000042void *AsanMmapSomewhereOrDie(size_t size, const char *mem_type) {
43 size = RoundUpTo(size, kPageSize);
44 void *res = asan_mmap(0, size,
45 PROT_READ | PROT_WRITE,
46 MAP_PRIVATE | MAP_ANON, -1, 0);
47 if (res == (void*)-1) {
48 OutOfMemoryMessageAndDie(mem_type, size);
49 }
50 return res;
51}
52
53void AsanUnmapOrDie(void *addr, size_t size) {
54 if (!addr || !size) return;
55 int res = syscall(__NR_munmap, addr, size);
56 if (res != 0) {
57 Report("Failed to unmap\n");
58 ASAN_DIE;
59 }
60}
61
62ssize_t AsanWrite(int fd, const void *buf, size_t count) {
63 return (ssize_t)syscall(__NR_write, fd, buf, count);
64}
65
66int AsanOpenReadonly(const char* filename) {
67 return open(filename, O_RDONLY);
68}
69
70ssize_t AsanRead(int fd, void *buf, size_t count) {
71 return (ssize_t)syscall(__NR_read, fd, buf, count);
72}
73
74int AsanClose(int fd) {
75 return close(fd);
Kostya Serebryany019b76f2011-11-30 01:07:02 +000076}
77
78} // namespace __asan
Kostya Serebryany5dfa4da2011-12-01 21:40:52 +000079
80#endif // __linux__