// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_LIB_FUZZING_FIDL_SHARED_MEMORY_H_
#define SRC_LIB_FUZZING_FIDL_SHARED_MEMORY_H_

#include <lib/fxl/macros.h>
#include <lib/zx/vmo.h>
#include <stddef.h>
#include <stdint.h>
#include <zircon/types.h>

namespace fuzzing {

// This small utility class can be used to share VMOs mapped into multiple processes. For example,
// for a given |max_size|, a FIDL client of some service might do the following (error-checking
// omitted):
//
//   SharedMemory shmem;
//   shmem.Create(max_size);
//   fuchsia.mem.Buffer buffer;
//   shmem.Share(&buffer.vmo);
//
// The service might then do (again, error-checking omitted):
//
//   SharedMemory shmem;
//   shmem.Link(buffer.vmo);
//
class SharedMemory {
 public:
  SharedMemory();
  SharedMemory(SharedMemory &&other);
  virtual ~SharedMemory();

  bool is_mapped() const { return addr_ != 0; }
  const zx::vmo &vmo() const { return vmo_; }
  zx_vaddr_t addr() const { return addr_; }
  template <typename T>
  T *begin() const {
    return reinterpret_cast<T *>(addr_);
  }
  template <typename T>
  T *end() const {
    return reinterpret_cast<T *>(addr_ + len_);
  }
  size_t len() const { return len_; }

  // Create a VMO of at least |len| bytes and map it. This method can be called at most once, and is
  // exclusive with |Link|.
  virtual zx_status_t Create(size_t len);

  // Duplicate the underlying VMO and return it via |out|. This is typically called after |Create|,
  // but it does not need to be called immediately. For example, the VMO may be created and mapped
  // early, and shared only later when a connection is established.
  virtual zx_status_t Share(zx::vmo *out_vmo);

  // Duplicates |vmo| and maps it. This method can be called at most once, and is exclusive with
  // |Create|. |len| must be less than or equal to the VMO's size.
  virtual zx_status_t Link(const zx::vmo &vmo, size_t len);

  // Unmaps and resets the VMO if mapped.
  void Reset();

 private:
  zx::vmo vmo_;
  zx_vaddr_t addr_;
  size_t len_;

  FXL_DISALLOW_COPY_AND_ASSIGN(SharedMemory);
};

}  // namespace fuzzing

#endif  // SRC_LIB_FUZZING_FIDL_SHARED_MEMORY_H_
