blob: 9ff3f8d082b2308ba0fd5d95376c9b9d03e910bd [file] [log] [blame]
// Copyright 2018 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_ZXCRYPT_EXTRA_H_
#define SRC_DEVICES_BLOCK_DRIVERS_ZXCRYPT_EXTRA_H_
#include <fuchsia/hardware/block/c/banjo.h>
#include <stddef.h>
#include <stdint.h>
#include <zircon/listnode.h>
#include <zircon/types.h>
namespace zxcrypt {
// |extra_op_t| is the extra information placed in the tail end of |block_op_t|s queued against a
// |zxcrypt::Device|.
//
// TODO(aarongreen): This struct should be promoted into a class, with:
// * methods to access the relevant fields
// * DLL node state for a fbl::DoublyLinkedList
// * Methods to encapsulate the setting/clearing/reading into the data field.
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;
// Memory region to use for cryptographic transformations.
uint8_t* data;
// 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;
// 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 reserved_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 zxcrypt
#endif // SRC_DEVICES_BLOCK_DRIVERS_ZXCRYPT_EXTRA_H_