blob: 1e606ec449dd664dab2b0831075a6f0ad52edd5b [file] [log] [blame] [edit]
// 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_