1ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler/* 2ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * Copyright (C) 2016 The Android Open Source Project 3ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * 4ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * Licensed under the Apache License, Version 2.0 (the "License"); 5ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * you may not use this file except in compliance with the License. 6ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * You may obtain a copy of the License at 7ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * 8ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * http://www.apache.org/licenses/LICENSE-2.0 9ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * 10ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * Unless required by applicable law or agreed to in writing, software 11ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * distributed under the License is distributed on an "AS IS" BASIS, 12ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * See the License for the specific language governing permissions and 14ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * limitations under the License. 15ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler */ 16ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 17ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#include "fake_storage.h" 18ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 19ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#include <nvram/messages/blob.h> 20ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#include <nvram/messages/compiler.h> 21ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 22ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#define countof(a) (sizeof(a) / sizeof((a)[0])) 23ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 24ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslernamespace nvram { 25ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslernamespace storage { 26ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 27ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslernamespace { 28ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 29ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslerclass StorageSlot { 30ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler public: 31ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler Status Load(Blob* blob) { 32625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler if (read_error_) { 33ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return Status::kStorageError; 34ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 35ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 36ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler if (!present_) { 37ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return Status::kNotFound; 38ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 39ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 40ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler NVRAM_CHECK(blob->Assign(blob_.data(), blob_.size())); 41ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return Status::kSuccess; 42ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 43ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 44ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler Status Store(const Blob& blob) { 45625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler if (write_error_) { 46ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return Status::kStorageError; 47ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 48ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 49ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler NVRAM_CHECK(blob_.Assign(blob.data(), blob.size())); 50ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler present_ = true; 51ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return Status::kSuccess; 52ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 53ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 54625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler Status Delete() { 55625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler if (write_error_) { 56625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler return Status::kStorageError; 57625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler } 58625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler 59ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler NVRAM_CHECK(blob_.Resize(0)); 60ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler present_ = false; 61625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler return Status::kSuccess; 62625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler } 63625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler 64625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler void Clear() { 65625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler present_ = false; 66625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler read_error_ = false; 67625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler write_error_ = false; 68625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler NVRAM_CHECK(blob_.Resize(0)); 69ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 70ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 71ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler bool present() const { return present_; } 72ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler void set_present(bool present) { present_ = present; } 73625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler void set_read_error(bool error) { read_error_ = error; } 74625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler void set_write_error(bool error) { write_error_ = error; } 75ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 76ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler private: 77ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler bool present_ = false; 78625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler bool read_error_ = false; 79625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler bool write_error_ = false; 80ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler Blob blob_; 81ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}; 82ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 83ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// Header storage. 84ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStorageSlot g_header; 85ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 86ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// Space blob storage. 87ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslerstruct SpaceStorageSlot { 88ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler uint32_t index; 89ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler StorageSlot slot; 90ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}; 91ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 92ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerSpaceStorageSlot g_spaces[256]; 93ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 94ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// Find the position in |g_spaces| corresponding to a given space |index|. 95ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// Returns the slot pointer or |nullptr| if not found. 96ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStorageSlot* FindSlotForIndex(uint32_t index) { 97ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler for (size_t i = 0; i < countof(g_spaces); ++i) { 98ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler if (g_spaces[i].slot.present() && g_spaces[i].index == index) { 99ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return &g_spaces[i].slot; 100ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 101ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 102ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 103ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return nullptr; 104ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} 105ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 106ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// Finds or creates the slot for |index|. Returns the slot pointer or |nullptr| 107ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// if not found. 108ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStorageSlot* FindOrCreateSlotForIndex(uint32_t index) { 109ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler StorageSlot* slot = FindSlotForIndex(index); 110ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler if (slot) { 111ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return slot; 112ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 113ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 114ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 115ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler for (size_t i = 0; i < countof(g_spaces); ++i) { 116ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler if (!g_spaces[i].slot.present()) { 117ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler g_spaces[i].index = index; 118ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return &g_spaces[i].slot; 119ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 120ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 121ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 122ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return nullptr; 123ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} 124ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 125ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} // namespace 126ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 127ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStatus LoadHeader(Blob* blob) { 128ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return g_header.Load(blob); 129ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} 130ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 131ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStatus StoreHeader(const Blob& blob) { 132ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return g_header.Store(blob); 133ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} 134ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 135625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nisslervoid SetHeaderReadError(bool error) { 136625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler g_header.set_read_error(error); 137625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler} 138625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler 139625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nisslervoid SetHeaderWriteError(bool error) { 140625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler g_header.set_write_error(error); 141ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} 142ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 143ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStatus LoadSpace(uint32_t index, Blob* blob) { 144ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler StorageSlot* slot = FindSlotForIndex(index); 145ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return slot ? slot->Load(blob) : Status::kNotFound; 146ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} 147ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 148ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStatus StoreSpace(uint32_t index, const Blob& blob) { 149ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler StorageSlot* slot = FindOrCreateSlotForIndex(index); 150ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler return slot ? slot->Store(blob) : Status::kStorageError; 151ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} 152ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 153ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStatus DeleteSpace(uint32_t index) { 154ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler StorageSlot* slot = FindSlotForIndex(index); 155625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler return slot ? slot->Delete() : Status::kNotFound; 156ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} 157ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 158ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslervoid Clear() { 159ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler g_header.Clear(); 160ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler for (size_t i = 0; i < countof(g_spaces); ++i) { 161ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler g_spaces[i].slot.Clear(); 162ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 163ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} 164ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 165625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nisslervoid SetSpaceReadError(uint32_t index, bool error) { 166625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler StorageSlot* slot = FindOrCreateSlotForIndex(index); 167625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler if (slot) { 168625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler slot->set_read_error(error); 169625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler } 170625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler} 171625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler 172625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nisslervoid SetSpaceWriteError(uint32_t index, bool error) { 173ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler StorageSlot* slot = FindOrCreateSlotForIndex(index); 174ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler if (slot) { 175625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler slot->set_write_error(error); 176ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler } 177ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} 178ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler 179ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} // namespace storage 180ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler} // namespace nvram 181