| // |
| // Copyright (C) 2016 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| |
| #include "nvram/hal/tests/scoped_nvram_device.h" |
| |
| #include <android-base/logging.h> |
| #include <hardware/hardware.h> |
| #include <hardware/nvram.h> |
| |
| namespace { |
| |
| const uint8_t* StringToBytePtr(const std::string& s) { |
| return s.empty() ? nullptr : reinterpret_cast<const uint8_t*>(s.data()); |
| } |
| |
| uint8_t* StringToMutableBytePtr(std::string* s) { |
| return reinterpret_cast<uint8_t*>(&s->front()); |
| } |
| |
| } // namespace |
| |
| namespace nvram { |
| |
| ScopedNvramDevice::ScopedNvramDevice() { |
| const hw_module_t* module = nullptr; |
| int result = hw_get_module(NVRAM_HARDWARE_MODULE_ID, &module); |
| if (result) { |
| LOG(ERROR) << "Failed to load NVRAM module: " << result; |
| return; |
| } |
| result = nvram_open(module, &device_); |
| if (result) { |
| LOG(ERROR) << "Failed to open NVRAM device: " << result; |
| device_ = nullptr; |
| return; |
| } |
| if (device_->common.version != NVRAM_DEVICE_API_VERSION_1_1) { |
| LOG(ERROR) << "Unsupported NVRAM HAL version."; |
| nvram_close(device_); |
| device_ = nullptr; |
| return; |
| } |
| } |
| |
| ScopedNvramDevice::~ScopedNvramDevice() { |
| if (device_) { |
| int result = nvram_close(device_); |
| if (result) { |
| LOG(WARNING) << "Failed to close NVRAM device: " << result; |
| return; |
| } |
| } |
| } |
| |
| nvram_result_t ScopedNvramDevice::GetTotalSizeInBytes(uint64_t* total_size) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| return device_->get_total_size_in_bytes(device_, total_size); |
| } |
| |
| nvram_result_t ScopedNvramDevice::GetAvailableSizeInBytes( |
| uint64_t* available_size) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| return device_->get_available_size_in_bytes(device_, available_size); |
| } |
| |
| nvram_result_t ScopedNvramDevice::GetMaxSpaceSizeInBytes( |
| uint64_t* max_space_size) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| return device_->get_max_space_size_in_bytes(device_, max_space_size); |
| } |
| |
| nvram_result_t ScopedNvramDevice::GetMaxSpaces(uint32_t* num_spaces) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| return device_->get_max_spaces(device_, num_spaces); |
| } |
| |
| nvram_result_t ScopedNvramDevice::GetSpaceList( |
| std::vector<uint32_t>* space_index_list) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| uint32_t max_spaces = 0; |
| nvram_result_t result = device_->get_max_spaces(device_, &max_spaces); |
| if (result) { |
| return result; |
| } |
| space_index_list->resize(max_spaces); |
| uint32_t list_size = 0; |
| result = device_->get_space_list(device_, max_spaces, |
| space_index_list->data(), &list_size); |
| if (result) { |
| return result; |
| } |
| space_index_list->resize(list_size); |
| return NV_RESULT_SUCCESS; |
| } |
| |
| nvram_result_t ScopedNvramDevice::GetSpaceSize(uint32_t index, uint64_t* size) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| return device_->get_space_size(device_, index, size); |
| } |
| |
| nvram_result_t ScopedNvramDevice::GetSpaceControls( |
| uint32_t index, |
| std::vector<nvram_control_t>* control_list) { |
| constexpr uint32_t kMaxControls = 16; |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| control_list->resize(kMaxControls); |
| uint32_t list_size = 0; |
| nvram_result_t result = device_->get_space_controls( |
| device_, index, kMaxControls, control_list->data(), &list_size); |
| if (result) { |
| return result; |
| } |
| control_list->resize(list_size); |
| return NV_RESULT_SUCCESS; |
| } |
| |
| nvram_result_t ScopedNvramDevice::IsSpaceLocked(uint32_t index, |
| int* write_lock_enabled, |
| int* read_lock_enabled) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| return device_->is_space_locked(device_, index, write_lock_enabled, |
| read_lock_enabled); |
| } |
| |
| nvram_result_t ScopedNvramDevice::CreateSpace( |
| uint32_t index, |
| uint64_t size_in_bytes, |
| const std::vector<nvram_control_t>& control_list, |
| const std::string& authorization_value) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| return device_->create_space( |
| device_, index, size_in_bytes, control_list.data(), control_list.size(), |
| StringToBytePtr(authorization_value), authorization_value.size()); |
| } |
| |
| nvram_result_t ScopedNvramDevice::DeleteSpace( |
| uint32_t index, |
| const std::string& authorization_value) { |
| return device_->delete_space(device_, index, |
| StringToBytePtr(authorization_value), |
| authorization_value.size()); |
| } |
| |
| nvram_result_t ScopedNvramDevice::DisableCreate() { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| return device_->disable_create(device_); |
| } |
| |
| nvram_result_t ScopedNvramDevice::WriteSpace( |
| uint32_t index, |
| const std::string& data, |
| const std::string& authorization_value) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| return device_->write_space(device_, index, StringToBytePtr(data), |
| data.size(), StringToBytePtr(authorization_value), |
| authorization_value.size()); |
| } |
| |
| nvram_result_t ScopedNvramDevice::ReadSpace( |
| uint32_t index, |
| uint64_t num_bytes_to_read, |
| const std::string& authorization_value, |
| std::string* data) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| data->resize(num_bytes_to_read); |
| uint64_t bytes_read = 0; |
| nvram_result_t result = device_->read_space( |
| device_, index, num_bytes_to_read, StringToBytePtr(authorization_value), |
| authorization_value.size(), StringToMutableBytePtr(data), &bytes_read); |
| if (result) { |
| return result; |
| } |
| data->resize(bytes_read); |
| return NV_RESULT_SUCCESS; |
| } |
| |
| nvram_result_t ScopedNvramDevice::EnableWriteLock( |
| uint32_t index, |
| const std::string& authorization_value) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| return device_->enable_write_lock(device_, index, |
| StringToBytePtr(authorization_value), |
| authorization_value.size()); |
| } |
| |
| nvram_result_t ScopedNvramDevice::EnableReadLock( |
| uint32_t index, |
| const std::string& authorization_value) { |
| if (!device_) { |
| return NV_RESULT_INTERNAL_ERROR; |
| } |
| return device_->enable_read_lock(device_, index, |
| StringToBytePtr(authorization_value), |
| authorization_value.size()); |
| } |
| |
| } // namespace nvram |