diff options
author | Steven Laver <lavers@google.com> | 2019-10-24 16:40:00 -0700 |
---|---|---|
committer | Daniel Norman <danielnorman@google.com> | 2019-10-25 13:27:06 -0700 |
commit | 76b1977dca6b72018663a9cd476f7c3d0604db31 (patch) | |
tree | 788b2782ca42def0e34f44897369979e3089a322 /boot | |
parent | 4db99f68ffc39b3e821b76fe66642e066149b645 (diff) | |
parent | 6acc7b439ee8813198ddaecb86757c2da5d6c872 (diff) |
Merge RP1A.191024.001
Change-Id: I22b7b600104c6d7fd4d448dd2efdeb20f95ca28b
Diffstat (limited to 'boot')
-rw-r--r-- | boot/1.1/Android.bp | 18 | ||||
-rw-r--r-- | boot/1.1/IBootControl.hal | 66 | ||||
-rw-r--r-- | boot/1.1/default/Android.bp | 48 | ||||
-rw-r--r-- | boot/1.1/default/BootControl.cpp | 129 | ||||
-rw-r--r-- | boot/1.1/default/BootControl.h | 64 | ||||
-rw-r--r-- | boot/1.1/default/android.hardware.boot@1.1-service.rc | 6 | ||||
-rw-r--r-- | boot/1.1/default/android.hardware.boot@1.1.xml | 7 | ||||
-rw-r--r-- | boot/1.1/default/service.cpp | 26 | ||||
-rw-r--r-- | boot/1.1/types.hal | 44 | ||||
-rw-r--r-- | boot/1.1/vts/functional/Android.bp | 28 | ||||
-rw-r--r-- | boot/1.1/vts/functional/VtsHalBootV1_1TargetTest.cpp | 86 |
11 files changed, 522 insertions, 0 deletions
diff --git a/boot/1.1/Android.bp b/boot/1.1/Android.bp new file mode 100644 index 0000000000..6a8d57aa8c --- /dev/null +++ b/boot/1.1/Android.bp @@ -0,0 +1,18 @@ +// This file is autogenerated by hidl-gen -Landroidbp. + +hidl_interface { + name: "android.hardware.boot@1.1", + root: "android.hardware", + vndk: { + enabled: true, + }, + srcs: [ + "types.hal", + "IBootControl.hal", + ], + interfaces: [ + "android.hardware.boot@1.0", + "android.hidl.base@1.0", + ], + gen_java: true, +} diff --git a/boot/1.1/IBootControl.hal b/boot/1.1/IBootControl.hal new file mode 100644 index 0000000000..939dfb3d74 --- /dev/null +++ b/boot/1.1/IBootControl.hal @@ -0,0 +1,66 @@ +/* + * Copyright 2019 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. + */ + +package android.hardware.boot@1.1; + +import @1.0::IBootControl; + +interface IBootControl extends @1.0::IBootControl { + /** + * Sets whether a snapshot-merge of any dynamic partition is in progress. + * + * After the merge status is set to a given value, subsequent calls to + * getSnapshotMergeStatus must return the set value. + * + * The merge status must be persistent across reboots. That is, getSnapshotMergeStatus + * must return the same value after a reboot if the merge status is not altered in any way + * (e.g. set by setSnapshotMergeStatus or set to CANCELLED by bootloader). + * + * Read/write access to the merge status must be atomic. When the HAL is processing a + * setSnapshotMergeStatus call, all subsequent calls to getSnapshotMergeStatus must block until + * setSnapshotMergeStatus has returned. + * + * A MERGING state indicates that dynamic partitions are partially comprised by blocks in the + * userdata partition. + * + * When the merge status is set to MERGING, the following operations must be prohibited from the + * bootloader: + * - Flashing or erasing "userdata" or "metadata". + * + * The following operations may be prohibited when the status is set to MERGING. If not + * prohibited, it is recommended that the user receive a warning. + * - Changing the active slot (e.g. via "fastboot set_active") + * + * @param status Merge status. + * + * @return success True on success, false otherwise. + */ + setSnapshotMergeStatus(MergeStatus status) generates (bool success); + + /** + * Returns whether a snapshot-merge of any dynamic partition is in progress. + * + * This function must return the merge status set by the last setSnapshotMergeStatus call and + * recorded by the bootloader with one exception. If the partitions are being flashed from the + * bootloader such that the pending merge must be canceled (for example, if the super partition + * is being flashed), this function must return CANCELLED. + * + * @return success True if the merge status is read successfully, false otherwise. + * @return status Merge status. + */ + getSnapshotMergeStatus() generates (MergeStatus status); +}; + diff --git a/boot/1.1/default/Android.bp b/boot/1.1/default/Android.bp new file mode 100644 index 0000000000..abf1bf9530 --- /dev/null +++ b/boot/1.1/default/Android.bp @@ -0,0 +1,48 @@ +cc_library_shared { + name: "android.hardware.boot@1.1-impl", + stem: "android.hardware.boot@1.0-impl-1.1", + defaults: [ + "hidl_defaults", + "libboot_control_defaults", + ], + relative_install_path: "hw", + vendor: true, + recovery_available: true, + srcs: ["BootControl.cpp"], + + shared_libs: [ + "liblog", + "libhidlbase", + "libhardware", + "libutils", + "android.hardware.boot@1.0", + "android.hardware.boot@1.1", + ], + static_libs: [ + "libboot_control", + "libfstab", + ], +} + +cc_binary { + name: "android.hardware.boot@1.1-service", + defaults: ["hidl_defaults"], + relative_install_path: "hw", + vendor: true, + init_rc: ["android.hardware.boot@1.1-service.rc"], + srcs: ["service.cpp"], + + vintf_fragments: [ + "android.hardware.boot@1.1.xml", + ], + + shared_libs: [ + "liblog", + "libhardware", + "libhidlbase", + "libutils", + "android.hardware.boot@1.0", + "android.hardware.boot@1.1", + ], + +} diff --git a/boot/1.1/default/BootControl.cpp b/boot/1.1/default/BootControl.cpp new file mode 100644 index 0000000000..c9c62a43d0 --- /dev/null +++ b/boot/1.1/default/BootControl.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2019 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. + */ +#define LOG_TAG "android.hardware.boot@1.1-impl" + +#include <memory> + +#include <log/log.h> + +#include "BootControl.h" + +namespace android { +namespace hardware { +namespace boot { +namespace V1_1 { +namespace implementation { + +using ::android::hardware::boot::V1_0::CommandResult; + +bool BootControl::Init() { + return impl_.Init(); +} + +// Methods from ::android::hardware::boot::V1_0::IBootControl follow. +Return<uint32_t> BootControl::getNumberSlots() { + return impl_.GetNumberSlots(); +} + +Return<uint32_t> BootControl::getCurrentSlot() { + return impl_.GetCurrentSlot(); +} + +Return<void> BootControl::markBootSuccessful(markBootSuccessful_cb _hidl_cb) { + struct CommandResult cr; + if (impl_.MarkBootSuccessful()) { + cr.success = true; + cr.errMsg = "Success"; + } else { + cr.success = false; + cr.errMsg = "Operation failed"; + } + _hidl_cb(cr); + return Void(); +} + +Return<void> BootControl::setActiveBootSlot(uint32_t slot, setActiveBootSlot_cb _hidl_cb) { + struct CommandResult cr; + if (impl_.SetActiveBootSlot(slot)) { + cr.success = true; + cr.errMsg = "Success"; + } else { + cr.success = false; + cr.errMsg = "Operation failed"; + } + _hidl_cb(cr); + return Void(); +} + +Return<void> BootControl::setSlotAsUnbootable(uint32_t slot, setSlotAsUnbootable_cb _hidl_cb) { + struct CommandResult cr; + if (impl_.SetSlotAsUnbootable(slot)) { + cr.success = true; + cr.errMsg = "Success"; + } else { + cr.success = false; + cr.errMsg = "Operation failed"; + } + _hidl_cb(cr); + return Void(); +} + +Return<BoolResult> BootControl::isSlotBootable(uint32_t slot) { + if (!impl_.IsValidSlot(slot)) { + return BoolResult::INVALID_SLOT; + } + return impl_.IsSlotBootable(slot) ? BoolResult::TRUE : BoolResult::FALSE; +} + +Return<BoolResult> BootControl::isSlotMarkedSuccessful(uint32_t slot) { + if (!impl_.IsValidSlot(slot)) { + return BoolResult::INVALID_SLOT; + } + return impl_.IsSlotMarkedSuccessful(slot) ? BoolResult::TRUE : BoolResult::FALSE; +} + +Return<void> BootControl::getSuffix(uint32_t slot, getSuffix_cb _hidl_cb) { + hidl_string ans; + const char* suffix = impl_.GetSuffix(slot); + if (suffix) { + ans = suffix; + } + _hidl_cb(ans); + return Void(); +} + +Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus status) { + return impl_.SetSnapshotMergeStatus(status); +} + +Return<MergeStatus> BootControl::getSnapshotMergeStatus() { + return impl_.GetSnapshotMergeStatus(); +} + +IBootControl* HIDL_FETCH_IBootControl(const char* /* hal */) { + auto module = std::make_unique<BootControl>(); + if (!module->Init()) { + ALOGE("Could not initialize BootControl module"); + return nullptr; + } + return module.release(); +} + +} // namespace implementation +} // namespace V1_1 +} // namespace boot +} // namespace hardware +} // namespace android diff --git a/boot/1.1/default/BootControl.h b/boot/1.1/default/BootControl.h new file mode 100644 index 0000000000..75511b638f --- /dev/null +++ b/boot/1.1/default/BootControl.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2019 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. + */ + +#pragma once + +#include <android/hardware/boot/1.1/IBootControl.h> +#include <hidl/MQDescriptor.h> +#include <hidl/Status.h> +#include <libboot_control/libboot_control.h> + +namespace android { +namespace hardware { +namespace boot { +namespace V1_1 { +namespace implementation { + +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::hardware::boot::V1_0::BoolResult; +using ::android::hardware::boot::V1_1::IBootControl; +using ::android::hardware::boot::V1_1::MergeStatus; + +class BootControl : public IBootControl { + public: + bool Init(); + + // Methods from ::android::hardware::boot::V1_0::IBootControl follow. + Return<uint32_t> getNumberSlots() override; + Return<uint32_t> getCurrentSlot() override; + Return<void> markBootSuccessful(markBootSuccessful_cb _hidl_cb) override; + Return<void> setActiveBootSlot(uint32_t slot, setActiveBootSlot_cb _hidl_cb) override; + Return<void> setSlotAsUnbootable(uint32_t slot, setSlotAsUnbootable_cb _hidl_cb) override; + Return<BoolResult> isSlotBootable(uint32_t slot) override; + Return<BoolResult> isSlotMarkedSuccessful(uint32_t slot) override; + Return<void> getSuffix(uint32_t slot, getSuffix_cb _hidl_cb) override; + + // Methods from ::android::hardware::boot::V1_1::IBootControl follow. + Return<bool> setSnapshotMergeStatus(MergeStatus status) override; + Return<MergeStatus> getSnapshotMergeStatus() override; + + private: + android::bootable::BootControl impl_; +}; + +extern "C" IBootControl* HIDL_FETCH_IBootControl(const char* name); + +} // namespace implementation +} // namespace V1_1 +} // namespace boot +} // namespace hardware +} // namespace android diff --git a/boot/1.1/default/android.hardware.boot@1.1-service.rc b/boot/1.1/default/android.hardware.boot@1.1-service.rc new file mode 100644 index 0000000000..83fa9d0212 --- /dev/null +++ b/boot/1.1/default/android.hardware.boot@1.1-service.rc @@ -0,0 +1,6 @@ +service vendor.boot-hal-1-1 /vendor/bin/hw/android.hardware.boot@1.1-service + interface android.hardware.boot@1.0::IBootControl default + interface android.hardware.boot@1.1::IBootControl default + class early_hal + user root + group root diff --git a/boot/1.1/default/android.hardware.boot@1.1.xml b/boot/1.1/default/android.hardware.boot@1.1.xml new file mode 100644 index 0000000000..83d5d2e8de --- /dev/null +++ b/boot/1.1/default/android.hardware.boot@1.1.xml @@ -0,0 +1,7 @@ +<manifest version="1.0" type="device"> + <hal format="hidl"> + <name>android.hardware.boot</name> + <transport>hwbinder</transport> + <fqname>@1.1::IBootControl/default</fqname> + </hal> +</manifest> diff --git a/boot/1.1/default/service.cpp b/boot/1.1/default/service.cpp new file mode 100644 index 0000000000..93eaedab8d --- /dev/null +++ b/boot/1.1/default/service.cpp @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2019 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. + */ +#define LOG_TAG "android.hardware.boot@1.1-service" + +#include <android/hardware/boot/1.0/IBootControl.h> +#include <hidl/LegacySupport.h> + +using android::hardware::defaultPassthroughServiceImplementation; +using ::android::hardware::boot::V1_0::IBootControl; + +int main(int /* argc */, char* /* argv */[]) { + return defaultPassthroughServiceImplementation<IBootControl>(); +} diff --git a/boot/1.1/types.hal b/boot/1.1/types.hal new file mode 100644 index 0000000000..6346078c81 --- /dev/null +++ b/boot/1.1/types.hal @@ -0,0 +1,44 @@ +/* + * Copyright 2019 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. + */ + +package android.hardware.boot@1.1; + +enum MergeStatus : int32_t { + /** + * No snapshot or merge is in progress. + */ + NONE = 0, + + /** + * The merge status could not be determined. + */ + UNKNOWN, + + /** + * Partitions are being snapshotted, but no merge has been started. + */ + SNAPSHOTTED, + + /** + * At least one partition has merge is in progress. + */ + MERGING, + + /** + * A merge was in progress, but it was canceled by the bootloader. + */ + CANCELLED, +}; diff --git a/boot/1.1/vts/functional/Android.bp b/boot/1.1/vts/functional/Android.bp new file mode 100644 index 0000000000..49ea09a15e --- /dev/null +++ b/boot/1.1/vts/functional/Android.bp @@ -0,0 +1,28 @@ +// +// Copyright (C) 2019 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. +// + +cc_test { + name: "VtsHalBootV1_1TargetTest", + defaults: ["VtsHalTargetTestDefaults"], + srcs: ["VtsHalBootV1_1TargetTest.cpp"], + static_libs: [ + "android.hardware.boot@1.0", + "android.hardware.boot@1.1", + "libgmock", + ], + test_suites: ["device-tests"], +} + diff --git a/boot/1.1/vts/functional/VtsHalBootV1_1TargetTest.cpp b/boot/1.1/vts/functional/VtsHalBootV1_1TargetTest.cpp new file mode 100644 index 0000000000..fba9a5ec0c --- /dev/null +++ b/boot/1.1/vts/functional/VtsHalBootV1_1TargetTest.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2019 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. + */ + +#define LOG_TAG "boot_hidl_hal_test" + +#include <vector> + +#include <android-base/logging.h> +#include <android/hardware/boot/1.1/IBootControl.h> +#include <android/hardware/boot/1.1/types.h> +#include <gmock/gmock.h> +#include <gtest/gtest.h> +#include <hidl/GtestPrinter.h> +#include <hidl/ServiceManagement.h> + +#include <unistd.h> + +using ::android::sp; +using ::android::hardware::hidl_enum_range; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::hardware::boot::V1_1::IBootControl; +using ::android::hardware::boot::V1_1::MergeStatus; +using ::testing::Contains; + +class BootHidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + boot = IBootControl::getService(GetParam()); + ASSERT_NE(boot, nullptr); + + LOG(INFO) << "Test is remote " << boot->isRemote(); + } + + sp<IBootControl> boot; +}; + +static std::vector<MergeStatus> ValidMergeStatusValues() { + std::vector<MergeStatus> values; + for (const auto value : hidl_enum_range<MergeStatus>()) { + if (value == MergeStatus::UNKNOWN) { + continue; + } + values.push_back(value); + } + return values; +} + +/** + * Ensure merge status can be retrieved. + */ +TEST_P(BootHidlTest, GetSnapshotMergeStatus) { + auto values = ValidMergeStatusValues(); + auto status = (MergeStatus)boot->getSnapshotMergeStatus(); + EXPECT_THAT(values, Contains(status)); +} + +/** + * Ensure merge status can be set to arbitrary value. + */ +TEST_P(BootHidlTest, SetSnapshotMergeStatus) { + for (const auto value : ValidMergeStatusValues()) { + EXPECT_TRUE(boot->setSnapshotMergeStatus(value).withDefault(false)); + auto status = boot->getSnapshotMergeStatus(); + EXPECT_EQ(status, value); + } +} + +INSTANTIATE_TEST_SUITE_P( + , BootHidlTest, + testing::ValuesIn(android::hardware::getAllHalInstanceNames(IBootControl::descriptor)), + android::hardware::PrintInstanceNameToString); |