static grub_size_t elf_sec_num, elf_sec_entsize;
static unsigned elf_sec_shstrndx;
static void *elf_sections;
+static int keep_bs = 0;
void
grub_multiboot_add_elfsyms (grub_size_t num, grub_size_t entsize,
COMPILE_TIME_ASSERT (MULTIBOOT_TAG_ALIGN % 4 == 0);
+ keep_bs = 0;
+
for (tag = (struct multiboot_header_tag *) (header + 1);
tag->type != MULTIBOOT_TAG_TYPE_END;
tag = (struct multiboot_header_tag *) ((grub_uint32_t *) tag + ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN) / 4))
case MULTIBOOT_TAG_TYPE_ACPI_NEW:
case MULTIBOOT_TAG_TYPE_NETWORK:
case MULTIBOOT_TAG_TYPE_EFI_MMAP:
+ case MULTIBOOT_TAG_TYPE_EFI_BS:
break;
default:
case MULTIBOOT_HEADER_TAG_MODULE_ALIGN:
break;
+ case MULTIBOOT_HEADER_TAG_EFI_BS:
+ keep_bs = 1;
+ break;
+
default:
if (! (tag->flags & MULTIBOOT_HEADER_TAG_OPTIONAL))
{
find_efi_mmap_size ();
#endif
return 2 * sizeof (grub_uint32_t) + sizeof (struct multiboot_tag)
+ + sizeof (struct multiboot_tag)
+ (sizeof (struct multiboot_tag_string)
+ ALIGN_UP (cmdline_size, MULTIBOOT_TAG_ALIGN))
+ (sizeof (struct multiboot_tag_string)
err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch,
0, 0xffffffff - bufsize,
bufsize, MULTIBOOT_TAG_ALIGN,
- GRUB_RELOCATOR_PREFERENCE_NONE, 0);
+ GRUB_RELOCATOR_PREFERENCE_NONE, 1);
if (err)
return err;
tag->type = MULTIBOOT_TAG_TYPE_EFI_MMAP;
tag->size = sizeof (*tag) + efi_mmap_size;
- err = grub_efi_finish_boot_services (&efi_mmap_size, tag->efi_mmap, NULL,
- &efi_desc_size, &efi_desc_version);
+ if (!keep_bs)
+ err = grub_efi_finish_boot_services (&efi_mmap_size, tag->efi_mmap, NULL,
+ &efi_desc_size, &efi_desc_version);
+ else
+ {
+ if (grub_efi_get_memory_map (&efi_mmap_size, (void *) tag->efi_mmap,
+ NULL,
+ &efi_desc_size, &efi_desc_version) <= 0)
+ err = grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
+ }
if (err)
return err;
tag->descr_size = efi_desc_size;
ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN)
/ sizeof (grub_properly_aligned_t);
}
+
+ if (keep_bs)
+ {
+ struct multiboot_tag *tag = (struct multiboot_tag *) ptrorig;
+ tag->type = MULTIBOOT_TAG_TYPE_EFI_BS;
+ tag->size = sizeof (struct multiboot_tag);
+ ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN)
+ / sizeof (grub_properly_aligned_t);
+ }
#endif
{
#define MULTIBOOT_TAG_TYPE_ACPI_NEW 15
#define MULTIBOOT_TAG_TYPE_NETWORK 16
#define MULTIBOOT_TAG_TYPE_EFI_MMAP 17
+#define MULTIBOOT_TAG_TYPE_EFI_BS 18
#define MULTIBOOT_HEADER_TAG_END 0
#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1
#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4
#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5
#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6
+#define MULTIBOOT_HEADER_TAG_EFI_BS 7
#define MULTIBOOT_ARCHITECTURE_I386 0
#define MULTIBOOT_ARCHITECTURE_MIPS32 4