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