From b885e4ad533ea4d12e18a0147d298be0cd8cec72 Mon Sep 17 00:00:00 2001 From: Tiffany Yang Date: Wed, 22 May 2024 21:04:38 -0700 Subject: [PATCH] init: Wait for /dev/hvc1 during ARCVM first-stage mount This commit introduces a function to allow ARC-specific logic during first-stage mount by checking for the existence of an indicator file at the path "/is_arcvm". ARC uses the virtio-console device `hvc1` to pass byte data to Android before second-stage init. Ensure that /dev/hvc1 is initialized before ARCVM continues booting, but allow other devices to bypass this device initialization. Bug: 325538592 Test: boot ARC, ensure /dev/hvc1 can be read during PropertyInit Change-Id: Ic258b7b004b59da462f4990131a5c11fc94eca62 --- init/first_stage_mount.cpp | 5 +++++ init/selinux.cpp | 2 ++ init/util.h | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/init/first_stage_mount.cpp b/init/first_stage_mount.cpp index 55cce6eaa..927b45f22 100644 --- a/init/first_stage_mount.cpp +++ b/init/first_stage_mount.cpp @@ -305,6 +305,11 @@ bool FirstStageMountVBootV2::InitDevices() { return false; } } + + if (IsArcvm() && !block_dev_init_.InitHvcDevice("hvc1")) { + return false; + } + return true; } diff --git a/init/selinux.cpp b/init/selinux.cpp index c2d9b8d28..01af2b64d 100644 --- a/init/selinux.cpp +++ b/init/selinux.cpp @@ -474,6 +474,8 @@ void SelinuxRestoreContext() { RestoreconIfExists(SnapshotManager::GetGlobalRollbackIndicatorPath().c_str(), 0); RestoreconIfExists("/metadata/gsi", SELINUX_ANDROID_RESTORECON_RECURSE | SELINUX_ANDROID_RESTORECON_SKIP_SEHASH); + + RestoreconIfExists("/dev/hvc1", 0); } int SelinuxKlogCallback(int type, const char* fmt, ...) { diff --git a/init/util.h b/init/util.h index aa24123df..056539181 100644 --- a/init/util.h +++ b/init/util.h @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -108,6 +109,10 @@ inline constexpr bool IsMicrodroid() { #endif } +inline bool IsArcvm() { + return !access("/is_arcvm", F_OK); +} + bool Has32BitAbi(); std::string GetApexNameFromFileName(const std::string& path);