Home | History | Annotate | Line # | Download | only in fuzzer
      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