forked from pool/grub2
597bfc56db
1 OBS-URL: https://build.opensuse.org/request/show/396902 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=136
89 lines
3.1 KiB
Diff
89 lines
3.1 KiB
Diff
From 0c5fbc745846a53cc04ac1052cfbd35c699394c5 Mon Sep 17 00:00:00 2001
|
|
From: Alexander Graf <agraf@suse.de>
|
|
Date: Thu, 19 May 2016 15:01:06 +0200
|
|
Subject: [PATCH] efi: Free malloc regions on exit
|
|
|
|
When we exit grub, we don't free all the memory that we allocated earlier
|
|
for our heap region. This can cause problems with setups where you try
|
|
to descend the boot order using "exit" entries, such as PXE -> HD boot
|
|
scenarios.
|
|
|
|
Signed-off-by: Alexander Graf <agraf@suse.de>
|
|
---
|
|
grub-core/kern/efi/init.c | 1 +
|
|
grub-core/kern/efi/mm.c | 24 ++++++++++++++++++++++++
|
|
include/grub/efi/efi.h | 1 +
|
|
3 files changed, 26 insertions(+)
|
|
|
|
Index: grub-2.02~beta3/grub-core/kern/efi/init.c
|
|
===================================================================
|
|
--- grub-2.02~beta3.orig/grub-core/kern/efi/init.c
|
|
+++ grub-2.02~beta3/grub-core/kern/efi/init.c
|
|
@@ -167,4 +167,5 @@ grub_efi_fini (void)
|
|
{
|
|
grub_efidisk_fini ();
|
|
grub_console_fini ();
|
|
+ grub_efi_memory_fini ();
|
|
}
|
|
Index: grub-2.02~beta3/grub-core/kern/efi/mm.c
|
|
===================================================================
|
|
--- grub-2.02~beta3.orig/grub-core/kern/efi/mm.c
|
|
+++ grub-2.02~beta3/grub-core/kern/efi/mm.c
|
|
@@ -49,6 +49,12 @@ static grub_efi_uintn_t finish_desc_size
|
|
static grub_efi_uint32_t finish_desc_version;
|
|
int grub_efi_is_finished = 0;
|
|
|
|
+struct efi_allocation {
|
|
+ grub_uint64_t start_addr;
|
|
+ grub_uint64_t pages;
|
|
+} efi_allocated_memory[16];
|
|
+unsigned int efi_allocated_memory_idx = 0;
|
|
+
|
|
/* Allocate pages below a specified address */
|
|
void *
|
|
grub_efi_allocate_pages_max (grub_efi_physical_address_t max,
|
|
@@ -440,6 +446,13 @@ add_memory_regions (grub_efi_memory_desc
|
|
(void *) ((grub_addr_t) start),
|
|
(unsigned) pages);
|
|
|
|
+ /* Track up to 16 regions that we allocate from */
|
|
+ if (efi_allocated_memory_idx < ARRAY_SIZE(efi_allocated_memory)) {
|
|
+ efi_allocated_memory[efi_allocated_memory_idx].start_addr = start;
|
|
+ efi_allocated_memory[efi_allocated_memory_idx].pages = pages;
|
|
+ efi_allocated_memory_idx++;
|
|
+ }
|
|
+
|
|
grub_mm_init_region (addr, PAGES_TO_BYTES (pages));
|
|
|
|
required_pages -= pages;
|
|
@@ -451,6 +464,17 @@ add_memory_regions (grub_efi_memory_desc
|
|
grub_fatal ("too little memory");
|
|
}
|
|
|
|
+void
|
|
+grub_efi_memory_fini (void)
|
|
+{
|
|
+ unsigned int i;
|
|
+
|
|
+ for (i = 0; i < efi_allocated_memory_idx; i++) {
|
|
+ grub_efi_free_pages (efi_allocated_memory[i].start_addr,
|
|
+ efi_allocated_memory[i].pages);
|
|
+ }
|
|
+}
|
|
+
|
|
#if 0
|
|
/* Print the memory map. */
|
|
static void
|
|
Index: grub-2.02~beta3/include/grub/efi/efi.h
|
|
===================================================================
|
|
--- grub-2.02~beta3.orig/include/grub/efi/efi.h
|
|
+++ grub-2.02~beta3/include/grub/efi/efi.h
|
|
@@ -51,6 +51,7 @@ EXPORT_FUNC(grub_efi_get_memory_map) (gr
|
|
grub_efi_uintn_t *map_key,
|
|
grub_efi_uintn_t *descriptor_size,
|
|
grub_efi_uint32_t *descriptor_version);
|
|
+void grub_efi_memory_fini (void);
|
|
grub_efi_loaded_image_t *EXPORT_FUNC(grub_efi_get_loaded_image) (grub_efi_handle_t image_handle);
|
|
void EXPORT_FUNC(grub_efi_print_device_path) (grub_efi_device_path_t *dp);
|
|
char *EXPORT_FUNC(grub_efi_get_filename) (grub_efi_device_path_t *dp);
|