boot services avoid code based on the patch by Matthew Garrett
This commit is contained in:
parent
86e5ab4b81
commit
9be4c45dbe
18 changed files with 136 additions and 37 deletions
|
@ -723,7 +723,8 @@ grub_freebsd_boot (void)
|
|||
0x10000, 0x90000,
|
||||
3 * sizeof (grub_uint32_t)
|
||||
+ sizeof (bi), 4,
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE);
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE,
|
||||
0);
|
||||
if (err)
|
||||
return err;
|
||||
stack = get_virtual_current_address (ch);
|
||||
|
@ -760,7 +761,8 @@ grub_freebsd_boot (void)
|
|||
0x10000, 0x90000,
|
||||
9 * sizeof (grub_uint32_t)
|
||||
+ sizeof (bi), 4,
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE);
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE,
|
||||
0);
|
||||
if (err)
|
||||
return err;
|
||||
stack = get_virtual_current_address (ch);
|
||||
|
@ -786,7 +788,7 @@ grub_freebsd_boot (void)
|
|||
stack[6] = stack_target + 9 * sizeof (grub_uint32_t);
|
||||
stack[7] = bi.tags;
|
||||
stack[8] = kern_end;
|
||||
return grub_relocator32_boot (relocator, state);
|
||||
return grub_relocator32_boot (relocator, state, 0);
|
||||
}
|
||||
|
||||
/* Not reached. */
|
||||
|
@ -873,7 +875,7 @@ grub_openbsd_boot (void)
|
|||
stack[7] = (grub_uint8_t *) curarg - (grub_uint8_t *) arg0;
|
||||
stack[8] = ((grub_uint8_t *) arg0 - (grub_uint8_t *) buf0) + buf_target;
|
||||
|
||||
return grub_relocator32_boot (relocator, state);
|
||||
return grub_relocator32_boot (relocator, state, 0);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
|
@ -1144,7 +1146,8 @@ grub_netbsd_boot (void)
|
|||
grub_relocator_chunk_t ch;
|
||||
err = grub_relocator_alloc_chunk_align (relocator, &ch, 0x10000, 0x90000,
|
||||
7 * sizeof (grub_uint32_t), 4,
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE);
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE,
|
||||
0);
|
||||
if (err)
|
||||
return err;
|
||||
stack = get_virtual_current_address (ch);
|
||||
|
@ -1168,7 +1171,7 @@ grub_netbsd_boot (void)
|
|||
stack[5] = grub_mmap_get_upper () >> 10;
|
||||
stack[6] = grub_mmap_get_lower () >> 10;
|
||||
|
||||
return grub_relocator32_boot (relocator, state);
|
||||
return grub_relocator32_boot (relocator, state, 0);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
|
|
|
@ -43,7 +43,7 @@ grub_chain_boot (void)
|
|||
grub_video_set_mode ("text", 0, 0);
|
||||
|
||||
state.eip = entry;
|
||||
return grub_relocator32_boot (relocator, state);
|
||||
return grub_relocator32_boot (relocator, state, 0);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
|
|
|
@ -189,7 +189,9 @@ free_pages (void)
|
|||
/* Allocate pages for the real mode code and the protected mode code
|
||||
for linux as well as a memory map buffer. */
|
||||
static grub_err_t
|
||||
allocate_pages (grub_size_t prot_size)
|
||||
allocate_pages (grub_size_t prot_size, grub_size_t *align,
|
||||
grub_size_t min_align, int relocatable,
|
||||
grub_uint64_t prefered_address)
|
||||
{
|
||||
grub_size_t real_size, mmap_size;
|
||||
grub_err_t err;
|
||||
|
@ -254,7 +256,11 @@ allocate_pages (grub_size_t prot_size)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#ifdef GRUB_MACHINE_EFI
|
||||
grub_efi_mmap_iterate (hook, 1);
|
||||
#else
|
||||
grub_mmap_iterate (hook);
|
||||
#endif
|
||||
if (! real_mode_target)
|
||||
{
|
||||
err = grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate real mode pages");
|
||||
|
@ -273,15 +279,36 @@ allocate_pages (grub_size_t prot_size)
|
|||
}
|
||||
efi_mmap_buf = (grub_uint8_t *) real_mode_mem + real_size + mmap_size;
|
||||
|
||||
prot_mode_target = GRUB_LINUX_BZIMAGE_ADDR;
|
||||
|
||||
{
|
||||
grub_relocator_chunk_t ch;
|
||||
err = grub_relocator_alloc_chunk_addr (relocator, &ch,
|
||||
prot_mode_target, prot_size);
|
||||
if (relocatable)
|
||||
{
|
||||
err = grub_relocator_alloc_chunk_align (relocator, &ch,
|
||||
prefered_address,
|
||||
prefered_address,
|
||||
prot_size, 1,
|
||||
GRUB_RELOCATOR_PREFERENCE_LOW,
|
||||
1);
|
||||
for (; err && *align >= min_align; (*align)--)
|
||||
{
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
err = grub_relocator_alloc_chunk_align (relocator, &ch,
|
||||
0x1000000, 0xffffffff,
|
||||
prot_size, 1 << *align,
|
||||
GRUB_RELOCATOR_PREFERENCE_LOW,
|
||||
1);
|
||||
}
|
||||
if (err)
|
||||
goto fail;
|
||||
}
|
||||
else
|
||||
err = grub_relocator_alloc_chunk_addr (relocator, &ch,
|
||||
prefered_address,
|
||||
prot_size);
|
||||
if (err)
|
||||
goto fail;
|
||||
prot_mode_mem = get_virtual_current_address (ch);
|
||||
prot_mode_target = get_physical_target_address (ch);
|
||||
}
|
||||
|
||||
grub_dprintf ("linux", "real_mode_mem = %lx, real_mode_pages = %x, "
|
||||
|
@ -612,7 +639,7 @@ grub_linux_boot (void)
|
|||
state.esi = real_mode_target;
|
||||
state.esp = real_mode_target;
|
||||
state.eip = params->code32_start;
|
||||
return grub_relocator32_boot (relocator, state);
|
||||
return grub_relocator32_boot (relocator, state, 0);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
|
@ -634,6 +661,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
|||
grub_size_t real_size, prot_size;
|
||||
grub_ssize_t len;
|
||||
int i;
|
||||
grub_size_t align, min_align;
|
||||
int relocatable;
|
||||
grub_uint64_t preffered_address = GRUB_LINUX_BZIMAGE_ADDR;
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
@ -707,7 +737,37 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
|||
real_size = setup_sects << GRUB_DISK_SECTOR_BITS;
|
||||
prot_size = grub_file_size (file) - real_size - GRUB_DISK_SECTOR_SIZE;
|
||||
|
||||
if (allocate_pages (prot_size))
|
||||
if (grub_le_to_cpu16 (lh.version) >= 0x205
|
||||
&& lh.kernel_alignment != 0
|
||||
&& ((lh.kernel_alignment - 1) & lh.kernel_alignment) == 0)
|
||||
{
|
||||
for (align = 0; align < 32; align++)
|
||||
if (grub_le_to_cpu32 (lh.kernel_alignment) & (1 << align))
|
||||
break;
|
||||
relocatable = grub_le_to_cpu32 (lh.relocatable);
|
||||
}
|
||||
else
|
||||
{
|
||||
align = 0;
|
||||
relocatable = 0;
|
||||
}
|
||||
|
||||
if (grub_le_to_cpu16 (lh.version) >= 0x020a)
|
||||
{
|
||||
min_align = lh.min_alignment;
|
||||
prot_size = grub_le_to_cpu32 (lh.init_size);
|
||||
preffered_address = grub_le_to_cpu64 (lh.pref_address);
|
||||
}
|
||||
else
|
||||
{
|
||||
min_align = 0;
|
||||
prot_size = grub_file_size (file) - real_size - GRUB_DISK_SECTOR_SIZE;
|
||||
preffered_address = grub_le_to_cpu32 (lh.code32_start);
|
||||
}
|
||||
|
||||
if (allocate_pages (prot_size, &align,
|
||||
min_align, relocatable,
|
||||
preffered_address))
|
||||
goto fail;
|
||||
|
||||
params = (struct linux_kernel_params *) real_mode_mem;
|
||||
|
@ -1021,7 +1081,8 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
|||
grub_relocator_chunk_t ch;
|
||||
err = grub_relocator_alloc_chunk_align (relocator, &ch,
|
||||
addr_min, addr, size, 0x1000,
|
||||
GRUB_RELOCATOR_PREFERENCE_HIGH);
|
||||
GRUB_RELOCATOR_PREFERENCE_HIGH,
|
||||
1);
|
||||
if (err)
|
||||
return err;
|
||||
initrd_mem = get_virtual_current_address (ch);
|
||||
|
|
|
@ -454,7 +454,7 @@ grub_multiboot_make_mbi (grub_uint32_t *target)
|
|||
err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch,
|
||||
0x10000, 0x100000 - bufsize,
|
||||
bufsize, 4,
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE);
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE, 0);
|
||||
if (err)
|
||||
return err;
|
||||
ptrorig = get_virtual_current_address (ch);
|
||||
|
|
|
@ -429,7 +429,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
|||
err = grub_relocator_alloc_chunk_align (relocator, &ch,
|
||||
addr_min, addr_max - size,
|
||||
size, 0x1000,
|
||||
GRUB_RELOCATOR_PREFERENCE_HIGH);
|
||||
GRUB_RELOCATOR_PREFERENCE_HIGH, 0);
|
||||
if (err)
|
||||
return err;
|
||||
initrd_chunk = get_virtual_current_address (ch);
|
||||
|
|
|
@ -90,7 +90,7 @@ grub_plan9_boot (void)
|
|||
};
|
||||
grub_video_set_mode ("text", 0, 0);
|
||||
|
||||
return grub_relocator32_boot (rel, state);
|
||||
return grub_relocator32_boot (rel, state, 0);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
|
|
|
@ -842,7 +842,7 @@ grub_xnu_boot_resume (void)
|
|||
state.eip = grub_xnu_entry_point;
|
||||
state.eax = grub_xnu_arg1;
|
||||
|
||||
return grub_relocator32_boot (grub_xnu_relocator, state);
|
||||
return grub_relocator32_boot (grub_xnu_relocator, state, 0);
|
||||
}
|
||||
|
||||
/* Setup video for xnu. */
|
||||
|
@ -1150,7 +1150,7 @@ grub_xnu_boot (void)
|
|||
grub_outb (0xff, 0x21);
|
||||
grub_outb (0xff, 0xa1);
|
||||
|
||||
return grub_relocator32_boot (grub_xnu_relocator, state);
|
||||
return grub_relocator32_boot (grub_xnu_relocator, state, 0);
|
||||
}
|
||||
|
||||
static grub_command_t cmd_devprop_load;
|
||||
|
|
|
@ -134,7 +134,7 @@ grub_multiboot_boot (void)
|
|||
return err;
|
||||
#endif
|
||||
|
||||
grub_relocator32_boot (grub_multiboot_relocator, state);
|
||||
grub_relocator32_boot (grub_multiboot_relocator, state, 0);
|
||||
|
||||
/* Not reached. */
|
||||
return GRUB_ERR_NONE;
|
||||
|
@ -307,7 +307,7 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
|
|||
err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch,
|
||||
0, (0xffffffff - size) + 1,
|
||||
size, MULTIBOOT_MOD_ALIGN,
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE);
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE, 0);
|
||||
if (err)
|
||||
{
|
||||
grub_file_close (file);
|
||||
|
|
|
@ -200,7 +200,8 @@ CONCAT(grub_multiboot_load_elf, XX) (grub_file_t file, const char *filename, voi
|
|||
(0xffffffff - sh->sh_size)
|
||||
+ 1, sh->sh_size,
|
||||
sh->sh_addralign,
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE);
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE,
|
||||
0);
|
||||
if (err)
|
||||
{
|
||||
grub_dprintf ("multiboot_loader", "Error loading shdr %d\n", i);
|
||||
|
|
|
@ -588,7 +588,7 @@ grub_multiboot_make_mbi (grub_uint32_t *target)
|
|||
err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch,
|
||||
0, 0xffffffff - bufsize,
|
||||
bufsize, MULTIBOOT_TAG_ALIGN,
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE);
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE, 0);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
|
|
@ -125,7 +125,7 @@ grub_xnu_resume (char *imagename)
|
|||
(0xffffffff - hibhead.image_size) + 1,
|
||||
hibhead.image_size,
|
||||
GRUB_XNU_PAGESIZE,
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE);
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE, 0);
|
||||
if (err)
|
||||
{
|
||||
grub_file_close (file);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue