Home | History | Annotate | Download | only in tests
      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 #include "nvram/hal/tests/scoped_nvram_device.h"
     18 
     19 #include <android-base/logging.h>
     20 #include <hardware/hardware.h>
     21 #include <hardware/nvram.h>
     22 
     23 namespace {
     24 
     25 const uint8_t* StringToBytePtr(const std::string& s) {
     26   return s.empty() ? nullptr : reinterpret_cast<const uint8_t*>(s.data());
     27 }
     28 
     29 uint8_t* StringToMutableBytePtr(std::string* s) {
     30   return reinterpret_cast<uint8_t*>(&s->front());
     31 }
     32 
     33 }  // namespace
     34 
     35 namespace nvram {
     36 
     37 ScopedNvramDevice::ScopedNvramDevice() {
     38   const hw_module_t* module = nullptr;
     39   int result = hw_get_module(NVRAM_HARDWARE_MODULE_ID, &module);
     40   if (result) {
     41     LOG(ERROR) << "Failed to load NVRAM module: " << result;
     42     return;
     43   }
     44   result = nvram_open(module, &device_);
     45   if (result) {
     46     LOG(ERROR) << "Failed to open NVRAM device: " << result;
     47     device_ = nullptr;
     48     return;
     49   }
     50   if (device_->common.version != NVRAM_DEVICE_API_VERSION_1_1) {
     51     LOG(ERROR) << "Unsupported NVRAM HAL version.";
     52     nvram_close(device_);
     53     device_ = nullptr;
     54     return;
     55   }
     56 }
     57 
     58 ScopedNvramDevice::~ScopedNvramDevice() {
     59   if (device_) {
     60     int result = nvram_close(device_);
     61     if (result) {
     62       LOG(WARNING) << "Failed to close NVRAM device: " << result;
     63       return;
     64     }
     65   }
     66 }
     67 
     68 nvram_result_t ScopedNvramDevice::GetTotalSizeInBytes(uint64_t* total_size) {
     69   if (!device_) {
     70     return NV_RESULT_INTERNAL_ERROR;
     71   }
     72   return device_->get_total_size_in_bytes(device_, total_size);
     73 }
     74 
     75 nvram_result_t ScopedNvramDevice::GetAvailableSizeInBytes(
     76     uint64_t* available_size) {
     77   if (!device_) {
     78     return NV_RESULT_INTERNAL_ERROR;
     79   }
     80   return device_->get_available_size_in_bytes(device_, available_size);
     81 }
     82 
     83 nvram_result_t ScopedNvramDevice::GetMaxSpaceSizeInBytes(
     84     uint64_t* max_space_size) {
     85   if (!device_) {
     86     return NV_RESULT_INTERNAL_ERROR;
     87   }
     88   return device_->get_max_space_size_in_bytes(device_, max_space_size);
     89 }
     90 
     91 nvram_result_t ScopedNvramDevice::GetMaxSpaces(uint32_t* num_spaces) {
     92   if (!device_) {
     93     return NV_RESULT_INTERNAL_ERROR;
     94   }
     95   return device_->get_max_spaces(device_, num_spaces);
     96 }
     97 
     98 nvram_result_t ScopedNvramDevice::GetSpaceList(
     99     std::vector<uint32_t>* space_index_list) {
    100   if (!device_) {
    101     return NV_RESULT_INTERNAL_ERROR;
    102   }
    103   uint32_t max_spaces = 0;
    104   nvram_result_t result = device_->get_max_spaces(device_, &max_spaces);
    105   if (result) {
    106     return result;
    107   }
    108   space_index_list->resize(max_spaces);
    109   uint32_t list_size = 0;
    110   result = device_->get_space_list(device_, max_spaces,
    111                                    space_index_list->data(), &list_size);
    112   if (result) {
    113     return result;
    114   }
    115   space_index_list->resize(list_size);
    116   return NV_RESULT_SUCCESS;
    117 }
    118 
    119 nvram_result_t ScopedNvramDevice::GetSpaceSize(uint32_t index, uint64_t* size) {
    120   if (!device_) {
    121     return NV_RESULT_INTERNAL_ERROR;
    122   }
    123   return device_->get_space_size(device_, index, size);
    124 }
    125 
    126 nvram_result_t ScopedNvramDevice::GetSpaceControls(
    127     uint32_t index,
    128     std::vector<nvram_control_t>* control_list) {
    129   constexpr uint32_t kMaxControls = 16;
    130   if (!device_) {
    131     return NV_RESULT_INTERNAL_ERROR;
    132   }
    133   control_list->resize(kMaxControls);
    134   uint32_t list_size = 0;
    135   nvram_result_t result = device_->get_space_controls(
    136       device_, index, kMaxControls, control_list->data(), &list_size);
    137   if (result) {
    138     return result;
    139   }
    140   control_list->resize(list_size);
    141   return NV_RESULT_SUCCESS;
    142 }
    143 
    144 nvram_result_t ScopedNvramDevice::IsSpaceLocked(uint32_t index,
    145                                                 int* write_lock_enabled,
    146                                                 int* read_lock_enabled) {
    147   if (!device_) {
    148     return NV_RESULT_INTERNAL_ERROR;
    149   }
    150   return device_->is_space_locked(device_, index, write_lock_enabled,
    151                                   read_lock_enabled);
    152 }
    153 
    154 nvram_result_t ScopedNvramDevice::CreateSpace(
    155     uint32_t index,
    156     uint64_t size_in_bytes,
    157     const std::vector<nvram_control_t>& control_list,
    158     const std::string& authorization_value) {
    159   if (!device_) {
    160     return NV_RESULT_INTERNAL_ERROR;
    161   }
    162   return device_->create_space(
    163       device_, index, size_in_bytes, control_list.data(), control_list.size(),
    164       StringToBytePtr(authorization_value), authorization_value.size());
    165 }
    166 
    167 nvram_result_t ScopedNvramDevice::DeleteSpace(
    168     uint32_t index,
    169     const std::string& authorization_value) {
    170   return device_->delete_space(device_, index,
    171                                StringToBytePtr(authorization_value),
    172                                authorization_value.size());
    173 }
    174 
    175 nvram_result_t ScopedNvramDevice::DisableCreate() {
    176   if (!device_) {
    177     return NV_RESULT_INTERNAL_ERROR;
    178   }
    179   return device_->disable_create(device_);
    180 }
    181 
    182 nvram_result_t ScopedNvramDevice::WriteSpace(
    183     uint32_t index,
    184     const std::string& data,
    185     const std::string& authorization_value) {
    186   if (!device_) {
    187     return NV_RESULT_INTERNAL_ERROR;
    188   }
    189   return device_->write_space(device_, index, StringToBytePtr(data),
    190                               data.size(), StringToBytePtr(authorization_value),
    191                               authorization_value.size());
    192 }
    193 
    194 nvram_result_t ScopedNvramDevice::ReadSpace(
    195     uint32_t index,
    196     uint64_t num_bytes_to_read,
    197     const std::string& authorization_value,
    198     std::string* data) {
    199   if (!device_) {
    200     return NV_RESULT_INTERNAL_ERROR;
    201   }
    202   data->resize(num_bytes_to_read);
    203   uint64_t bytes_read = 0;
    204   nvram_result_t result = device_->read_space(
    205       device_, index, num_bytes_to_read, StringToBytePtr(authorization_value),
    206       authorization_value.size(), StringToMutableBytePtr(data), &bytes_read);
    207   if (result) {
    208     return result;
    209   }
    210   data->resize(bytes_read);
    211   return NV_RESULT_SUCCESS;
    212 }
    213 
    214 nvram_result_t ScopedNvramDevice::EnableWriteLock(
    215     uint32_t index,
    216     const std::string& authorization_value) {
    217   if (!device_) {
    218     return NV_RESULT_INTERNAL_ERROR;
    219   }
    220   return device_->enable_write_lock(device_, index,
    221                                     StringToBytePtr(authorization_value),
    222                                     authorization_value.size());
    223 }
    224 
    225 nvram_result_t ScopedNvramDevice::EnableReadLock(
    226     uint32_t index,
    227     const std::string& authorization_value) {
    228   if (!device_) {
    229     return NV_RESULT_INTERNAL_ERROR;
    230   }
    231   return device_->enable_read_lock(device_, index,
    232                                    StringToBytePtr(authorization_value),
    233                                    authorization_value.size());
    234 }
    235 
    236 }  // namespace nvram
    237