mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-22 13:33:56 +03:00
sd-boot: stub - export LoaderDevicePartUUID
This commit is contained in:
parent
85636547e7
commit
8110e144ff
@ -2519,13 +2519,15 @@ systemd_boot_headers = \
|
||||
src/boot/efi/util.h \
|
||||
src/boot/efi/console.h \
|
||||
src/boot/efi/graphics.h \
|
||||
src/boot/efi/pefile.h
|
||||
src/boot/efi/pefile.h \
|
||||
src/boot/efi/disk.h
|
||||
|
||||
systemd_boot_sources = \
|
||||
src/boot/efi/util.c \
|
||||
src/boot/efi/console.c \
|
||||
src/boot/efi/graphics.c \
|
||||
src/boot/efi/pefile.c \
|
||||
src/boot/efi/disk.c \
|
||||
src/boot/efi/boot.c
|
||||
|
||||
EXTRA_DIST += $(systemd_boot_sources) $(systemd_boot_headers)
|
||||
@ -2558,6 +2560,7 @@ endif
|
||||
stub_headers = \
|
||||
src/boot/efi/util.h \
|
||||
src/boot/efi/pefile.h \
|
||||
src/boot/efi/disk.h \
|
||||
src/boot/efi/graphics.h \
|
||||
src/boot/efi/splash.h \
|
||||
src/boot/efi/linux.h
|
||||
@ -2565,6 +2568,7 @@ stub_headers = \
|
||||
stub_sources = \
|
||||
src/boot/efi/util.c \
|
||||
src/boot/efi/pefile.c \
|
||||
src/boot/efi/disk.c \
|
||||
src/boot/efi/graphics.c \
|
||||
src/boot/efi/splash.c \
|
||||
src/boot/efi/linux.c \
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "console.h"
|
||||
#include "graphics.h"
|
||||
#include "pefile.h"
|
||||
#include "disk.h"
|
||||
#include "linux.h"
|
||||
|
||||
#ifndef EFI_OS_INDICATIONS_BOOT_TO_FW_UI
|
||||
@ -1696,11 +1697,11 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
|
||||
EFI_LOADED_IMAGE *loaded_image;
|
||||
EFI_FILE *root_dir;
|
||||
CHAR16 *loaded_image_path;
|
||||
EFI_DEVICE_PATH *device_path;
|
||||
EFI_STATUS err;
|
||||
Config config;
|
||||
UINT64 init_usec;
|
||||
BOOLEAN menu = FALSE;
|
||||
CHAR16 uuid[37];
|
||||
|
||||
InitializeLib(image, sys_table);
|
||||
init_usec = time_usec();
|
||||
@ -1722,29 +1723,8 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
|
||||
}
|
||||
|
||||
/* export the device path this image is started from */
|
||||
device_path = DevicePathFromHandle(loaded_image->DeviceHandle);
|
||||
if (device_path) {
|
||||
EFI_DEVICE_PATH *path, *paths;
|
||||
|
||||
paths = UnpackDevicePath(device_path);
|
||||
for (path = paths; !IsDevicePathEnd(path); path = NextDevicePathNode(path)) {
|
||||
HARDDRIVE_DEVICE_PATH *drive;
|
||||
CHAR16 uuid[37];
|
||||
|
||||
if (DevicePathType(path) != MEDIA_DEVICE_PATH)
|
||||
continue;
|
||||
if (DevicePathSubType(path) != MEDIA_HARDDRIVE_DP)
|
||||
continue;
|
||||
drive = (HARDDRIVE_DEVICE_PATH *)path;
|
||||
if (drive->SignatureType != SIGNATURE_TYPE_GUID)
|
||||
continue;
|
||||
|
||||
GuidToString(uuid, (EFI_GUID *)&drive->Signature);
|
||||
efivar_set(L"LoaderDevicePartUUID", uuid, FALSE);
|
||||
break;
|
||||
}
|
||||
FreePool(paths);
|
||||
}
|
||||
if (disk_get_part_uuid(loaded_image->DeviceHandle, uuid) == EFI_SUCCESS)
|
||||
efivar_set(L"LoaderDevicePartUUID", uuid, FALSE);
|
||||
|
||||
root_dir = LibOpenRoot(loaded_image->DeviceHandle);
|
||||
if (!root_dir) {
|
||||
|
51
src/boot/efi/disk.c
Normal file
51
src/boot/efi/disk.c
Normal file
@ -0,0 +1,51 @@
|
||||
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* Copyright (C) 2015 Kay Sievers <kay@vrfy.org>
|
||||
*/
|
||||
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
#include "util.h"
|
||||
|
||||
EFI_STATUS disk_get_part_uuid(EFI_HANDLE *handle, CHAR16 uuid[37]) {
|
||||
EFI_DEVICE_PATH *device_path;
|
||||
EFI_STATUS r = EFI_NOT_FOUND;
|
||||
|
||||
/* export the device path this image is started from */
|
||||
device_path = DevicePathFromHandle(handle);
|
||||
if (device_path) {
|
||||
EFI_DEVICE_PATH *path, *paths;
|
||||
|
||||
paths = UnpackDevicePath(device_path);
|
||||
for (path = paths; !IsDevicePathEnd(path); path = NextDevicePathNode(path)) {
|
||||
HARDDRIVE_DEVICE_PATH *drive;
|
||||
|
||||
if (DevicePathType(path) != MEDIA_DEVICE_PATH)
|
||||
continue;
|
||||
if (DevicePathSubType(path) != MEDIA_HARDDRIVE_DP)
|
||||
continue;
|
||||
drive = (HARDDRIVE_DEVICE_PATH *)path;
|
||||
if (drive->SignatureType != SIGNATURE_TYPE_GUID)
|
||||
continue;
|
||||
|
||||
GuidToString(uuid, (EFI_GUID *)&drive->Signature);
|
||||
r = EFI_SUCCESS;
|
||||
break;
|
||||
}
|
||||
FreePool(paths);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
21
src/boot/efi/disk.h
Normal file
21
src/boot/efi/disk.h
Normal file
@ -0,0 +1,21 @@
|
||||
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* Copyright (C) 2015 Kay Sievers <kay@vrfy.org>
|
||||
*/
|
||||
|
||||
#ifndef __SDBOOT_DISK_H
|
||||
#define __SDBOOT_DISK_H
|
||||
|
||||
EFI_STATUS disk_get_part_uuid(EFI_HANDLE *handle, CHAR16 uuid[37]);
|
||||
#endif
|
@ -18,6 +18,7 @@
|
||||
|
||||
#include "util.h"
|
||||
#include "pefile.h"
|
||||
#include "disk.h"
|
||||
#include "graphics.h"
|
||||
#include "splash.h"
|
||||
#include "linux.h"
|
||||
@ -46,6 +47,7 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
|
||||
UINTN szs[ELEMENTSOF(sections)-1] = {};
|
||||
CHAR8 *cmdline = NULL;
|
||||
UINTN cmdline_len;
|
||||
CHAR16 uuid[37];
|
||||
EFI_STATUS err;
|
||||
|
||||
InitializeLib(image, sys_table);
|
||||
@ -99,6 +101,10 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
|
||||
cmdline = line;
|
||||
}
|
||||
|
||||
/* export the device path this image is started from */
|
||||
if (disk_get_part_uuid(loaded_image->DeviceHandle, uuid) == EFI_SUCCESS)
|
||||
efivar_set(L"LoaderDevicePartUUID", uuid, FALSE);
|
||||
|
||||
if (szs[3] > 0)
|
||||
graphics_splash((UINT8 *)((UINTN)loaded_image->ImageBase + addrs[3]), szs[3], NULL);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user