forked from pool/grub2
Accepting request 396838 from home:algraf:branches:Base:System
- Add patch to free memory on exit in efi environments (bsc#980739) * grub2-efi-Free-malloc-regions-on-exit.patch OBS-URL: https://build.opensuse.org/request/show/396838 OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=215
This commit is contained in:
parent
1a206a4fcb
commit
3e8e326ed9
88
grub2-efi-Free-malloc-regions-on-exit.patch
Normal file
88
grub2-efi-Free-malloc-regions-on-exit.patch
Normal file
@ -0,0 +1,88 @@
|
||||
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);
|
@ -1,3 +1,9 @@
|
||||
-------------------------------------------------------------------
|
||||
Thu May 19 14:56:53 UTC 2016 - agraf@suse.com
|
||||
|
||||
- Add patch to free memory on exit in efi environments (bsc#980739)
|
||||
* grub2-efi-Free-malloc-regions-on-exit.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon May 2 13:25:02 UTC 2016 - olaf@aepfle.de
|
||||
|
||||
|
@ -203,6 +203,8 @@ Patch131: 0002-arm-efi-Use-fdt-from-firmware-when-available.patch
|
||||
# Hidden menu entry and hotkey "t" for text console
|
||||
Patch140: grub2-Add-hidden-menu-entries.patch
|
||||
Patch141: grub2-SUSE-Add-the-t-hotkey.patch
|
||||
# EFI free memory on exit fix (bsc#980739)
|
||||
Patch150: grub2-efi-Free-malloc-regions-on-exit.patch
|
||||
# PPC64 LE support
|
||||
Patch205: grub2-ppc64le-disable-video.patch
|
||||
Patch207: grub2-ppc64le-memory-map.patch
|
||||
@ -426,6 +428,7 @@ mv po/grub.pot po/%{name}.pot
|
||||
%patch131 -p1
|
||||
%patch140 -p1
|
||||
%patch141 -p1
|
||||
%patch150 -p1
|
||||
%patch205 -p1
|
||||
%patch207 -p1
|
||||
%patch233 -p1
|
||||
|
Loading…
Reference in New Issue
Block a user