Thread (31 messages) 31 messages, 6 authors, 2016-03-21
STALE3724d

[PATCH 6/8] efi/arm*: libstub: wire up GOP handling into the ARM UEFI stub

From: Ard Biesheuvel <hidden>
Date: 2016-03-10 08:36:24
Also in: linux-efi

On 10 March 2016 at 15:25, Ingo Molnar [off-list ref] wrote:
* Ard Biesheuvel [off-list ref] wrote:
quoted
diff --git a/drivers/firmware/efi/libstub/arm32-stub.c b/drivers/firmware/efi/libstub/arm32-stub.c
index 495ebd657e38..0fbe00f13186 100644
--- a/drivers/firmware/efi/libstub/arm32-stub.c
+++ b/drivers/firmware/efi/libstub/arm32-stub.c
@@ -9,6 +9,44 @@
 #include <linux/efi.h>
 #include <asm/efi.h>

+static const efi_guid_t screen_info_guid = LINUX_ARM32_SCREEN_INFO_TABLE_GUID;
+
+struct screen_info *alloc_screen_info(efi_system_table_t *sys_table_arg)
+{
+     struct screen_info *si;
+     efi_status_t status;
+
+     /*
+      * Unlike on arm64, where we can directly fill out the screen_info
+      * structure from the stub, we need to allocate a buffer to hold
+      * its contents while we hand over to the kernel proper from the
+      * decompressor.
+      */
+     status = efi_call_early(allocate_pool, EFI_RUNTIME_SERVICES_DATA,
+                             sizeof(*si), (void **)&si);
+
+     if (status != EFI_SUCCESS)
+             return NULL;
+
+     status = efi_call_early(install_configuration_table,
+                             (efi_guid_t *)&screen_info_guid, si);
+     if (status == EFI_SUCCESS)
+             return si;
+
+     efi_call_early(free_pool, si);
+     return NULL;
+}
+
+void free_screen_info(efi_system_table_t *sys_table_arg, struct screen_info *si)
+{
+     if (!si)
+             return;
+
+     efi_call_early(install_configuration_table,
+                    (efi_guid_t *)&screen_info_guid, NULL);
+     efi_call_early(free_pool, si);
+}
+
 efi_status_t handle_kernel_image(efi_system_table_t *sys_table,
                               unsigned long *image_addr,
                               unsigned long *image_size,
So screen_info_guid should probably not be a 'const': you have to cast it away
anyway, adding artificial linebreaks and uglifying the code. It's also a bad
practice to cast away const-ness, it hinders move-consts-to-readonly-sections
efforts.
The problem here is that the UEFI spec never uses const qualifiers in
its APIs for by-ref parameters that are obviously never modified by
the caller, such as these GUIDs. This is __init code regardless
(either due to the fact that it is linked into the stub rather than
the core kernel, or because we __init-ize it using objcopy) so I don't
care deeply, and I am happy to remove it.
Otherwise the series looks mostly good to me. Time for new v4.6 merges is short,
but if Matt acks it I can still take it into tip:efi/core.
Thank you. I am perfectly happy exercising some more caution here,
though, considering that our past experiences involving reshuffling
stub code for x86 were not a huge success (and broke Linus's laptop,
among others')

I was very careful not to introduce cross-object data symbol
references (which were the culprit before), and I tested both i386 and
x86_64 to the extent feasible to me, but we'd need to confirm that
those things are still fully correct before queuing this.

Thanks,
Ard.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help