/* * Copyright (C) 2021 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 "pkvm_enabler" #include #include #include #include #include #include #define KVM_DEVICE "/dev/kvm" #define MISC_WRITER "/vendor/bin/misc_writer" int main() { char *newargv[] = { MISC_WRITER, "--set-enable-pkvm", NULL }; char *newenvp[] = { NULL }; pid_t pid; int ret, wstatus; /* Check whether KVM device exists. */ ret = access(KVM_DEVICE, F_OK); /* If KVM device exists, return SUCCESS to continue booting. */ if (ret == 0) { exit(EXIT_SUCCESS); } if (ret != -ENOENT) { ALOGW("Unexpected error from access(): %d", ret); } /* * If KVM device does not exist, run misc_writer and return FAILURE * to force a reboot. */ pid = fork(); if (pid == -1) { ALOGE("Could not fork: %d", errno); exit(EXIT_FAILURE); } if (pid == 0) { execve(MISC_WRITER, newargv, newenvp); ALOGE("Could not execute " MISC_WRITER ": %d", errno); _exit(EXIT_FAILURE); } waitpid(pid, &wstatus, 0); if (WIFEXITED(wstatus)) { ret = WEXITSTATUS(wstatus); if (ret) { ALOGE(MISC_WRITER " exit status: %d", ret); } } else { ALOGE(MISC_WRITER " terminated unexpectedly: %d", wstatus); } exit(EXIT_FAILURE); }