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#include <inttypes.h> 6#include <stddef.h> 7#include <stdint.h> 8 9#include <ddk/debug.h> 10#include <ddk/protocol/block.h> 11#include <zircon/assert.h> 12#include <zircon/errors.h> 13#include <zircon/listnode.h> 14#include <zircon/types.h> 15 16#include "debug.h" 17#include "extra.h" 18 19namespace zxcrypt { 20 21zx_status_t extra_op_t::Init(block_op_t* block, size_t reserved_blocks) { 22 LOG_ENTRY_ARGS("block=%p, reserved_blocks=%zu", block, reserved_blocks); 23 24 list_initialize(&node); 25 data = nullptr; 26 completion_cb = block->completion_cb; 27 cookie = block->cookie; 28 29 switch (block->command & BLOCK_OP_MASK) { 30 case BLOCK_OP_READ: 31 case BLOCK_OP_WRITE: 32 if (add_overflow(block->rw.offset_dev, reserved_blocks, &block->rw.offset_dev)) { 33 zxlogf(ERROR, "adjusted offset overflow: block->rw.offset_dev=%" PRIu64 "\n", 34 block->rw.offset_dev); 35 return ZX_ERR_OUT_OF_RANGE; 36 } 37 vmo = block->rw.vmo; 38 length = block->rw.length; 39 offset_dev = block->rw.offset_dev; 40 offset_vmo = block->rw.offset_vmo; 41 break; 42 43 default: 44 length = 0; 45 offset_dev = 0; 46 offset_vmo = 0; 47 break; 48 } 49 return ZX_OK; 50} 51 52extra_op_t* BlockToExtra(block_op_t* block, size_t op_size) { 53 LOG_ENTRY_ARGS("block=%p, op_size=%zu\n", block, op_size); 54 ZX_DEBUG_ASSERT(block); 55 56 uint8_t* ptr = reinterpret_cast<uint8_t*>(block); 57 58 return reinterpret_cast<extra_op_t*>(ptr + op_size) - 1; 59} 60 61block_op_t* ExtraToBlock(extra_op_t* extra, size_t op_size) { 62 LOG_ENTRY_ARGS("extra=%p, op_size=%zu\n", extra, op_size); 63 ZX_DEBUG_ASSERT(extra); 64 65 uint8_t* ptr = reinterpret_cast<uint8_t*>(extra + 1); 66 67 return reinterpret_cast<block_op_t*>(ptr - op_size); 68} 69 70} // namespace zxcrypt 71