[grub] * Wed Aug 04 2010 Peter Jones <pjones at redhat.com> - 0.97-66 - Draw the inverted line correctly in th
Peter Jones
pjones at fedoraproject.org
Wed Aug 4 19:41:24 UTC 2010
commit 1c4aaccc1d108140f3bb05ec89731ce52c053022
Author: Peter Jones <pjones at redhat.com>
Date: Wed Aug 4 15:43:49 2010 -0400
* Wed Aug 04 2010 Peter Jones <pjones at redhat.com> - 0.97-66
- Draw the inverted line correctly in the menu
Resolves: rhbz#613153
- Don't fail to boot on UEFI when the memory map changes (shayes)
Resolves: rhbz#607213
- Allow drive remaping in UEFI mode so ordering changes don't cause failure
Resolves: rhbz#598572
grub-0.97-better-get-memory-map-rhbz607213.patch | 572 ++++++++++++++++++++
...7-invert-highlighted-menu-line-rhbz613153.patch | 116 ++++
2 files changed, 688 insertions(+), 0 deletions(-)
---
diff --git a/grub-0.97-better-get-memory-map-rhbz607213.patch b/grub-0.97-better-get-memory-map-rhbz607213.patch
new file mode 100644
index 0000000..749f870
--- /dev/null
+++ b/grub-0.97-better-get-memory-map-rhbz607213.patch
@@ -0,0 +1,572 @@
+From 3605b86b534c4bdc5ab5011b7ac1568bf986fa91 Mon Sep 17 00:00:00 2001
+From: Peter Jones <pjones at redhat.com>
+Date: Mon, 12 Jul 2010 16:45:47 -0400
+Subject: [PATCH] Make the allocator for kernel memory slightly more sane...
+
+Based on a patch from Stuart Hayes.
+---
+ efi/efimm.c | 78 ++++++++++++++++++++----------------
+ efi/grub/efi/efi.h | 8 ++-
+ efi/ia32/loader/linux.c | 96 ++++++--------------------------------------
+ efi/x86_64/loader/linux.c | 90 +++++-------------------------------------
+ 4 files changed, 71 insertions(+), 201 deletions(-)
+
+diff --git a/efi/efimm.c b/efi/efimm.c
+index 3b790d5..e21babd 100644
+--- a/efi/efimm.c
++++ b/efi/efimm.c
+@@ -32,9 +32,11 @@
+ #define BYTES_TO_PAGES(bytes) ((bytes) >> 12)
+ #define PAGES_TO_BYTES(pages) ((pages) << 12)
+
+-/* The size of a memory map obtained from the firmware. This must be
+- a multiplier of 4KB. */
+-#define MEMORY_MAP_SIZE 0x2000
++/* Global variables used to store memory map, its size, and the number of
++ * pages allocated for the buffer. */
++void *mmap_buf;
++grub_efi_uintn_t mmap_size;
++grub_efi_uintn_t mmap_pages;
+
+ /* Maintain the list of allocated pages. */
+ struct allocated_page
+@@ -205,11 +207,14 @@ grub_efi_free_pages (grub_efi_physical_address_t address,
+ }
+
+ /* Get the memory map as defined in the EFI spec. Return 1 if successful,
+- return 0 if partial, or return -1 if an error occurs. */
++ return 0 if partial, or return -1 if an error occurs.
++
++ This function will allocate memory for (global) mmap_buf if there isn't
++ already a buffer allocated, and will free & reallocate if it needs to
++ be larger. */
++
+ int
+-grub_efi_get_memory_map (grub_efi_uintn_t *memory_map_size,
+- grub_efi_memory_descriptor_t *memory_map,
+- grub_efi_uintn_t *map_key,
++grub_efi_get_memory_map (grub_efi_uintn_t *map_key,
+ grub_efi_uintn_t *descriptor_size,
+ grub_efi_uint32_t *descriptor_version)
+ {
+@@ -217,6 +222,7 @@ grub_efi_get_memory_map (grub_efi_uintn_t *memory_map_size,
+ grub_efi_boot_services_t *b;
+ grub_efi_uintn_t key;
+ grub_efi_uint32_t version;
++ grub_efi_uintn_t tmp_mmap_size;
+
+ /* Allow some parameters to be missing. */
+ if (! map_key)
+@@ -224,16 +230,35 @@ grub_efi_get_memory_map (grub_efi_uintn_t *memory_map_size,
+ if (! descriptor_version)
+ descriptor_version = &version;
+
+- b = grub_efi_system_table->boot_services;
+- status = Call_Service_5 (b->get_memory_map,
+- memory_map_size, memory_map, map_key,
++ while (1)
++ {
++ b = grub_efi_system_table->boot_services;
++ tmp_mmap_size = PAGES_TO_BYTES(mmap_pages);
++ status = Call_Service_5 (b->get_memory_map,
++ &tmp_mmap_size, mmap_buf, map_key,
+ descriptor_size, descriptor_version);
+- if (status == GRUB_EFI_SUCCESS)
+- return 1;
+- else if (status == GRUB_EFI_BUFFER_TOO_SMALL)
+- return 0;
+- else
+- return -1;
++ if (status == GRUB_EFI_SUCCESS)
++ {
++ mmap_size = tmp_mmap_size;
++ return 1;
++ }
++ else if (status != GRUB_EFI_BUFFER_TOO_SMALL)
++ return -1;
++
++ /* we need a larger buffer */
++ if (mmap_buf)
++ grub_efi_free_pages ((grub_addr_t) mmap_buf, mmap_pages);
++
++ /* get 1 more page than we need, just in case */
++ mmap_pages = BYTES_TO_PAGES(tmp_mmap_size + 4095) + 1;
++ mmap_buf = grub_efi_allocate_pages (0, mmap_pages);
++ if (! mmap_buf)
++ {
++ mmap_pages = 0;
++ grub_printf ("cannot allocate memory for memory map");
++ return -1;
++ }
++ }
+ }
+
+ #define MMAR_DESC_LENGTH 20
+@@ -345,33 +370,16 @@ static void
+ update_e820_map (struct e820_entry *e820_map,
+ int *e820_nr_map)
+ {
+- grub_efi_memory_descriptor_t *memory_map;
+- grub_efi_uintn_t map_size;
+ grub_efi_uintn_t desc_size;
+
+- /* Prepare a memory region to store memory map. */
+- memory_map = grub_efi_allocate_pages (0, BYTES_TO_PAGES (MEMORY_MAP_SIZE));
+- if (! memory_map)
+- {
+- grub_printf ("cannot allocate memory");
+- return;
+- }
+-
+- /* Obtain descriptors for available memory. */
+- map_size = MEMORY_MAP_SIZE;
+-
+- if (grub_efi_get_memory_map (&map_size, memory_map, 0, &desc_size, 0) < 0)
++ if (grub_efi_get_memory_map (0, &desc_size, 0) < 0)
+ {
+ grub_printf ("cannot get memory map");
+ return;
+ }
+
+ e820_map_from_efi_map (e820_map, e820_nr_map,
+- memory_map, desc_size, map_size);
+-
+- /* Release the memory map. */
+- grub_efi_free_pages ((grub_addr_t) memory_map,
+- BYTES_TO_PAGES (MEMORY_MAP_SIZE));
++ mmap_buf, desc_size, mmap_size);
+ }
+
+ /* Simulated memory sizes. */
+diff --git a/efi/grub/efi/efi.h b/efi/grub/efi/efi.h
+index 858e37d..936759b 100644
+--- a/efi/grub/efi/efi.h
++++ b/efi/grub/efi/efi.h
+@@ -52,9 +52,7 @@ void
+ grub_efi_free_pages (grub_efi_physical_address_t address,
+ grub_efi_uintn_t pages);
+ int
+-grub_efi_get_memory_map (grub_efi_uintn_t * memory_map_size,
+- grub_efi_memory_descriptor_t * memory_map,
+- grub_efi_uintn_t * map_key,
++grub_efi_get_memory_map (grub_efi_uintn_t * map_key,
+ grub_efi_uintn_t * descriptor_size,
+ grub_efi_uint32_t * descriptor_version);
+ grub_efi_loaded_image_t *grub_efi_get_loaded_image (grub_efi_handle_t
+@@ -71,6 +69,10 @@ void grub_efi_fini (void);
+ void grub_efi_set_prefix (void);
+
+ /* Variables. */
++extern void *mmap_buf;
++extern grub_efi_uintn_t mmap_size;
++extern grub_efi_uintn_t mmap_pages;
++
+ extern grub_efi_system_table_t *grub_efi_system_table;
+ extern grub_efi_handle_t grub_efi_image_handle;
+
+diff --git a/efi/ia32/loader/linux.c b/efi/ia32/loader/linux.c
+index 41f1ce6..eb6b5de 100644
+--- a/efi/ia32/loader/linux.c
++++ b/efi/ia32/loader/linux.c
+@@ -42,11 +42,9 @@ static int loaded;
+ static void *real_mode_mem;
+ static void *prot_mode_mem;
+ static void *initrd_mem;
+-static void *mmap_buf;
+ static grub_efi_uintn_t real_mode_pages;
+ static grub_efi_uintn_t prot_mode_pages;
+ static grub_efi_uintn_t initrd_pages;
+-static grub_efi_uintn_t mmap_pages;
+ static grub_efi_guid_t graphics_output_guid = GRUB_EFI_GRAPHICS_OUTPUT_GUID;
+
+ static inline grub_size_t
+@@ -55,45 +53,6 @@ page_align (grub_size_t size)
+ return (size + (1 << 12) - 1) & (~((1 << 12) - 1));
+ }
+
+-/* Find the optimal number of pages for the memory map. Is it better to
+- move this code to efimm.c? */
+-static grub_efi_uintn_t
+-find_mmap_size (void)
+-{
+- static grub_efi_uintn_t mmap_size = 0;
+-
+- if (mmap_size != 0)
+- return mmap_size;
+-
+- mmap_size = (1 << 12);
+- while (1)
+- {
+- int ret;
+- grub_efi_memory_descriptor_t *mmap;
+- grub_efi_uintn_t desc_size;
+-
+- mmap = grub_malloc (mmap_size);
+- if (! mmap)
+- return 0;
+-
+- ret = grub_efi_get_memory_map (&mmap_size, mmap, 0, &desc_size, 0);
+- grub_free (mmap);
+-
+- if (ret < 0)
+- grub_fatal ("cannot get memory map");
+- else if (ret > 0)
+- break;
+-
+- mmap_size += (1 << 12);
+- }
+-
+- /* Increase the size a bit for safety, because GRUB allocates more on
+- later, and EFI itself may allocate more. */
+- mmap_size += (1 << 11);
+-
+- return page_align (mmap_size);
+-}
+-
+ static void
+ free_pages (void)
+ {
+@@ -128,15 +87,13 @@ static int
+ allocate_pages (grub_size_t real_size, grub_size_t prot_size)
+ {
+ grub_efi_uintn_t desc_size;
+- grub_efi_memory_descriptor_t *mmap, *mmap_end;
+- grub_efi_uintn_t mmap_size, tmp_mmap_size;
++ grub_efi_memory_descriptor_t *mmap_end;
+ grub_efi_memory_descriptor_t *desc;
+ grub_efi_physical_address_t addr;
+
+ /* Make sure that each size is aligned to a page boundary. */
+ real_size = page_align (real_size + SECTOR_SIZE);
+ prot_size = page_align (prot_size);
+- mmap_size = find_mmap_size ();
+
+ grub_dprintf ("linux", "real_size = %x, prot_size = %x, mmap_size = %x\n",
+ (unsigned int) real_size, (unsigned int) prot_size,
+@@ -146,30 +103,19 @@ allocate_pages (grub_size_t real_size, grub_size_t prot_size)
+ the memory map buffer for simplicity. */
+ real_mode_pages = (real_size >> 12);
+ prot_mode_pages = (prot_size >> 12);
+- mmap_pages = (mmap_size >> 12);
+
+ /* Initialize the memory pointers with NULL for convenience. */
+ real_mode_mem = 0;
+ prot_mode_mem = 0;
+- mmap_buf = 0;
+-
+- /* Read the memory map temporarily, to find free space. */
+- mmap = grub_malloc (mmap_size);
+- if (! mmap)
+- {
+- errnum = ERR_UNRECOGNIZED;
+- return 0;
+- }
+
+- tmp_mmap_size = mmap_size;
+- if (grub_efi_get_memory_map (&tmp_mmap_size, mmap, 0, &desc_size, 0) <= 0)
++ if (grub_efi_get_memory_map (0, &desc_size, 0) <= 0)
+ grub_fatal ("cannot get memory map");
+
+ addr = 0;
+- mmap_end = NEXT_MEMORY_DESCRIPTOR (mmap, tmp_mmap_size);
++ mmap_end = NEXT_MEMORY_DESCRIPTOR (mmap_buf, mmap_size);
+ /* First, find free pages for the real mode code
+ and the memory map buffer. */
+- for (desc = mmap;
++ for (desc = mmap_buf;
+ desc < mmap_end;
+ desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
+ {
+@@ -183,7 +129,7 @@ allocate_pages (grub_size_t real_size, grub_size_t prot_size)
+ grub_dprintf ("linux", "physical_start = %x, physical_end = %x\n",
+ (unsigned) desc->physical_start,
+ (unsigned) physical_end);
+- addr = physical_end - real_size - mmap_size;
++ addr = physical_end - real_size;
+ if (addr < 0x10000)
+ continue;
+
+@@ -205,29 +151,15 @@ allocate_pages (grub_size_t real_size, grub_size_t prot_size)
+ goto fail;
+ }
+
+- mmap_buf = grub_efi_allocate_pages (0, mmap_pages);
+- if (! mmap_buf)
+- {
+- grub_printf("cannot allocate efi mmap pages");
+- errnum = ERR_WONT_FIT;
+- goto fail;
+- }
+-
+ /* Next, find free pages for the protected mode code. */
+ /* XXX what happens if anything is using this address? */
+ prot_mode_mem = grub_efi_allocate_pages (0x100000, prot_mode_pages);
+ if (! prot_mode_mem)
+- {
+- errnum = ERR_WONT_FIT;
+- grub_printf ("cannot allocate protected mode pages");
+- goto fail;
+- }
++ grub_fatal("Cannot allocate pages for VMLINUZ");
+
+- grub_free (mmap);
+ return 1;
+
+ fail:
+- grub_free (mmap);
+ free_pages ();
+ return 0;
+ }
+@@ -274,7 +206,6 @@ big_linux_boot (void)
+ {
+ struct linux_kernel_params *params;
+ struct grub_linux_kernel_header *lh;
+- grub_efi_uintn_t mmap_size;
+ grub_efi_uintn_t map_key;
+ grub_efi_uintn_t desc_size;
+ grub_efi_uint32_t desc_version;
+@@ -285,9 +216,7 @@ big_linux_boot (void)
+
+ graphics_set_kernel_params (params);
+
+- mmap_size = find_mmap_size ();
+- if (grub_efi_get_memory_map (&mmap_size, mmap_buf, &map_key,
+- &desc_size, &desc_version) <= 0)
++ if (grub_efi_get_memory_map (&map_key, &desc_size, &desc_version) <= 0)
+ grub_fatal ("cannot get memory map");
+
+ /* Pass e820 memmap. */
+@@ -599,10 +528,12 @@ grub_load_initrd (char *initrd)
+ grub_ssize_t size;
+ grub_addr_t addr_min, addr_max;
+ grub_addr_t addr;
+- grub_efi_uintn_t mmap_size;
++ grub_efi_uintn_t map_key;
++ grub_efi_memory_descriptor_t *mmap_end;
+ grub_efi_memory_descriptor_t *desc;
+ grub_efi_memory_descriptor_t tdesc;
+ grub_efi_uintn_t desc_size;
++ grub_efi_uint32_t desc_version;
+ struct linux_kernel_params *params;
+
+ if (initrd == NULL)
+@@ -644,14 +575,13 @@ grub_load_initrd (char *initrd)
+ grub_dprintf(__func__, "prot_mode_mem=%p prot_mode_pages=%lu\n", prot_mode_mem, prot_mode_pages);
+
+ /* Find the highest address to put the initrd. */
+- mmap_size = find_mmap_size ();
+- grub_dprintf(__func__, "addr_min: 0x%lx addr_max: 0x%lx mmap_size: %lu\n", addr_min, addr_max, mmap_size);
+- if (grub_efi_get_memory_map (&mmap_size, mmap_buf, 0, &desc_size, 0) <= 0)
++ if (grub_efi_get_memory_map (&map_key, &desc_size, &desc_version) <= 0)
+ grub_fatal ("cannot get memory map");
+
++ mmap_end = NEXT_MEMORY_DESCRIPTOR (mmap_buf, mmap_size);
+ addr = 0;
+ for (desc = mmap_buf;
+- desc < NEXT_MEMORY_DESCRIPTOR (mmap_buf, mmap_size);
++ desc < mmap_end;
+ desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
+ {
+ if (desc->type != GRUB_EFI_CONVENTIONAL_MEMORY)
+diff --git a/efi/x86_64/loader/linux.c b/efi/x86_64/loader/linux.c
+index a5cfbf8..18746ea 100644
+--- a/efi/x86_64/loader/linux.c
++++ b/efi/x86_64/loader/linux.c
+@@ -43,11 +43,9 @@ static void *real_mode_mem;
+ static void *prot_mode_mem;
+ static grub_size_t prot_kernel_size;
+ static void *initrd_mem;
+-static void *mmap_buf;
+ static grub_efi_uintn_t real_mode_pages;
+ static grub_efi_uintn_t prot_mode_pages;
+ static grub_efi_uintn_t initrd_pages;
+-static grub_efi_uintn_t mmap_pages;
+ static grub_efi_guid_t graphics_output_guid = GRUB_EFI_GRAPHICS_OUTPUT_GUID;
+
+ static inline grub_size_t
+@@ -56,45 +54,6 @@ page_align (grub_size_t size)
+ return (size + (1 << 12) - 1) & (~((1 << 12) - 1));
+ }
+
+-/* Find the optimal number of pages for the memory map. Is it better to
+- move this code to efimm.c? */
+-static grub_efi_uintn_t
+-find_mmap_size (void)
+-{
+- static grub_efi_uintn_t mmap_size = 0;
+-
+- if (mmap_size != 0)
+- return mmap_size;
+-
+- mmap_size = (1 << 12);
+- while (1)
+- {
+- int ret;
+- grub_efi_memory_descriptor_t *mmap;
+- grub_efi_uintn_t desc_size;
+-
+- mmap = grub_malloc (mmap_size);
+- if (! mmap)
+- return 0;
+-
+- ret = grub_efi_get_memory_map (&mmap_size, mmap, 0, &desc_size, 0);
+- grub_free (mmap);
+-
+- if (ret < 0)
+- grub_fatal ("cannot get memory map");
+- else if (ret > 0)
+- break;
+-
+- mmap_size += (1 << 12);
+- }
+-
+- /* Increase the size a bit for safety, because GRUB allocates more on
+- later, and EFI itself may allocate more. */
+- mmap_size += (1 << 11);
+-
+- return page_align (mmap_size);
+-}
+-
+ static void
+ free_pages (void)
+ {
+@@ -123,15 +82,13 @@ static int
+ allocate_pages (grub_size_t real_size, grub_size_t prot_size)
+ {
+ grub_efi_uintn_t desc_size;
+- grub_efi_memory_descriptor_t *mmap, *mmap_end;
+- grub_efi_uintn_t mmap_size, tmp_mmap_size;
++ grub_efi_memory_descriptor_t *mmap_end;
+ grub_efi_memory_descriptor_t *desc;
+ grub_efi_physical_address_t addr;
+
+ /* Make sure that each size is aligned to a page boundary. */
+ real_size = page_align (real_size + SECTOR_SIZE);
+ prot_size = page_align (prot_size);
+- mmap_size = find_mmap_size ();
+
+ grub_dprintf ("linux", "real_size = %x, prot_size = %x, mmap_size = %x\n",
+ (unsigned int) real_size, (unsigned int) prot_size,
+@@ -141,30 +98,19 @@ allocate_pages (grub_size_t real_size, grub_size_t prot_size)
+ the memory map buffer for simplicity. */
+ real_mode_pages = (real_size >> 12);
+ prot_mode_pages = (prot_size >> 12);
+- mmap_pages = (mmap_size >> 12);
+
+ /* Initialize the memory pointers with NULL for convenience. */
+ real_mode_mem = 0;
+ prot_mode_mem = 0;
+- mmap_buf = 0;
+-
+- /* Read the memory map temporarily, to find free space. */
+- mmap = grub_malloc (mmap_size);
+- if (! mmap)
+- {
+- errnum = ERR_UNRECOGNIZED;
+- return 0;
+- }
+
+- tmp_mmap_size = mmap_size;
+- if (grub_efi_get_memory_map (&tmp_mmap_size, mmap, 0, &desc_size, 0) <= 0)
++ if (grub_efi_get_memory_map (0, &desc_size, 0) <= 0)
+ grub_fatal ("cannot get memory map");
+
+ addr = 0;
+- mmap_end = NEXT_MEMORY_DESCRIPTOR (mmap, tmp_mmap_size);
++ mmap_end = NEXT_MEMORY_DESCRIPTOR (mmap_buf, mmap_size);
+ /* First, find free pages for the real mode code
+ and the memory map buffer. */
+- for (desc = mmap;
++ for (desc = mmap_buf;
+ desc < mmap_end;
+ desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
+ {
+@@ -172,23 +118,22 @@ allocate_pages (grub_size_t real_size, grub_size_t prot_size)
+ && desc->num_pages >= real_mode_pages)
+ {
+ grub_efi_physical_address_t physical_end;
+- int allocsize = real_size + mmap_size;
+
+ physical_end = desc->physical_start + (desc->num_pages << 12);
+
+ grub_dprintf ("linux", "physical_start = %x, physical_end = %x\n",
+ (unsigned) desc->physical_start,
+ (unsigned) physical_end);
+- addr = physical_end - allocsize;
++ addr = physical_end - real_size;
+ if (addr < 0x10000)
+ continue;
+
+ /* the kernel wants this address to be under 1 gig.*/
+- if (desc->physical_start > 0x40000000 - allocsize)
++ if (desc->physical_start > 0x40000000 - real_size)
+ continue;
+
+- if (addr > 0x40000000 - allocsize)
+- addr = 0x40000000 - allocsize;
++ if (addr > 0x40000000 - real_size)
++ addr = 0x40000000 - real_size;
+
+ grub_dprintf ("linux", "trying to allocate %u pages at %x\n",
+ (unsigned) real_mode_pages, (unsigned) addr);
+@@ -215,19 +160,9 @@ allocate_pages (grub_size_t real_size, grub_size_t prot_size)
+ if (!prot_mode_mem)
+ grub_fatal("Cannot allocate pages for VMLINUZ");
+
+- mmap_buf = grub_efi_allocate_pages (0, mmap_pages);
+- if (! mmap_buf)
+- {
+- grub_printf("cannot allocate efi mmap pages");
+- errnum = ERR_WONT_FIT;
+- goto fail;
+- }
+-
+- grub_free (mmap);
+ return 1;
+
+ fail:
+- grub_free (mmap);
+ free_pages ();
+ return 0;
+ }
+@@ -245,7 +180,6 @@ big_linux_boot (void)
+ {
+ struct linux_kernel_params *params;
+ struct grub_linux_kernel_header *lh;
+- grub_efi_uintn_t mmap_size;
+ grub_efi_uintn_t map_key;
+ grub_efi_uintn_t desc_size;
+ grub_efi_uint32_t desc_version;
+@@ -255,9 +189,7 @@ big_linux_boot (void)
+
+ graphics_set_kernel_params (params);
+
+- mmap_size = find_mmap_size ();
+- if (grub_efi_get_memory_map (&mmap_size, mmap_buf, &map_key,
+- &desc_size, &desc_version) <= 0)
++ if (grub_efi_get_memory_map (&map_key, &desc_size, &desc_version) <= 0)
+ grub_fatal ("cannot get memory map");
+
+ /* Pass e820 memmap. */
+@@ -544,7 +476,6 @@ grub_load_initrd (char *initrd)
+ grub_ssize_t size;
+ grub_addr_t addr_min, addr_max;
+ grub_addr_t addr;
+- grub_efi_uintn_t mmap_size;
+ grub_efi_memory_descriptor_t *desc;
+ grub_efi_memory_descriptor_t tdesc;
+ grub_efi_uintn_t desc_size;
+@@ -582,9 +513,8 @@ grub_load_initrd (char *initrd)
+ addr_min = 0;
+
+ /* Find the highest address to put the initrd. */
+- mmap_size = find_mmap_size ();
+ grub_dprintf(__func__, "addr_min: 0x%lx addr_max: 0x%lx mmap_size: %lu\n", addr_min, addr_max, mmap_size);
+- if (grub_efi_get_memory_map (&mmap_size, mmap_buf, 0, &desc_size, 0) <= 0)
++ if (grub_efi_get_memory_map (0, &desc_size, 0) <= 0)
+ grub_fatal ("cannot get memory map");
+
+ addr = 0;
+--
+1.7.1.1
+
diff --git a/grub-0.97-invert-highlighted-menu-line-rhbz613153.patch b/grub-0.97-invert-highlighted-menu-line-rhbz613153.patch
new file mode 100644
index 0000000..79a2191
--- /dev/null
+++ b/grub-0.97-invert-highlighted-menu-line-rhbz613153.patch
@@ -0,0 +1,116 @@
+From ec3a024cccdc6002fd47874b631cfdc814f52e39 Mon Sep 17 00:00:00 2001
+From: Peter Jones <pjones at redhat.com>
+Date: Mon, 12 Jul 2010 13:52:03 -0400
+Subject: [PATCH] Actually invert the highlighted line in the menu (rhbz#613153)
+
+If you don't invert the bits, the bits aren't inverted. This patch
+inverts the bits when "invert" is true.
+
+"set" in graphics_cursor() tells us whether the cursor is on that char.
+---
+ efi/efigraph.c | 25 +++++++++++++------------
+ efi/efiuga.c | 23 ++++++++++++-----------
+ stage2/graphics.c | 8 ++++----
+ 3 files changed, 29 insertions(+), 27 deletions(-)
+
+diff --git a/efi/efigraph.c b/efi/efigraph.c
+index e1ba267..36fcda1 100644
+--- a/efi/efigraph.c
++++ b/efi/efigraph.c
+@@ -676,7 +676,7 @@ cursor(struct graphics_backend *backend, int set)
+ offset = fpos.y * screensz.x + fpos.x;
+
+ if (set)
+- text[offset] |= 0x200;
++ text[offset] |= 0x0200;
+
+ graphics_clbl(fpos.x, fpos.y, 1, 1, 1);
+
+@@ -954,18 +954,19 @@ bltbuf_draw_character(struct graphics_backend *backend,
+ int bit = glyph[glyphpos.y] & (1 << ((fontsz.x-1) - glyphpos.x));
+ int idx = -1;
+
+- if (set)
+- idx = bit ? 0 : 15;
+- else
++ if (!set) {
+ if (invert)
+- idx = bit ? 15 : 0;
+- else if (bit)
+- idx = 15;
+-
+- if (idx == -1) {
+- if (is_shadow_pixel(screensz, charpos, glyphpos, fontsz) ||
+- !eg->background)
+- idx = invert ? 15 : 0;
++ idx = bit ? 0 : 15;
++ else if (bit)
++ idx = 15;
++
++ if (idx == -1) {
++ if (is_shadow_pixel(screensz, charpos, glyphpos, fontsz) ||
++ !eg->background)
++ idx = invert ? 15 : 0;
++ }
++ } else {
++ idx = bit ? 0 : 15;
+ }
+
+ if (idx != -1)
+diff --git a/efi/efiuga.c b/efi/efiuga.c
+index 063d3b2..b762eb8 100644
+--- a/efi/efiuga.c
++++ b/efi/efiuga.c
+@@ -671,18 +671,19 @@ bltbuf_draw_character(struct graphics_backend *backend,
+ int bit = glyph[glyphpos.y] & (1 << ((fontsz.x-1) - glyphpos.x));
+ int idx = -1;
+
+- if (set)
+- idx = bit ? 0 : 15;
+- else
++ if (!set) {
+ if (invert)
+- idx = bit ? 15 : 0;
+- else if (bit)
+- idx = 15;
+-
+- if (idx == -1) {
+- if (is_shadow_pixel(screensz, charpos, glyphpos, fontsz) ||
+- !uga->background)
+- idx = invert ? 15 : 0;
++ idx = bit ? 0 : 15;
++ else if (bit)
++ idx = 15;
++
++ if (idx == -1) {
++ if (is_shadow_pixel(screensz, charpos, glyphpos, fontsz) ||
++ !uga->background)
++ idx = invert ? 15 : 0;
++ }
++ } else {
++ idx = bit ? 0 : 15;
+ }
+
+ if (idx != -1)
+diff --git a/stage2/graphics.c b/stage2/graphics.c
+index 7f943f7..81109ae 100644
+--- a/stage2/graphics.c
++++ b/stage2/graphics.c
+@@ -540,10 +540,10 @@ void graphics_cursor(int set) {
+ offset += 80;
+ }
+ else {
+- chr[i ] = mask;
+- chr[16 + i] = mask;
+- chr[32 + i] = mask;
+- chr[48 + i] = mask;
++ chr[i ] = ~mask;
++ chr[16 + i] = ~mask;
++ chr[32 + i] = ~mask;
++ chr[48 + i] = ~mask;
+ }
+ }
+ }
+--
+1.7.1.1
+
More information about the scm-commits
mailing list