Merge branch 'gnu' into sync
This commit is contained in:
commit
f89e1cf69a
63 changed files with 884 additions and 310 deletions
|
@ -384,6 +384,7 @@ load_chewed (grub_file_t file, const char *filename)
|
|||
segment.len = 0;
|
||||
segment.offset = 0;
|
||||
segment.len = 0;
|
||||
/* Fallthrough. */
|
||||
case PAYLOAD_SEGMENT_CODE:
|
||||
case PAYLOAD_SEGMENT_DATA:
|
||||
{
|
||||
|
|
|
@ -999,10 +999,13 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
|||
{
|
||||
case 'g':
|
||||
shift += 10;
|
||||
/* FALLTHROUGH */
|
||||
case 'm':
|
||||
shift += 10;
|
||||
/* FALLTHROUGH */
|
||||
case 'k':
|
||||
shift += 10;
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -419,8 +419,6 @@ grub_xen_pt_alloc (void)
|
|||
try_virt_end = ALIGN_UP (xen_state.xen_inf.virt_base +
|
||||
page2offset (nr_need_pages) +
|
||||
ADDITIONAL_SIZE + STACK_SIZE, ALIGN_SIZE);
|
||||
if (!xen_state.xen_inf.virt_base)
|
||||
try_virt_end += PAGE_SIZE;
|
||||
|
||||
err = get_pgtable_size (xen_state.xen_inf.virt_base, try_virt_end,
|
||||
nr_info_pages);
|
||||
|
@ -433,7 +431,7 @@ grub_xen_pt_alloc (void)
|
|||
if (xen_state.xen_inf.virt_base)
|
||||
err = get_pgtable_size (0, PAGE_SIZE, nr_need_pages);
|
||||
else
|
||||
err = get_pgtable_size (try_virt_end - PAGE_SIZE, try_virt_end,
|
||||
err = get_pgtable_size (try_virt_end, try_virt_end + PAGE_SIZE,
|
||||
nr_need_pages);
|
||||
if (err)
|
||||
return err;
|
||||
|
|
|
@ -19,9 +19,10 @@
|
|||
#include <grub/xen_file.h>
|
||||
#include <grub/i386/linux.h>
|
||||
#include <grub/misc.h>
|
||||
|
||||
#include <grub/verity-hash.h>
|
||||
|
||||
#define XZ_MAGIC "\3757zXZ\0"
|
||||
|
||||
grub_elf_t
|
||||
grub_xen_file (grub_file_t file)
|
||||
{
|
||||
|
@ -36,6 +37,8 @@ grub_xen_file_and_cmdline (grub_file_t file,
|
|||
grub_elf_t elf;
|
||||
struct linux_kernel_header lh;
|
||||
grub_file_t off_file;
|
||||
grub_uint32_t payload_offset, payload_length;
|
||||
grub_uint8_t magic[6];
|
||||
|
||||
elf = grub_elf_file (file, file->name);
|
||||
if (elf)
|
||||
|
@ -56,23 +59,39 @@ grub_xen_file_and_cmdline (grub_file_t file,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (lh.payload_length < 4)
|
||||
payload_length = lh.payload_length;
|
||||
payload_offset = (lh.setup_sects + 1) * 512
|
||||
+ lh.payload_offset;
|
||||
|
||||
if (payload_length < sizeof (magic))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_OS, "payload too short");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
grub_dprintf ("xen", "found bzimage payload 0x%llx-0x%llx\n",
|
||||
(unsigned long long) (lh.setup_sects + 1) * 512
|
||||
+ lh.payload_offset,
|
||||
(unsigned long long) payload_offset,
|
||||
(unsigned long long) lh.payload_length);
|
||||
|
||||
if (cmdline)
|
||||
grub_pass_verity_hash (&lh, cmdline, cmdline_max_len);
|
||||
|
||||
off_file = grub_file_offset_open (file, (lh.setup_sects + 1) * 512
|
||||
+ lh.payload_offset,
|
||||
lh.payload_length);
|
||||
grub_file_seek (file, payload_offset);
|
||||
|
||||
if (grub_file_read (file, &magic, sizeof (magic)) != sizeof (magic))
|
||||
{
|
||||
if (!grub_errno)
|
||||
grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||
file->name);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Kernel suffixes xz payload with their uncompressed size.
|
||||
Trim it. */
|
||||
if (grub_memcmp (magic, XZ_MAGIC, sizeof (XZ_MAGIC) - 1) == 0)
|
||||
payload_length -= 4;
|
||||
off_file = grub_file_offset_open (file, payload_offset,
|
||||
payload_length);
|
||||
if (!off_file)
|
||||
goto fail;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue