blob: 9958276511459c280c4dad4e05956e3e04fbedbe [file] [log] [blame]
// 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_DEVICES_BLOCK_DRIVERS_BLOCK_VERITY_EXTRA_H_
#define SRC_DEVICES_BLOCK_DRIVERS_BLOCK_VERITY_EXTRA_H_
#include <fuchsia/hardware/block/c/banjo.h>
#include <stddef.h>
#include <stdint.h>
#include <zircon/listnode.h>
#include <zircon/types.h>
#include "src/devices/block/drivers/block-verity/block-loader-interface.h"
namespace block_verity {
// `extra_op_t` is the extra information placed in the tail end of `block_op_t`s queued against a
// `block_verity::Device`.
//
static_assert(sizeof(uintptr_t) <= sizeof(uint64_t), "uintptr_t > uint64_t");
struct extra_op_t {
// Used to link deferred block requests
list_node_t node;
// The remaining are used to save fields of the original block request which may be altered
zx_handle_t vmo;
uint32_t length;
uint64_t offset_dev;
uint64_t offset_vmo;
block_impl_queue_callback completion_cb;
void* cookie;
// used to save a different type of callback function pointer
BlockLoaderCallback loader_cb;
// Resets this structure to an initial state.
zx_status_t Init(block_op_t* block, block_impl_queue_callback completion_cb, void* cookie,
size_t hw_blocks_per_logical_block, size_t data_start_offset_logical_blocks);
};
// Translates `block_op_t`s to `extra_op_t`s and vice versa.
extra_op_t* BlockToExtra(block_op_t* block, size_t op_size);
block_op_t* ExtraToBlock(extra_op_t* extra, size_t op_size);
} // namespace block_verity
#endif // SRC_DEVICES_BLOCK_DRIVERS_BLOCK_VERITY_EXTRA_H_