#include "export-vars.h"
#include "graphics.h"
#include "initrd.h"
+#include "iovec-util-fundamental.h"
#include "line-edit.h"
#include "measure.h"
#include "memory-util-fundamental.h"
return log_error_status(err, "Error loading %ls: %m", entry->devicetree);
}
- err = initrd_register(PHYSICAL_ADDRESS_TO_POINTER(initrd_pages.addr), initrd_size, &initrd_handle);
+ err = initrd_register(&IOVEC_MAKE(PHYSICAL_ADDRESS_TO_POINTER(initrd_pages.addr), initrd_size), &initrd_handle);
if (err != EFI_SUCCESS)
return log_error_status(err, "Error registering initrd: %m");
}
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "initrd.h"
+#include "iovec-util-fundamental.h"
#include "proto/device-path.h"
#include "proto/load-file.h"
#include "util.h"
/* extend LoadFileProtocol */
struct initrd_loader {
EFI_LOAD_FILE_PROTOCOL load_file;
- const void *address;
- size_t length;
+ struct iovec data;
};
/* static structure for LINUX_INITRD_MEDIA device path
return EFI_UNSUPPORTED;
loader = (struct initrd_loader *) this;
-
- if (loader->length == 0 || !loader->address)
+ if (!iovec_is_set(&loader->data))
return EFI_NOT_FOUND;
- if (!buffer || *buffer_size < loader->length) {
- *buffer_size = loader->length;
+ if (!buffer || *buffer_size < loader->data.iov_len) {
+ *buffer_size = loader->data.iov_len;
return EFI_BUFFER_TOO_SMALL;
}
- memcpy(buffer, loader->address, loader->length);
- *buffer_size = loader->length;
+ memcpy(buffer, loader->data.iov_base, loader->data.iov_len);
+ *buffer_size = loader->data.iov_len;
return EFI_SUCCESS;
}
EFI_STATUS initrd_register(
- const void *initrd_address,
- size_t initrd_length,
+ const struct iovec *initrd,
EFI_HANDLE *ret_initrd_handle) {
EFI_STATUS err;
assert(ret_initrd_handle);
- if (!initrd_address || initrd_length == 0)
+ /* If no initrd is specified we'll not install any. This avoids regstration of the protocol for that
+ * case, leaving it open for something else. */
+
+ if (!iovec_is_set(initrd))
return EFI_SUCCESS;
/* check if a LINUX_INITRD_MEDIA_GUID DevicePath is already registered.
loader = xnew(struct initrd_loader, 1);
*loader = (struct initrd_loader) {
.load_file.LoadFile = initrd_load_file,
- .address = initrd_address,
- .length = initrd_length
+ .data = *initrd,
};
/* create a new handle and register the LoadFile2 protocol with the InitrdMediaPath on it */
}
_cleanup_(cleanup_initrd) EFI_HANDLE initrd_handle = NULL;
- err = initrd_register(initrd->iov_base, initrd->iov_len, &initrd_handle);
+ err = initrd_register(initrd, &initrd_handle);
if (err != EFI_SUCCESS)
return log_error_status(err, "Error registering initrd: %m");
}
_cleanup_(cleanup_initrd) EFI_HANDLE initrd_handle = NULL;
- err = initrd_register(initrd->iov_base, initrd->iov_len, &initrd_handle);
+ err = initrd_register(initrd, &initrd_handle);
if (err != EFI_SUCCESS)
return log_error_status(err, "Error registering initrd: %m");