Merge upstream changes as of April 29th
This commit is contained in:
commit
c7c750ecc2
267 changed files with 6019 additions and 1963 deletions
|
@ -234,7 +234,8 @@ grub_bsd_add_meta_ptr (grub_uint32_t type, void **ptr, grub_uint32_t len)
|
|||
{
|
||||
struct bsd_tag *p;
|
||||
for (p = tags;
|
||||
p->type != (FREEBSD_MODINFO_METADATA | FREEBSD_MODINFOMD_KERNEND);
|
||||
p && p->type != (FREEBSD_MODINFO_METADATA
|
||||
| FREEBSD_MODINFOMD_KERNEND);
|
||||
p = p->next);
|
||||
|
||||
if (p)
|
||||
|
|
|
@ -121,6 +121,24 @@ load_kernel (grub_file_t file, const char *filename,
|
|||
return grub_multiboot_load_elf (file, filename, buffer);
|
||||
}
|
||||
|
||||
static struct multiboot_header *
|
||||
find_header (char *buffer, grub_ssize_t len)
|
||||
{
|
||||
struct multiboot_header *header;
|
||||
|
||||
/* Look for the multiboot header in the buffer. The header should
|
||||
be at least 12 bytes and aligned on a 4-byte boundary. */
|
||||
for (header = (struct multiboot_header *) buffer;
|
||||
((char *) header <= buffer + len - 12);
|
||||
header = (struct multiboot_header *) ((char *) header + MULTIBOOT_HEADER_ALIGN))
|
||||
{
|
||||
if (header->magic == MULTIBOOT_HEADER_MAGIC
|
||||
&& !(header->magic + header->flags + header->checksum))
|
||||
return header;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_multiboot_load (grub_file_t file, const char *filename)
|
||||
{
|
||||
|
@ -143,16 +161,7 @@ grub_multiboot_load (grub_file_t file, const char *filename)
|
|||
return grub_errno;
|
||||
}
|
||||
|
||||
/* Look for the multiboot header in the buffer. The header should
|
||||
be at least 12 bytes and aligned on a 4-byte boundary. */
|
||||
for (header = (struct multiboot_header *) buffer;
|
||||
((char *) header <= buffer + len - 12) || (header = 0);
|
||||
header = (struct multiboot_header *) ((char *) header + MULTIBOOT_HEADER_ALIGN))
|
||||
{
|
||||
if (header->magic == MULTIBOOT_HEADER_MAGIC
|
||||
&& !(header->magic + header->flags + header->checksum))
|
||||
break;
|
||||
}
|
||||
header = find_header (buffer, len);
|
||||
|
||||
if (header == 0)
|
||||
{
|
||||
|
|
|
@ -280,10 +280,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;
|
||||
}
|
||||
|
|
|
@ -342,6 +342,7 @@ fill_disk (const char *name, void *data)
|
|||
if (!plan9name)
|
||||
{
|
||||
grub_print_error ();
|
||||
grub_device_close (dev);
|
||||
return 0;
|
||||
}
|
||||
if (grub_extend_alloc (fill_ctx->pmapptr + grub_strlen (plan9name)
|
||||
|
@ -349,6 +350,7 @@ fill_disk (const char *name, void *data)
|
|||
&fill_ctx->pmap))
|
||||
{
|
||||
grub_free (plan9name);
|
||||
grub_device_close (dev);
|
||||
return 1;
|
||||
}
|
||||
grub_strcpy (fill_ctx->pmap + fill_ctx->pmapptr, plan9name);
|
||||
|
@ -366,12 +368,19 @@ fill_disk (const char *name, void *data)
|
|||
fill_ctx->noslash = 1;
|
||||
grub_memset (fill_ctx->prefixescnt, 0, sizeof (fill_ctx->prefixescnt));
|
||||
if (grub_partition_iterate (dev->disk, fill_partition, fill_ctx))
|
||||
return 1;
|
||||
{
|
||||
grub_device_close (dev);
|
||||
return 1;
|
||||
}
|
||||
if (grub_extend_alloc (fill_ctx->pmapptr + 1, &fill_ctx->pmapalloc,
|
||||
&fill_ctx->pmap))
|
||||
return 1;
|
||||
{
|
||||
grub_device_close (dev);
|
||||
return 1;
|
||||
}
|
||||
fill_ctx->pmap[fill_ctx->pmapptr++] = '\n';
|
||||
|
||||
grub_device_close (dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -521,7 +521,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
|||
{
|
||||
grub_size_t size = 0;
|
||||
grub_err_t err;
|
||||
struct grub_linux_initrd_context initrd_ctx;
|
||||
struct grub_linux_initrd_context initrd_ctx = { 0, 0, 0 };
|
||||
grub_relocator_chunk_t ch;
|
||||
|
||||
if (argc == 0)
|
||||
|
|
|
@ -311,14 +311,19 @@ grub_xen_get_infoXX (grub_elf_t elf, struct grub_xen_file_info *xi)
|
|||
return grub_errno;
|
||||
|
||||
if (grub_file_seek (elf->file, elf->ehdr.ehdrXX.e_shoff) == (grub_off_t) -1)
|
||||
return grub_errno;
|
||||
{
|
||||
err = grub_errno;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (grub_file_read (elf->file, s0, shsize) != (grub_ssize_t) shsize)
|
||||
{
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
return grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||
err = grub_errno;
|
||||
else
|
||||
err = grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||
elf->file->name);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
s = (Elf_Shdr *) ((char *) s0 + elf->ehdr.ehdrXX.e_shstrndx * shentsize);
|
||||
|
@ -330,18 +335,29 @@ grub_xen_get_infoXX (grub_elf_t elf, struct grub_xen_file_info *xi)
|
|||
char name[sizeof("__xen_guest")];
|
||||
grub_memset (name, 0, sizeof (name));
|
||||
if (grub_file_seek (elf->file, stroff + s->sh_name) == (grub_off_t) -1)
|
||||
return grub_errno;
|
||||
{
|
||||
err = grub_errno;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (grub_file_read (elf->file, name, sizeof (name)) != (grub_ssize_t) sizeof (name))
|
||||
{
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
{
|
||||
err = grub_errno;
|
||||
goto cleanup;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (grub_memcmp (name, "__xen_guest",
|
||||
sizeof("__xen_guest")) != 0)
|
||||
continue;
|
||||
return parse_xen_guest (elf, xi, s->sh_offset, s->sh_size);
|
||||
err = parse_xen_guest (elf, xi, s->sh_offset, s->sh_size);
|
||||
goto cleanup;
|
||||
}
|
||||
return grub_error (GRUB_ERR_BAD_OS, "no XEN note found");
|
||||
err = grub_error (GRUB_ERR_BAD_OS, "no XEN note found");
|
||||
|
||||
cleanup:
|
||||
grub_free (s0);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -126,7 +126,7 @@ guessfsb (void)
|
|||
{
|
||||
const grub_uint64_t sane_value = 100000000;
|
||||
grub_uint32_t manufacturer[3], max_cpuid, capabilities, msrlow;
|
||||
grub_uint32_t a, b, d;
|
||||
grub_uint32_t a, b, d, divisor;
|
||||
|
||||
if (! grub_cpu_is_cpuid_supported ())
|
||||
return sane_value;
|
||||
|
@ -166,8 +166,10 @@ guessfsb (void)
|
|||
r = (2000ULL << 32) - v * grub_tsc_rate;
|
||||
v += r / grub_tsc_rate;
|
||||
|
||||
return grub_divmod64 (v, ((msrlow >> 7) & 0x3e) | ((msrlow >> 14) & 1),
|
||||
0);
|
||||
divisor = ((msrlow >> 7) & 0x3e) | ((msrlow >> 14) & 1);
|
||||
if (divisor == 0)
|
||||
return sane_value;
|
||||
return grub_divmod64 (v, divisor, 0);
|
||||
}
|
||||
|
||||
struct property_descriptor
|
||||
|
@ -741,10 +743,10 @@ grub_cpu_xnu_fill_devicetree (grub_uint64_t *fsbfreq_out)
|
|||
*((grub_uint64_t *) curval->data) = (grub_addr_t) ptr;
|
||||
|
||||
/* Create alias. */
|
||||
for (j = 0; j < sizeof (table_aliases) / sizeof (table_aliases[0]); j++)
|
||||
for (j = 0; j < ARRAY_SIZE(table_aliases); j++)
|
||||
if (grub_memcmp (&table_aliases[j].guid, &guid, sizeof (guid)) == 0)
|
||||
break;
|
||||
if (j != sizeof (table_aliases) / sizeof (table_aliases[0]))
|
||||
if (j != ARRAY_SIZE(table_aliases))
|
||||
{
|
||||
curval = grub_xnu_create_value (&(curkey->first_child), "alias");
|
||||
if (!curval)
|
||||
|
|
|
@ -79,6 +79,25 @@ grub_multiboot_add_elfsyms (grub_size_t num, grub_size_t entsize,
|
|||
elf_sections = data;
|
||||
}
|
||||
|
||||
static struct multiboot_header *
|
||||
find_header (grub_properly_aligned_t *buffer, grub_ssize_t len)
|
||||
{
|
||||
struct multiboot_header *header;
|
||||
/* Look for the multiboot header in the buffer. The header should
|
||||
be at least 12 bytes and aligned on a 4-byte boundary. */
|
||||
for (header = (struct multiboot_header *) buffer;
|
||||
((char *) header <= (char *) buffer + len - 12);
|
||||
header = (struct multiboot_header *) ((grub_uint32_t *) header + MULTIBOOT_HEADER_ALIGN / 4))
|
||||
{
|
||||
if (header->magic == MULTIBOOT_HEADER_MAGIC
|
||||
&& !(header->magic + header->architecture
|
||||
+ header->header_length + header->checksum)
|
||||
&& header->architecture == MULTIBOOT_ARCHITECTURE_CURRENT)
|
||||
return header;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_multiboot_load (grub_file_t file, const char *filename)
|
||||
{
|
||||
|
@ -107,18 +126,7 @@ grub_multiboot_load (grub_file_t file, const char *filename)
|
|||
|
||||
COMPILE_TIME_ASSERT (MULTIBOOT_HEADER_ALIGN % 4 == 0);
|
||||
|
||||
/* Look for the multiboot header in the buffer. The header should
|
||||
be at least 12 bytes and aligned on a 4-byte boundary. */
|
||||
for (header = (struct multiboot_header *) buffer;
|
||||
((char *) header <= (char *) buffer + len - 12) || (header = 0);
|
||||
header = (struct multiboot_header *) ((grub_uint32_t *) header + MULTIBOOT_HEADER_ALIGN / 4))
|
||||
{
|
||||
if (header->magic == MULTIBOOT_HEADER_MAGIC
|
||||
&& !(header->magic + header->architecture
|
||||
+ header->header_length + header->checksum)
|
||||
&& header->architecture == MULTIBOOT_ARCHITECTURE_CURRENT)
|
||||
break;
|
||||
}
|
||||
header = find_header (buffer, len);
|
||||
|
||||
if (header == 0)
|
||||
{
|
||||
|
@ -142,7 +150,7 @@ grub_multiboot_load (grub_file_t file, const char *filename)
|
|||
= (struct multiboot_header_tag_information_request *) tag;
|
||||
if (request_tag->flags & MULTIBOOT_HEADER_TAG_OPTIONAL)
|
||||
break;
|
||||
for (i = 0; i < (request_tag->size - sizeof (request_tag))
|
||||
for (i = 0; i < (request_tag->size - sizeof (*request_tag))
|
||||
/ sizeof (request_tag->requests[0]); i++)
|
||||
switch (request_tag->requests[i])
|
||||
{
|
||||
|
|
|
@ -110,7 +110,7 @@ grub_linux_boot (void)
|
|||
int len = grub_strlen (linux_args) + 1;
|
||||
if (bp->len < len)
|
||||
len = bp->len;
|
||||
memcpy(bp->buf, linux_args, len);
|
||||
grub_memcpy(bp->buf, linux_args, len);
|
||||
bp->buf[len-1] = '\0';
|
||||
bp->valid = 1;
|
||||
}
|
||||
|
|
|
@ -689,10 +689,10 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile,
|
|||
/* Allocate the space. */
|
||||
err = grub_xnu_align_heap (GRUB_XNU_PAGESIZE);
|
||||
if (err)
|
||||
return err;
|
||||
goto fail;
|
||||
err = grub_xnu_heap_malloc (neededspace, &buf0, &buf_target);
|
||||
if (err)
|
||||
return err;
|
||||
goto fail;
|
||||
buf = buf0;
|
||||
|
||||
exthead = (struct grub_xnu_extheader *) buf;
|
||||
|
@ -709,10 +709,7 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile,
|
|||
else
|
||||
err = grub_macho_readfile32 (macho, filename, buf);
|
||||
if (err)
|
||||
{
|
||||
grub_macho_close (macho);
|
||||
return err;
|
||||
}
|
||||
goto fail;
|
||||
grub_macho_close (macho);
|
||||
buf += machosize;
|
||||
}
|
||||
|
@ -747,6 +744,10 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile,
|
|||
/* Announce to kernel */
|
||||
return grub_xnu_register_memory ("Driver-", &driversnum, buf_target,
|
||||
neededspace);
|
||||
fail:
|
||||
if (macho)
|
||||
grub_macho_close (macho);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Load mkext. */
|
||||
|
@ -1378,6 +1379,8 @@ grub_xnu_fill_devicetree (void)
|
|||
name[len] = 0;
|
||||
|
||||
curvalue = grub_xnu_create_value (curkey, name);
|
||||
if (!curvalue)
|
||||
return grub_errno;
|
||||
grub_free (name);
|
||||
|
||||
data = grub_malloc (grub_strlen (var->value) + 1);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue