Thread (13 messages) 13 messages, 2 authors, 2020-01-31
STALE2320d

[PATCH 5/8] efi/x86: Allocate only the required 32 bytes for the GDT

From: Arvind Sankar <hidden>
Date: 2020-01-30 20:04:49
Also in: linux-efi
Subsystem: the rest, x86 architecture (32-bit and 64-bit) · Maintainers: Linus Torvalds, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen

For the 32-bit boot GDT, we only need 4 descriptors. Allocate the
required 32 bytes using allocate_pool, rather than always allocating a
full page. The UEFI spec guarantees that allocate_pool returns an 8-byte
aligned buffer, so we don't need to do additional alignment.

The "size" stored in the GDT pointer should be one less than the true
size of the GDT.

Signed-off-by: Arvind Sankar <redacted>
---
 arch/x86/boot/compressed/eboot.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
index a72cfda91d7e..2447e4508aa4 100644
--- a/arch/x86/boot/compressed/eboot.c
+++ b/arch/x86/boot/compressed/eboot.c
@@ -350,14 +350,23 @@ static efi_status_t setup_gdt(struct desc_ptr *gdt)
 	efi_status_t status;
 	struct desc_struct *desc;
 
-	gdt->size = 0x800;
-	status = efi_low_alloc(gdt->size, 8, (unsigned long *)&gdt->address);
+	gdt->size = 0x20;
+	status = efi_bs_call(allocate_pool, EFI_LOADER_DATA, gdt->size,
+			     (void **)&gdt->address);
 	if (status != EFI_SUCCESS) {
 		efi_printk("Failed to allocate memory for 'gdt'\n");
 		return status;
 	}
 
 	memset((char *)gdt->address, 0x0, gdt->size);
+
+	/*
+	 * The "size" stored in the GDT pointer is actually a limit value,
+	 * which when added to the base address gives the address of the last
+	 * byte of the GDT. Hence it should be one less than the true size.
+	 */
+	gdt->size--;
+
 	desc = (struct desc_struct *)gdt->address;
 
 	/* The first GDT is a dummy. */
-- 
2.24.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help