mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-21 06:49:35 +00:00
merge mainline into ahci
This commit is contained in:
commit
0670a9751b
385 files changed
+14296
-2152
No files matched your search
@@ -34,6 +34,8 @@
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/ns8250.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
#include <grub/video.h>
|
||||
#ifdef GRUB_MACHINE_PCBIOS
|
||||
#include <grub/machine/biosnum.h>
|
||||
@@ -65,7 +67,7 @@ static void *kern_chunk_src;
|
||||
static grub_uint32_t bootflags;
|
||||
static int is_elf_kernel, is_64bit;
|
||||
static grub_uint32_t openbsd_root;
|
||||
struct grub_relocator *relocator = NULL;
|
||||
static struct grub_relocator *relocator = NULL;
|
||||
static struct grub_openbsd_ramdisk_descriptor openbsd_ramdisk;
|
||||
|
||||
struct bsd_tag
|
||||
@@ -252,7 +254,7 @@ struct grub_e820_mmap
|
||||
#define GRUB_E820_RESERVED 2
|
||||
#define GRUB_E820_ACPI 3
|
||||
#define GRUB_E820_NVS 4
|
||||
#define GRUB_E820_EXEC_CODE 5
|
||||
#define GRUB_E820_BADRAM 5
|
||||
|
||||
static void
|
||||
generate_e820_mmap (grub_size_t *len, grub_size_t *cnt, void *buf)
|
||||
|
||||
@@ -195,6 +195,11 @@ SUFFIX (grub_freebsd_load_elfmodule) (struct grub_relocator *relocator,
|
||||
chunk_size = s->sh_addr + s->sh_size;
|
||||
}
|
||||
|
||||
if (chunk_size < sizeof (e))
|
||||
chunk_size = sizeof (e);
|
||||
chunk_size += e.e_phnum * e.e_phentsize;
|
||||
chunk_size += e.e_shnum * e.e_shentsize;
|
||||
|
||||
{
|
||||
grub_relocator_chunk_t ch;
|
||||
|
||||
@@ -394,7 +399,7 @@ SUFFIX (grub_netbsd_load_elf_meta) (struct grub_relocator *relocator,
|
||||
grub_err_t err;
|
||||
Elf_Ehdr e;
|
||||
Elf_Shdr *s, *symsh, *strsh;
|
||||
char *shdr;
|
||||
char *shdr = NULL;
|
||||
unsigned symsize, strsize;
|
||||
void *sym_chunk;
|
||||
grub_uint8_t *curload;
|
||||
|
||||
@@ -33,6 +33,9 @@
|
||||
#include <grub/command.h>
|
||||
#include <grub/i386/relocator.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/lib/cmdline.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
#ifdef GRUB_MACHINE_PCBIOS
|
||||
#include <grub/i386/pc/vesa_modes_table.h>
|
||||
@@ -135,7 +138,8 @@ find_efi_mmap_size (void)
|
||||
later, and EFI itself may allocate more. */
|
||||
mmap_size += (1 << 12);
|
||||
|
||||
return page_align (mmap_size);
|
||||
mmap_size = page_align (mmap_size);
|
||||
return mmap_size;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -312,6 +316,13 @@ grub_linux_setup_video (struct linux_kernel_params *params)
|
||||
struct grub_video_mode_info mode_info;
|
||||
void *framebuffer;
|
||||
grub_err_t err;
|
||||
grub_video_driver_id_t driver_id;
|
||||
char *gfxlfbvar = grub_env_get ("gfxpayloadforcelfb");
|
||||
|
||||
driver_id = grub_video_get_driver_id ();
|
||||
|
||||
if (driver_id == GRUB_VIDEO_DRIVER_NONE)
|
||||
return 1;
|
||||
|
||||
err = grub_video_get_info_and_fini (&mode_info, &framebuffer);
|
||||
|
||||
@@ -338,12 +349,41 @@ grub_linux_setup_video (struct linux_kernel_params *params)
|
||||
params->reserved_mask_size = mode_info.reserved_mask_size;
|
||||
params->reserved_field_pos = mode_info.reserved_field_pos;
|
||||
|
||||
if (gfxlfbvar && (gfxlfbvar[0] == '1' || gfxlfbvar[0] == 'y'))
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
|
||||
else
|
||||
{
|
||||
switch (driver_id)
|
||||
{
|
||||
case GRUB_VIDEO_DRIVER_VBE:
|
||||
params->lfb_size >>= 16;
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
|
||||
break;
|
||||
|
||||
case GRUB_VIDEO_DRIVER_EFI_UGA:
|
||||
case GRUB_VIDEO_DRIVER_EFI_GOP:
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_EFIFB;
|
||||
break;
|
||||
|
||||
/* FIXME: check if better id is available. */
|
||||
case GRUB_VIDEO_DRIVER_SM712:
|
||||
case GRUB_VIDEO_DRIVER_SIS315PRO:
|
||||
case GRUB_VIDEO_DRIVER_VGA:
|
||||
case GRUB_VIDEO_DRIVER_CIRRUS:
|
||||
case GRUB_VIDEO_DRIVER_BOCHS:
|
||||
/* Make gcc happy. */
|
||||
case GRUB_VIDEO_DRIVER_SDL:
|
||||
case GRUB_VIDEO_DRIVER_NONE:
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef GRUB_MACHINE_PCBIOS
|
||||
/* VESA packed modes may come with zeroed mask sizes, which need
|
||||
to be set here according to DAC Palette width. If we don't,
|
||||
this results in Linux displaying a black screen. */
|
||||
if (mode_info.bpp <= 8)
|
||||
if (driver_id == GRUB_VIDEO_DRIVER_VBE && mode_info.bpp <= 8)
|
||||
{
|
||||
struct grub_vbe_info_block controller_info;
|
||||
int status;
|
||||
@@ -418,9 +458,9 @@ grub_linux_boot (void)
|
||||
addr, size, GRUB_E820_NVS);
|
||||
break;
|
||||
|
||||
case GRUB_MEMORY_CODE:
|
||||
case GRUB_MEMORY_BADRAM:
|
||||
grub_e820_add_region (params->e820_map, &e820_num,
|
||||
addr, size, GRUB_E820_EXEC_CODE);
|
||||
addr, size, GRUB_E820_BADRAM);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -456,15 +496,7 @@ grub_linux_boot (void)
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
if (! grub_linux_setup_video (params))
|
||||
{
|
||||
/* Use generic framebuffer unless VESA is known to be supported. */
|
||||
if (params->have_vga != GRUB_VIDEO_LINUX_TYPE_VESA)
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
|
||||
else
|
||||
params->lfb_size >>= 16;
|
||||
}
|
||||
else
|
||||
if (grub_linux_setup_video (params))
|
||||
{
|
||||
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU)
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
|
||||
@@ -518,6 +550,7 @@ grub_linux_boot (void)
|
||||
#ifdef GRUB_MACHINE_EFI
|
||||
{
|
||||
grub_efi_uintn_t efi_desc_size;
|
||||
grub_size_t efi_mmap_target;
|
||||
grub_efi_uint32_t efi_desc_version;
|
||||
err = grub_efi_finish_boot_services (&efi_mmap_size, efi_mmap_buf, NULL,
|
||||
&efi_desc_size, &efi_desc_version);
|
||||
@@ -525,23 +558,24 @@ grub_linux_boot (void)
|
||||
return err;
|
||||
|
||||
/* Note that no boot services are available from here. */
|
||||
|
||||
efi_mmap_target = real_mode_target
|
||||
+ ((grub_uint8_t *) efi_mmap_buf - (grub_uint8_t *) real_mode_mem);
|
||||
/* Pass EFI parameters. */
|
||||
if (grub_le_to_cpu16 (params->version) >= 0x0206)
|
||||
{
|
||||
params->v0206.efi_mem_desc_size = efi_desc_size;
|
||||
params->v0206.efi_mem_desc_version = efi_desc_version;
|
||||
params->v0206.efi_mmap = (grub_uint32_t) (unsigned long) efi_mmap_buf;
|
||||
params->v0206.efi_mmap = efi_mmap_target;
|
||||
params->v0206.efi_mmap_size = efi_mmap_size;
|
||||
#ifdef __x86_64__
|
||||
params->v0206.efi_mmap_hi = (grub_uint32_t) ((grub_uint64_t) efi_mmap_buf >> 32);
|
||||
params->v0206.efi_mmap_hi = (efi_mmap_target >> 32);
|
||||
#endif
|
||||
}
|
||||
else if (grub_le_to_cpu16 (params->version) >= 0x0204)
|
||||
{
|
||||
params->v0204.efi_mem_desc_size = efi_desc_size;
|
||||
params->v0204.efi_mem_desc_version = efi_desc_version;
|
||||
params->v0204.efi_mmap = (grub_uint32_t) (unsigned long) efi_mmap_buf;
|
||||
params->v0204.efi_mmap = efi_mmap_target;
|
||||
params->v0204.efi_mmap_size = efi_mmap_size;
|
||||
}
|
||||
}
|
||||
@@ -575,7 +609,6 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_size_t real_size, prot_size;
|
||||
grub_ssize_t len;
|
||||
int i;
|
||||
char *dest;
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
@@ -771,10 +804,6 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
break;
|
||||
}
|
||||
|
||||
/* We can't detect VESA, but user is implicitly telling us that it
|
||||
is built-in because `vga=' parameter was used. */
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
|
||||
|
||||
linux_mode = &grub_vesa_mode_table[vid_mode
|
||||
- GRUB_VESA_MODE_TABLE_START];
|
||||
|
||||
@@ -836,22 +865,14 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
params->loadflags |= GRUB_LINUX_FLAG_QUIET;
|
||||
}
|
||||
|
||||
|
||||
/* Specify the boot file. */
|
||||
dest = grub_stpcpy ((char *) real_mode_mem + GRUB_LINUX_CL_OFFSET,
|
||||
"BOOT_IMAGE=");
|
||||
dest = grub_stpcpy (dest, argv[0]);
|
||||
|
||||
/* Copy kernel parameters. */
|
||||
for (i = 1;
|
||||
i < argc
|
||||
&& dest + grub_strlen (argv[i]) + 1 < ((char *) real_mode_mem
|
||||
+ GRUB_LINUX_CL_END_OFFSET);
|
||||
i++)
|
||||
{
|
||||
*dest++ = ' ';
|
||||
dest = grub_stpcpy (dest, argv[i]);
|
||||
}
|
||||
/* Create kernel command line. */
|
||||
grub_memcpy ((char *)real_mode_mem + GRUB_LINUX_CL_OFFSET, LINUX_IMAGE,
|
||||
sizeof (LINUX_IMAGE));
|
||||
grub_create_loader_cmdline (argc, argv,
|
||||
(char *)real_mode_mem + GRUB_LINUX_CL_OFFSET
|
||||
+ sizeof (LINUX_IMAGE) - 1,
|
||||
GRUB_LINUX_CL_END_OFFSET - GRUB_LINUX_CL_OFFSET
|
||||
- (sizeof (LINUX_IMAGE) - 1));
|
||||
|
||||
len = prot_size;
|
||||
if (grub_file_read (file, prot_mode_mem, len) != len)
|
||||
|
||||
@@ -46,7 +46,7 @@ struct module
|
||||
int cmdline_size;
|
||||
};
|
||||
|
||||
struct module *modules, *modules_last;
|
||||
static struct module *modules, *modules_last;
|
||||
static grub_size_t cmdline_size;
|
||||
static grub_size_t total_modcmd;
|
||||
static unsigned modcnt;
|
||||
@@ -435,7 +435,7 @@ grub_multiboot_make_mbi (grub_uint32_t *target)
|
||||
bufsize = grub_multiboot_get_mbi_size ();
|
||||
|
||||
err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch,
|
||||
0, 0xffffffff - bufsize,
|
||||
0x10000, 0x100000 - bufsize,
|
||||
bufsize, 4,
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE);
|
||||
if (err)
|
||||
@@ -539,6 +539,9 @@ grub_multiboot_make_mbi (grub_uint32_t *target)
|
||||
mbi->u.elf_sec.shndx = elf_sec_shstrndx;
|
||||
|
||||
mbi->flags |= MULTIBOOT_INFO_ELF_SHDR;
|
||||
|
||||
ptrorig += elf_sec_entsize * elf_sec_num;
|
||||
ptrdest += elf_sec_entsize * elf_sec_num;
|
||||
}
|
||||
|
||||
err = retrieve_video_parameters (mbi, ptrorig, ptrdest);
|
||||
@@ -547,6 +550,16 @@ grub_multiboot_make_mbi (grub_uint32_t *target)
|
||||
grub_print_error ();
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
if ((mbi->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)
|
||||
&& mbi->framebuffer_type == MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED)
|
||||
{
|
||||
ptrorig += mbi->framebuffer_palette_num_colors
|
||||
* sizeof (struct multiboot_color);
|
||||
ptrdest += mbi->framebuffer_palette_num_colors
|
||||
* sizeof (struct multiboot_color);
|
||||
}
|
||||
|
||||
#if GRUB_MACHINE_HAS_VBE
|
||||
ptrorig += sizeof (struct grub_vbe_info_block);
|
||||
ptrdest += sizeof (struct grub_vbe_info_block);
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
#include <grub/video.h>
|
||||
#include <grub/mm.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
static grub_dl_t my_mod;
|
||||
static int boot_drive;
|
||||
static void *boot_part_addr;
|
||||
|
||||
@@ -34,6 +34,9 @@
|
||||
#include <grub/cpu/relocator.h>
|
||||
#include <grub/video.h>
|
||||
#include <grub/i386/floppy.h>
|
||||
#include <grub/lib/cmdline.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
#define GRUB_LINUX_CL_OFFSET 0x9000
|
||||
#define GRUB_LINUX_CL_END_OFFSET 0x90FF
|
||||
@@ -86,7 +89,6 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_size_t real_size;
|
||||
grub_ssize_t len;
|
||||
int i;
|
||||
char *dest;
|
||||
char *grub_linux_prot_chunk;
|
||||
int grub_linux_is_bzimage;
|
||||
grub_addr_t grub_linux_prot_target;
|
||||
@@ -286,21 +288,14 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
((GRUB_LINUX_MAX_SETUP_SECTS - setup_sects - 1)
|
||||
<< GRUB_DISK_SECTOR_BITS));
|
||||
|
||||
/* Specify the boot file. */
|
||||
dest = grub_stpcpy (grub_linux_real_chunk + GRUB_LINUX_CL_OFFSET,
|
||||
"BOOT_IMAGE=");
|
||||
dest = grub_stpcpy (dest, argv[0]);
|
||||
|
||||
/* Copy kernel parameters. */
|
||||
for (i = 1;
|
||||
i < argc
|
||||
&& dest + grub_strlen (argv[i]) + 1 < (grub_linux_real_chunk
|
||||
+ GRUB_LINUX_CL_END_OFFSET);
|
||||
i++)
|
||||
{
|
||||
*dest++ = ' ';
|
||||
dest = grub_stpcpy (dest, argv[i]);
|
||||
}
|
||||
/* Create kernel command line. */
|
||||
grub_memcpy ((char *)grub_linux_real_chunk + GRUB_LINUX_CL_OFFSET,
|
||||
LINUX_IMAGE, sizeof (LINUX_IMAGE));
|
||||
grub_create_loader_cmdline (argc, argv,
|
||||
(char *)grub_linux_real_chunk
|
||||
+ GRUB_LINUX_CL_OFFSET + sizeof (LINUX_IMAGE) - 1,
|
||||
GRUB_LINUX_CL_END_OFFSET - GRUB_LINUX_CL_OFFSET
|
||||
- (sizeof (LINUX_IMAGE) - 1));
|
||||
|
||||
if (grub_linux_is_bzimage)
|
||||
grub_linux_prot_target = GRUB_LINUX_BZIMAGE_ADDR;
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
#include <grub/mm.h>
|
||||
#include <grub/cpu/relocator.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
static grub_dl_t my_mod;
|
||||
static struct grub_relocator *rel;
|
||||
static grub_uint32_t edx = 0xffffffff;
|
||||
|
||||
@@ -49,7 +49,7 @@ struct tbl_alias
|
||||
char *name;
|
||||
};
|
||||
|
||||
struct tbl_alias table_aliases[] =
|
||||
static struct tbl_alias table_aliases[] =
|
||||
{
|
||||
{GRUB_EFI_ACPI_20_TABLE_GUID, "ACPI_20"},
|
||||
{GRUB_EFI_ACPI_TABLE_GUID, "ACPI"},
|
||||
@@ -219,7 +219,7 @@ struct property_descriptor
|
||||
void *data;
|
||||
};
|
||||
|
||||
struct grub_xnu_devprop_device_descriptor *devices = 0;
|
||||
static struct grub_xnu_devprop_device_descriptor *devices = 0;
|
||||
|
||||
grub_err_t
|
||||
grub_xnu_devprop_remove_property (struct grub_xnu_devprop_device_descriptor *dev,
|
||||
@@ -951,10 +951,11 @@ grub_err_t
|
||||
grub_xnu_boot (void)
|
||||
{
|
||||
struct grub_xnu_boot_params *bootparams;
|
||||
void *bp_in;
|
||||
grub_addr_t bootparams_target;
|
||||
grub_err_t err;
|
||||
grub_efi_uintn_t memory_map_size = 0;
|
||||
grub_efi_memory_descriptor_t *memory_map;
|
||||
void *memory_map;
|
||||
grub_addr_t memory_map_target;
|
||||
grub_efi_uintn_t map_key = 0;
|
||||
grub_efi_uintn_t descriptor_size = 0;
|
||||
@@ -1006,9 +1007,10 @@ grub_xnu_boot (void)
|
||||
|
||||
/* Relocate the boot parameters to heap. */
|
||||
err = grub_xnu_heap_malloc (sizeof (*bootparams),
|
||||
(void **) &bootparams, &bootparams_target);
|
||||
&bp_in, &bootparams_target);
|
||||
if (err)
|
||||
return err;
|
||||
bootparams = bp_in;
|
||||
|
||||
/* Set video. */
|
||||
err = grub_xnu_set_video (bootparams);
|
||||
@@ -1035,7 +1037,7 @@ grub_xnu_boot (void)
|
||||
memory map growth. */
|
||||
memory_map_size += 20 * descriptor_size;
|
||||
err = grub_xnu_heap_malloc (memory_map_size,
|
||||
(void **) &memory_map, &memory_map_target);
|
||||
&memory_map, &memory_map_target);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -1109,7 +1111,7 @@ grub_xnu_boot (void)
|
||||
grub_xnu_arg1 = bootparams_target;
|
||||
|
||||
grub_autoefi_set_virtual_address_map (memory_map_size, descriptor_size,
|
||||
descriptor_version,memory_map);
|
||||
descriptor_version, memory_map);
|
||||
|
||||
state.eip = grub_xnu_entry_point;
|
||||
state.eax = grub_xnu_arg1;
|
||||
|
||||
Reference in new issue
Block a user