1 1.1 kamil //===- FuzzerShmem.h - shared memory interface ------------------*- C++ -* ===// 2 1.1 kamil // 3 1.1 kamil // The LLVM Compiler Infrastructure 4 1.1 kamil // 5 1.1 kamil // This file is distributed under the University of Illinois Open Source 6 1.1 kamil // License. See LICENSE.TXT for details. 7 1.1 kamil // 8 1.1 kamil //===----------------------------------------------------------------------===// 9 1.1 kamil // SharedMemoryRegion 10 1.1 kamil //===----------------------------------------------------------------------===// 11 1.1 kamil 12 1.1 kamil #ifndef LLVM_FUZZER_SHMEM_H 13 1.1 kamil #define LLVM_FUZZER_SHMEM_H 14 1.1 kamil 15 1.1 kamil #include <algorithm> 16 1.1 kamil #include <cstring> 17 1.1 kamil #include <string> 18 1.1 kamil 19 1.1 kamil #include "FuzzerDefs.h" 20 1.1 kamil 21 1.1 kamil namespace fuzzer { 22 1.1 kamil 23 1.1 kamil class SharedMemoryRegion { 24 1.1 kamil public: 25 1.1 kamil bool Create(const char *Name); 26 1.1 kamil bool Open(const char *Name); 27 1.1 kamil bool Destroy(const char *Name); 28 1.1 kamil uint8_t *GetData() { return Data; } 29 1.1 kamil void PostServer() {Post(0);} 30 1.1 kamil void WaitServer() {Wait(0);} 31 1.1 kamil void PostClient() {Post(1);} 32 1.1 kamil void WaitClient() {Wait(1);} 33 1.1 kamil 34 1.1 kamil size_t WriteByteArray(const uint8_t *Bytes, size_t N) { 35 1.1 kamil assert(N <= kShmemSize - sizeof(N)); 36 1.1 kamil memcpy(GetData(), &N, sizeof(N)); 37 1.1 kamil memcpy(GetData() + sizeof(N), Bytes, N); 38 1.1 kamil assert(N == ReadByteArraySize()); 39 1.1 kamil return N; 40 1.1 kamil } 41 1.1 kamil size_t ReadByteArraySize() { 42 1.1 kamil size_t Res; 43 1.1 kamil memcpy(&Res, GetData(), sizeof(Res)); 44 1.1 kamil return Res; 45 1.1 kamil } 46 1.1 kamil uint8_t *GetByteArray() { return GetData() + sizeof(size_t); } 47 1.1 kamil 48 1.1 kamil bool IsServer() const { return Data && IAmServer; } 49 1.1 kamil bool IsClient() const { return Data && !IAmServer; } 50 1.1 kamil 51 1.1 kamil private: 52 1.1 kamil 53 1.1 kamil static const size_t kShmemSize = 1 << 22; 54 1.1 kamil bool IAmServer; 55 1.1 kamil std::string Path(const char *Name); 56 1.1 kamil std::string SemName(const char *Name, int Idx); 57 1.1 kamil void Post(int Idx); 58 1.1 kamil void Wait(int Idx); 59 1.1 kamil 60 1.1 kamil bool Map(int fd); 61 1.1 kamil uint8_t *Data = nullptr; 62 1.1 kamil void *Semaphore[2]; 63 1.1 kamil }; 64 1.1 kamil 65 1.1 kamil extern SharedMemoryRegion SMR; 66 1.1 kamil 67 1.1 kamil } // namespace fuzzer 68 1.1 kamil 69 1.1 kamil #endif // LLVM_FUZZER_SHMEM_H 70