1// Copyright 2018 The Fuchsia Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#pragma once 6 7#include <stddef.h> 8#include <stdint.h> 9 10#include <ddk/protocol/block.h> 11#include <zircon/listnode.h> 12#include <zircon/types.h> 13 14namespace zxcrypt { 15 16// |extra_op_t| is the extra information placed in the tail end of |block_op_t|s queued against a 17// |zxcrypt::Device|. 18// 19// TODO(aarongreen): This struct should be promoted into a class, with: 20// * methods to access the relevant fields 21// * DLL node state for a fbl::DoublyLinkedList 22// * Methods to encapsulate the setting/clearing/reading into the data field. 23static_assert(sizeof(uintptr_t) <= sizeof(uint64_t), "uintptr_t > uint64_t"); 24struct extra_op_t { 25 // Used to link deferred block requests 26 list_node_t node; 27 28 // Memory region to use for cryptographic transformations. 29 uint8_t* data; 30 31 // The remaining are used to save fields of the original block request which may be altered 32 zx_handle_t vmo; 33 uint32_t length; 34 uint64_t offset_dev; 35 uint64_t offset_vmo; 36 void (*completion_cb)(block_op_t* block, zx_status_t status); 37 void* cookie; 38 39 // Resets this structure to an initial state. 40 zx_status_t Init(block_op_t* block, size_t reserved_blocks); 41}; 42 43// Translates |block_op_t|s to |extra_op_t|s and vice versa. 44extra_op_t* BlockToExtra(block_op_t* block, size_t op_size); 45block_op_t* ExtraToBlock(extra_op_t* extra, size_t op_size); 46 47} // namespace zxcrypt 48