AWK = @AWK@
LIBCURSES = @LIBCURSES@
LIBUSB = @LIBUSB@
+LIBPCIACCESS = @LIBPCIACCESS@
YACC = @YACC@
- UNIFONT_BDF = @UNIFONT_BDF@
+ FONT_SOURCE = @FONT_SOURCE@
# Options.
enable_grub_emu = @enable_grub_emu@
endif
# For grub-mkimage.
- grub_mkimage_SOURCES = util/grub-mkrawimage.c util/misc.c \
-grub_mkimage_SOURCES = gnulib/progname.c util/i386/pc/grub-mkimage.c util/misc.c \
++grub_mkimage_SOURCES = gnulib/progname.c util/grub-mkrawimage.c util/misc.c \
util/resolve.c lib/LzmaEnc.c lib/LzFind.c
grub_mkimage_CFLAGS = -DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)
util/i386/pc/grub-mkimage.c_DEPENDENCIES = Makefile
ifeq ($(enable_grub_emu_usb), yes)
grub_emu_SOURCES += disk/usbms.c util/usb.c bus/usb/usb.c \
commands/usbtest.c
-grub_emu_LDFLAGS += $(LIBCURSES) $(LIBUSB)
+grub_emu_LDFLAGS += $(LIBUSB)
+endif
+
+ifeq ($(enable_grub_emu_pci), yes)
+grub_emu_SOURCES += util/pci.c commands/lspci.c
+grub_emu_LDFLAGS += $(LIBPCIACCESS)
endif
- # Scripts.
- sbin_SCRIPTS = grub-install
- bin_SCRIPTS = grub-mkrescue
+ sbin_SCRIPTS += grub-install
+ grub_install_SOURCES = util/grub-install.in
- # For grub-install.
- grub_install_SOURCES = util/i386/pc/grub-install.in
+ bin_SCRIPTS += grub-mkrescue
+ grub_mkrescue_SOURCES = util/grub-mkrescue.in
- # For grub-mkrescue.
- grub_mkrescue_SOURCES = util/i386/pc/grub-mkrescue.in
+ bin_SCRIPTS += grub-mkfloppy
+ grub_mkfloppy_SOURCES = util/i386/pc/grub-mkfloppy.in
- pkglib_MODULES = biosdisk.mod chain.mod \
- multiboot.mod reboot.mod halt.mod \
- vbe.mod vbetest.mod vbeinfo.mod play.mod serial.mod \
- ata.mod vga.mod memdisk.mod pci.mod lspci.mod \
- aout.mod bsd.mod pxe.mod pxecmd.mod datetime.mod date.mod \
- datehook.mod lsmmap.mod ata_pthru.mod hdparm.mod \
+ pkglib_MODULES = biosdisk.mod chain.mod \
+ multiboot.mod reboot.mod halt.mod \
+ vbe.mod vbetest.mod vbeinfo.mod play.mod serial.mod \
+ vga.mod memdisk.mod pci.mod lspci.mod \
+ aout.mod bsd.mod pxe.mod pxecmd.mod datetime.mod date.mod \
+ datehook.mod lsmmap.mod ata_pthru.mod hdparm.mod \
usb.mod uhci.mod ohci.mod usbtest.mod usbms.mod usb_keyboard.mod \
efiemu.mod mmap.mod acpi.mod drivemap.mod
vga_text_mod_CFLAGS = $(COMMON_CFLAGS)
vga_text_mod_LDFLAGS = $(COMMON_LDFLAGS)
+pkglib_MODULES += relocator.mod
+relocator_mod_SOURCES = lib/i386/relocator.c lib/i386/relocator_asm.S lib/i386/relocator_backward.S
+relocator_mod_CFLAGS = $(COMMON_CFLAGS)
+relocator_mod_ASFLAGS = $(COMMON_ASFLAGS)
+relocator_mod_LDFLAGS = $(COMMON_LDFLAGS)
++
+ pkglib_MODULES += ata.mod
+ ata_mod_SOURCES = disk/ata.c
+ ata_mod_CFLAGS = $(COMMON_CFLAGS)
+ ata_mod_LDFLAGS = $(COMMON_LDFLAGS)
/* The asm part of the multiboot loader. */
void grub_multiboot_real_boot (grub_addr_t entry,
- struct grub_multiboot_info *mbi)
+ struct multiboot_info *mbi)
__attribute__ ((noreturn));
void grub_multiboot2_real_boot (grub_addr_t entry,
- struct grub_multiboot_info *mbi)
+ struct multiboot_info *mbi)
__attribute__ ((noreturn));
-extern grub_addr_t grub_multiboot_payload_orig;
+extern grub_uint32_t grub_multiboot_payload_eip;
+extern char *grub_multiboot_payload_orig;
extern grub_addr_t grub_multiboot_payload_dest;
extern grub_size_t grub_multiboot_payload_size;
-extern grub_uint32_t grub_multiboot_payload_entry_offset;
-extern grub_uint8_t grub_multiboot_forward_relocator;
-extern grub_uint8_t grub_multiboot_forward_relocator_end;
-extern grub_uint8_t grub_multiboot_backward_relocator;
-extern grub_uint8_t grub_multiboot_backward_relocator_end;
-
-#define RELOCATOR_SIZEOF(x) (&grub_multiboot_##x##_relocator_end - &grub_multiboot_##x##_relocator)
+#define GRUB_MULTIBOOT_STACK_SIZE 4096
#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
--- /dev/null
- ((void (*)()) ptr) ();
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/mm.h>
+#include <grub/misc.h>
+
+#include <grub/types.h>
+#include <grub/types.h>
+#include <grub/err.h>
+
+#include <grub/i386/relocator.h>
+
+extern grub_uint8_t grub_relocator32_forward_start;
+extern grub_uint8_t grub_relocator32_forward_end;
+extern grub_uint8_t grub_relocator32_backward_start;
+extern grub_uint8_t grub_relocator32_backward_end;
+
+extern grub_uint32_t grub_relocator32_backward_dest;
+extern grub_uint32_t grub_relocator32_backward_size;
+extern grub_addr_t grub_relocator32_backward_src;
+
+extern grub_uint32_t grub_relocator32_forward_dest;
+extern grub_uint32_t grub_relocator32_forward_size;
+extern grub_addr_t grub_relocator32_forward_src;
+
+extern grub_uint32_t grub_relocator32_forward_eax;
+extern grub_uint32_t grub_relocator32_forward_ebx;
+extern grub_uint32_t grub_relocator32_forward_ecx;
+extern grub_uint32_t grub_relocator32_forward_edx;
+extern grub_uint32_t grub_relocator32_forward_eip;
+extern grub_uint32_t grub_relocator32_forward_esp;
+
+extern grub_uint32_t grub_relocator32_backward_eax;
+extern grub_uint32_t grub_relocator32_backward_ebx;
+extern grub_uint32_t grub_relocator32_backward_ecx;
+extern grub_uint32_t grub_relocator32_backward_edx;
+extern grub_uint32_t grub_relocator32_backward_eip;
+extern grub_uint32_t grub_relocator32_backward_esp;
+
+#define RELOCATOR_SIZEOF(x) (&grub_relocator32_##x##_end - &grub_relocator32_##x##_start)
+#define RELOCATOR_ALIGN 16
+#define PREFIX(x) grub_relocator32_ ## x
+
+static void
+write_call_relocator_bw (void *ptr, void *src, grub_uint32_t dest,
+ grub_size_t size, struct grub_relocator32_state state)
+{
+ grub_relocator32_backward_dest = dest;
+ grub_relocator32_backward_src = PTR_TO_UINT64 (src);
+ grub_relocator32_backward_size = size;
+
+ grub_relocator32_backward_eax = state.eax;
+ grub_relocator32_backward_ebx = state.ebx;
+ grub_relocator32_backward_ecx = state.ecx;
+ grub_relocator32_backward_edx = state.edx;
+ grub_relocator32_backward_eip = state.eip;
+ grub_relocator32_backward_esp = state.esp;
+
+ grub_memmove (ptr,
+ &grub_relocator32_backward_start,
+ RELOCATOR_SIZEOF (backward));
- ((void (*)()) ptr) ();
++ ((void (*) (void)) ptr) ();
+}
+
+static void
+write_call_relocator_fw (void *ptr, void *src, grub_uint32_t dest,
+ grub_size_t size, struct grub_relocator32_state state)
+{
+
+ grub_relocator32_forward_dest = dest;
+ grub_relocator32_forward_src = PTR_TO_UINT64 (src);
+ grub_relocator32_forward_size = size;
+
+ grub_relocator32_forward_eax = state.eax;
+ grub_relocator32_forward_ebx = state.ebx;
+ grub_relocator32_forward_ecx = state.ecx;
+ grub_relocator32_forward_edx = state.edx;
+ grub_relocator32_forward_eip = state.eip;
+ grub_relocator32_forward_esp = state.esp;
+
+ grub_memmove (ptr,
+ &grub_relocator32_forward_start,
+ RELOCATOR_SIZEOF (forward));
++ ((void (*) (void)) ptr) ();
+}
+
+#include "../relocator.c"
#include <grub/device.h>
#include <grub/partition.h>
#endif
+#include <grub/i386/relocator.h>
extern grub_dl_t my_mod;
- static struct grub_multiboot_info *mbi, *mbi_dest;
+ static struct multiboot_info *mbi, *mbi_dest;
-static grub_addr_t entry;
-static char *playground = 0;
static grub_size_t code_size;
+char *grub_multiboot_payload_orig;
+grub_addr_t grub_multiboot_payload_dest;
+grub_size_t grub_multiboot_payload_size;
+grub_uint32_t grub_multiboot_payload_eip;
+grub_uint32_t grub_multiboot_payload_esp;
+
static grub_err_t
grub_multiboot_boot (void)
{
static grub_err_t
grub_multiboot_unload (void)
{
-- if (playground)
++ if (mbi)
{
unsigned int i;
for (i = 0; i < mbi->mods_count; i++)
{
grub_free ((void *)
- ((struct grub_mod_list *) mbi->mods_addr)[i].mod_start);
+ ((struct multiboot_mod_list *) mbi->mods_addr)[i].mod_start);
grub_free ((void *)
- ((struct grub_mod_list *) mbi->mods_addr)[i].cmdline);
+ ((struct multiboot_mod_list *) mbi->mods_addr)[i].cmdline);
}
grub_free ((void *) mbi->mods_addr);
-- grub_free (playground);
}
++ grub_relocator32_free (grub_multiboot_payload_orig);
mbi = NULL;
-- playground = NULL;
++ grub_multiboot_payload_orig = NULL;
grub_dl_unref (my_mod);
return GRUB_ERR_NONE;
#define boot_loader_name_addr(x) \
((void *) ((x) + code_size + cmdline_length))
#define mbi_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length))
- #define mmap_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length + sizeof (struct grub_multiboot_info)))
- #define stack_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length + sizeof (struct grub_multiboot_info) + mmap_length + GRUB_MULTIBOOT_STACK_SIZE))
+ #define mmap_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length + sizeof (struct multiboot_info)))
++#define stack_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length + sizeof (struct multiboot_info) + mmap_length + GRUB_MULTIBOOT_STACK_SIZE))
grub_multiboot_payload_size = cmdline_length
/* boot_loader_name_length might need to grow for mbi,etc to be aligned (see below) */
+ boot_loader_name_length + 3
- + sizeof (struct grub_multiboot_info) + mmap_length
- + sizeof (struct multiboot_info) + mmap_length;
++ + sizeof (struct multiboot_info) + mmap_length
+ + GRUB_MULTIBOOT_STACK_SIZE;
if (header->flags & MULTIBOOT_AOUT_KLUDGE)
{
#include <grub/machine/boot.h>
#include <grub/machine/kernel.h>
#include <grub/machine/memory.h>
+#include <grub/machine/machine.h>
+#include <grub/elf.h>
+ #include <grub/i18n.h>
#include <grub/kernel.h>
#include <grub/disk.h>
#include <grub/util/misc.h>
grub_util_load_image (kernel_path, kernel_img);
if (GRUB_KERNEL_MACHINE_PREFIX + strlen (prefix) + 1 > GRUB_KERNEL_MACHINE_DATA_END)
- grub_util_error ("prefix too long");
- grub_util_error (_("prefix is too long"));
++ grub_util_error (_("prefix too long"));
strcpy (kernel_img + GRUB_KERNEL_MACHINE_PREFIX, prefix);
/* Fill in the grub_module_info structure. */
#if defined(GRUB_MACHINE_PCBIOS)
{
unsigned num;
+ char *boot_path, *boot_img;
+ size_t boot_size;
num = ((core_size + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS);
if (num > 0xffff)
- grub_util_error ("the core image is too big");
+ grub_util_error (_("the core image is too big"));
boot_path = grub_util_get_path (dir, "diskboot.img");
boot_size = grub_util_get_image_size (boot_path);
if (boot_size != GRUB_DISK_SECTOR_SIZE)
- grub_util_error ("diskboot.img is not one sector size");
- grub_util_error (_("diskboot.img size must be %u bytes"), GRUB_DISK_SECTOR_SIZE);
++ grub_util_error (_("diskboot.img size must be %u bytes"),
++ GRUB_DISK_SECTOR_SIZE);
boot_img = grub_util_read_image (boot_path);
#ifdef GRUB_MACHINE_PCBIOS
if (GRUB_KERNEL_MACHINE_LINK_ADDR + core_size > GRUB_MEMORY_MACHINE_UPPER)
- grub_util_error ("Core image is too big (%p > %p)\n",
- GRUB_KERNEL_MACHINE_LINK_ADDR + core_size, GRUB_MEMORY_MACHINE_UPPER);
+ grub_util_error (_("Core image is too big (%p > %p)\n"),
- GRUB_KERNEL_MACHINE_LINK_ADDR + core_size, GRUB_MEMORY_MACHINE_UPPER);
++ GRUB_KERNEL_MACHINE_LINK_ADDR + core_size,
++ GRUB_MEMORY_MACHINE_UPPER);
+#endif
+
+#if defined(GRUB_MACHINE_MIPS)
+ if (format == GRUB_PLATFORM_IMAGE_ELF)
+ {
+ char *elf_img;
+ size_t program_size;
+ Elf32_Ehdr *ehdr;
+ Elf32_Phdr *phdr;
+ grub_uint32_t target_addr;
+
+ program_size = ALIGN_UP (core_size, 4);
+
+ elf_img = xmalloc (program_size + sizeof (*ehdr) + sizeof (*phdr));
+ memset (elf_img, 0, program_size + sizeof (*ehdr) + sizeof (*phdr));
+ memcpy (elf_img + sizeof (*ehdr) + sizeof (*phdr), core_img, core_size);
+ ehdr = (void *) elf_img;
+ phdr = (void *) (elf_img + sizeof (*ehdr));
+ memcpy (ehdr->e_ident, ELFMAG, SELFMAG);
+ ehdr->e_ident[EI_CLASS] = ELFCLASS32;
+#ifdef GRUB_CPU_MIPSEL
+ ehdr->e_ident[EI_DATA] = ELFDATA2LSB;
+#else
+ ehdr->e_ident[EI_DATA] = ELFDATA2MSB;
+#endif
+ ehdr->e_ident[EI_VERSION] = EV_CURRENT;
+ ehdr->e_ident[EI_OSABI] = ELFOSABI_NONE;
+ ehdr->e_type = grub_host_to_target16 (ET_EXEC);
+ ehdr->e_machine = grub_host_to_target16 (EM_MIPS);
+ ehdr->e_version = grub_host_to_target32 (EV_CURRENT);
+
+ ehdr->e_phoff = grub_host_to_target32 ((char *) phdr - (char *) ehdr);
+ ehdr->e_phentsize = grub_host_to_target16 (sizeof (*phdr));
+ ehdr->e_phnum = grub_host_to_target16 (1);
+
+ /* No section headers. */
+ ehdr->e_shoff = grub_host_to_target32 (0);
+ ehdr->e_shentsize = grub_host_to_target16 (0);
+ ehdr->e_shnum = grub_host_to_target16 (0);
+ ehdr->e_shstrndx = grub_host_to_target16 (0);
+
+ ehdr->e_ehsize = grub_host_to_target16 (sizeof (*ehdr));
+
+ phdr->p_type = grub_host_to_target32 (PT_LOAD);
+ phdr->p_offset = grub_host_to_target32 (sizeof (*ehdr) + sizeof (*phdr));
+ phdr->p_flags = grub_host_to_target32 (PF_R | PF_W | PF_X);
+
+ target_addr = ALIGN_UP (GRUB_KERNEL_MACHINE_LINK_ADDR
+ + kernel_size + total_module_size
+ + 0x100000
+ // + BSS_SIZE
+ , 32);
+ ehdr->e_entry = grub_host_to_target32 (target_addr);
+ phdr->p_vaddr = grub_host_to_target32 (target_addr);
+ phdr->p_paddr = grub_host_to_target32 (target_addr);
+ phdr->p_align = grub_host_to_target32 (GRUB_KERNEL_MACHINE_LINK_ALIGN);
+ ehdr->e_flags = grub_host_to_target32 (0x1000 | EF_MIPS_NOREORDER
+ | EF_MIPS_PIC | EF_MIPS_CPIC);
+ phdr->p_filesz = grub_host_to_target32 (core_size);
+ phdr->p_memsz = grub_host_to_target32 (core_size);
+
+ free (core_img);
+ core_img = elf_img;
+ core_size = program_size + sizeof (*ehdr) + sizeof (*phdr);
+ }
#endif
grub_util_write_image (core_img, core_size, out);
usage (int status)
{
if (status)
- fprintf (stderr, _("Try ``%s --help'' for more information.\n"), program_name);
+ fprintf (stderr, "Try ``grub-mkimage --help'' for more information.\n");
else
- printf ("\
+ printf (_("\
Usage: grub-mkimage [OPTION]... [MODULES]\n\
\n\
Make a bootable image of GRUB.\n\
char *dir = NULL;
char *prefix = NULL;
char *memdisk = NULL;
+ char *font = NULL;
char *config = NULL;
FILE *fp = stdout;
+#ifdef GRUB_PLATFORM_IMAGE_DEFAULT
+ grub_platform_image_format_t format = GRUB_PLATFORM_IMAGE_DEFAULT;
+#endif
- progname = "grub-mkimage";
+ set_program_name (argv[0]);
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
while (1)
{