blob: a123d9e4ab801178d9f935f149a3f871b1521daf [file] [log] [blame]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef INIT_STARTUP_UEFI_STARTUP_H_
#define INIT_STARTUP_UEFI_STARTUP_H_
#include <sys/types.h>
#include <memory>
#include <optional>
#include <string>
#include <base/files/file_enumerator.h>
#include <base/files/file_path.h>
#include <libstorage/platform/platform.h>
#include "init/startup/startup_dep_impl.h"
namespace startup {
// Abstract class for UEFI operations.
class UefiDelegate {
public:
// User and group ID.
struct UserAndGroup {
uid_t uid;
gid_t gid;
};
// Create a concrete instance of the default implementation.
static std::unique_ptr<UefiDelegate> Create(libstorage::Platform* platform,
const base::FilePath& root_dir);
virtual ~UefiDelegate();
// Check if the device was booted from UEFI firmware. This is done by
// checking if "/sys/firmware/efi" exists.
virtual bool IsUefiEnabled() const = 0;
// Get the user ID and group ID for fwupd.
virtual std::optional<UserAndGroup> GetFwupdUserAndGroup() const = 0;
// Mount the filesystem that provides access to UEFI variables.
//
// The UEFI variables are mounted at /sys/firmware/efi/efivars.
// This is a efivarfs filesystem, so it doesn't have unix permissions.
// The files need to be writable by fwupd, so mount options are used
// to set the user and group of all files to fwupd.
//
// Returns true on success.
virtual bool MountEfivarfs(const UserAndGroup& fwupd) = 0;
// Make a UEFI variable writable by the fwupd service. This applies
// two changes to the variable:
//
// 1. The file's attributes are modified to remove the immutable
// bit. That bit is set by the kernel to make it harder for end
// users to accidentally brick a machine by deleting UEFI
// variables. Some firmware is poorly implemented and will do
// unexpected things if variables it expects go missing. We need to
// relax this restriction for UEFI variables that fwupd will
// modify.
//
// Returns true on success.
virtual bool MakeUefiVarMutable(const std::string& vendor,
const std::string& name) = 0;
// Make the EFI System Resource Table (ESRT) readable by the fwupd
// service.
//
// The ESRT is represented by files in /sys/firmware/efi/esrt. The
// ownership of everything in that directory (recursive) is changed to
// fwupd.
//
// Errors are logged but otherwise ignored.
virtual void MakeEsrtReadableByFwupd(const UserAndGroup& fwupd) = 0;
};
// Initialize directories needed for UEFI platforms. Does nothing if not
// booted from UEFI firmware.
//
// Errors are logged, but not propagated to the caller.
void MaybeRunUefiStartup(UefiDelegate& uefi_delegate);
} // namespace startup
#endif // INIT_STARTUP_UEFI_STARTUP_H_