nvram_messages.h revision 0b833364a3db07f389faa7f99a68277a493548f3
1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef NVRAM_MESSAGES_NVRAM_MESSAGES_H_ 18#define NVRAM_MESSAGES_NVRAM_MESSAGES_H_ 19 20#include <hardware/nvram_defs.h> 21 22#include <nvram/messages/blob.h> 23#include <nvram/messages/compiler.h> 24#include <nvram/messages/struct.h> 25#include <nvram/messages/tagged_union.h> 26#include <nvram/messages/vector.h> 27 28namespace nvram { 29 30enum Command { 31 // Commands corresponding to the API defined in the access-controlled NVRAM 32 // HAL spec. Note that some commands service multiple HAL API calls. 33 COMMAND_GET_INFO = 1, 34 COMMAND_CREATE_SPACE = 2, 35 COMMAND_GET_SPACE_INFO = 3, 36 COMMAND_DELETE_SPACE = 4, 37 COMMAND_DISABLE_CREATE = 5, 38 COMMAND_WRITE_SPACE = 6, 39 COMMAND_READ_SPACE = 7, 40 COMMAND_LOCK_SPACE_WRITE = 8, 41 COMMAND_LOCK_SPACE_READ = 9, 42 43 // The wipe commands are provided as a utility for clearing NVRAM during 44 // hardware reset. These are not accessible via the HAL API, but may be used 45 // by implementations to implement NVRAM clearing on full device reset. 46 COMMAND_WIPE_STORAGE = 10, 47 COMMAND_DISABLE_WIPE = 11, 48}; 49 50// COMMAND_GET_INFO request/response. 51struct GetInfoRequest {}; 52 53struct GetInfoResponse { 54 uint64_t total_size = 0; 55 uint64_t available_size = 0; 56 uint64_t max_space_size = 0; 57 uint32_t max_spaces = 0; 58 Vector<uint32_t> space_list; 59 bool wipe_disabled = false; 60}; 61 62// COMMAND_CREATE_SPACE request/response. 63struct CreateSpaceRequest { 64 uint32_t index = 0; 65 uint64_t size = 0; 66 Vector<nvram_control_t> controls; 67 Blob authorization_value; 68}; 69 70struct CreateSpaceResponse {}; 71 72// COMMAND_GET_SPACE_INFO request/response. 73struct GetSpaceInfoRequest { 74 uint32_t index = 0; 75}; 76 77struct GetSpaceInfoResponse { 78 uint64_t size = 0; 79 Vector<nvram_control_t> controls; 80 bool read_locked = false; 81 bool write_locked = false; 82}; 83 84// COMMAND_DELETE_SPACE request/response. 85struct DeleteSpaceRequest { 86 uint32_t index = 0; 87 Blob authorization_value; 88}; 89 90struct DeleteSpaceResponse {}; 91 92// COMMAND_DISABLE_CREATE request/response. 93struct DisableCreateRequest {}; 94 95struct DisableCreateResponse {}; 96 97// COMMAND_WRITE_SPACE request/response. 98struct WriteSpaceRequest { 99 uint32_t index = 0; 100 Blob buffer; 101 Blob authorization_value; 102}; 103 104struct WriteSpaceResponse {}; 105 106// COMMAND_READ_SPACE request/response. 107struct ReadSpaceRequest { 108 uint32_t index = 0; 109 Blob authorization_value; 110}; 111 112struct ReadSpaceResponse { 113 Blob buffer; 114}; 115 116// COMMAND_LOCK_SPACE_WRITE request/response. 117struct LockSpaceWriteRequest { 118 uint32_t index = 0; 119 Blob authorization_value; 120}; 121 122struct LockSpaceWriteResponse {}; 123 124// COMMAND_LOCK_SPACE_READ request/response. 125struct LockSpaceReadRequest { 126 uint32_t index = 0; 127 Blob authorization_value; 128}; 129 130struct LockSpaceReadResponse {}; 131 132// COMMAND_WIPE request/response. 133struct WipeStorageRequest {}; 134struct WipeStorageResponse {}; 135 136// COMMAND_DISABLE_WIPE request/response. 137struct DisableWipeRequest {}; 138struct DisableWipeResponse {}; 139 140// Generic request message, carrying command-specific payload. The slot set in 141// the payload determines the requested command. 142using RequestUnion = TaggedUnion< 143 Command, 144 TaggedUnionMember<COMMAND_GET_INFO, GetInfoRequest>, 145 TaggedUnionMember<COMMAND_CREATE_SPACE, CreateSpaceRequest>, 146 TaggedUnionMember<COMMAND_GET_SPACE_INFO, GetSpaceInfoRequest>, 147 TaggedUnionMember<COMMAND_DELETE_SPACE, DeleteSpaceRequest>, 148 TaggedUnionMember<COMMAND_DISABLE_CREATE, DisableCreateRequest>, 149 TaggedUnionMember<COMMAND_WRITE_SPACE, WriteSpaceRequest>, 150 TaggedUnionMember<COMMAND_READ_SPACE, ReadSpaceRequest>, 151 TaggedUnionMember<COMMAND_LOCK_SPACE_WRITE, LockSpaceWriteRequest>, 152 TaggedUnionMember<COMMAND_LOCK_SPACE_READ, LockSpaceReadRequest>, 153 TaggedUnionMember<COMMAND_WIPE_STORAGE, WipeStorageRequest>, 154 TaggedUnionMember<COMMAND_DISABLE_WIPE, DisableWipeRequest>>; 155struct Request { 156 RequestUnion payload; 157}; 158 159// Generic response message, carrying a result code and command-specific 160// payload. 161using ResponseUnion = TaggedUnion< 162 Command, 163 TaggedUnionMember<COMMAND_GET_INFO, GetInfoResponse>, 164 TaggedUnionMember<COMMAND_CREATE_SPACE, CreateSpaceResponse>, 165 TaggedUnionMember<COMMAND_GET_SPACE_INFO, GetSpaceInfoResponse>, 166 TaggedUnionMember<COMMAND_DELETE_SPACE, DeleteSpaceResponse>, 167 TaggedUnionMember<COMMAND_DISABLE_CREATE, DisableCreateResponse>, 168 TaggedUnionMember<COMMAND_WRITE_SPACE, WriteSpaceResponse>, 169 TaggedUnionMember<COMMAND_READ_SPACE, ReadSpaceResponse>, 170 TaggedUnionMember<COMMAND_LOCK_SPACE_WRITE, LockSpaceWriteResponse>, 171 TaggedUnionMember<COMMAND_LOCK_SPACE_READ, LockSpaceReadResponse>, 172 TaggedUnionMember<COMMAND_WIPE_STORAGE, WipeStorageResponse>, 173 TaggedUnionMember<COMMAND_DISABLE_WIPE, DisableWipeResponse>>; 174struct Response { 175 nvram_result_t result = NV_RESULT_SUCCESS; 176 ResponseUnion payload; 177}; 178 179// Encoding and decoding functions. Template instantiations are provided for the 180// |Request| and |Response| wrapper types declared above. 181 182// Encode |msg| to |blob|. Returns true if successful. 183template <typename Message> 184bool Encode(const Message& msg, Blob* blob); 185 186// Encode |msg| to |buffer|, which is of size |*size|. Updates |*size| to 187// indicate the number of bytes written. Returns true on success. 188template <typename Message> 189bool Encode(const Message& msg, void* buffer, size_t* size); 190 191// Decode |msg| from the |data| buffer, which contains |size| bytes. Returns 192// true if successful. 193template <typename Message> 194bool Decode(const uint8_t* data, size_t size, Message* msg); 195 196} // namespace nvram 197 198#endif // NVRAM_MESSAGES_NVRAM_MESSAGES_H_ 199