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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue