commit-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[2367] 2009-06-27 Pavel Roskin <address@hidden>


From: Robert Millan
Subject: [2367] 2009-06-27 Pavel Roskin <address@hidden>
Date: Sat, 27 Jun 2009 11:18:10 +0000

Revision: 2367
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2367
Author:   robertmh
Date:     2009-06-27 11:18:10 +0000 (Sat, 27 Jun 2009)
Log Message:
-----------
2009-06-27  Pavel Roskin  <address@hidden>
2009-06-27  Robert Millan  <address@hidden>

        * include/grub/dl.h: Include grub/elf.h.
        (struct grub_dl): Add symtab field.
        * kern/dl.c [GRUB_MACHINE_QEMU]: Define
        GRUB_MODULES_MACHINE_READONLY.
        (grub_dl_resolve_symbols): Populate mod->symtab, making a copy
        of the header for read-only modules.
        (grub_dl_unload): Free mod->symtab for read-only modules.
        * kern/i386/dl.c: Use mod->symtab.
        * kern/powerpc/dl.c: Likewise.
        * kern/sparc64/dl.c: Likewise.
        * kern/x86_64/dl.c: Likewise.

        * conf/i386-qemu.rmk: New file.
        * kern/i386/qemu/startup.S: Likewise.
        * kern/i386/qemu/mmap.c: Likewise.
        * boot/i386/qemu/boot.S: Likewise.
        * include/grub/i386/qemu/time.h: Likewise.
        * include/grub/i386/qemu/serial.h: Likewise.
        * include/grub/i386/qemu/kernel.h: Likewise.
        * include/grub/i386/qemu/console.h: Likewise.
        * include/grub/i386/qemu/boot.h: Likewise.
        * include/grub/i386/qemu/init.h: Likewise.
        * include/grub/i386/qemu/machine.h: Likewise.
        * include/grub/i386/qemu/loader.h: Likewise.
        * include/grub/i386/qemu/memory.h: Likewise.

        * conf/i386-coreboot.rmk (GRUB_BOOT_MACHINE_LINK_ADDR)
        (GRUB_KERNEL_MACHINE_LINK_ADDR): New variables.
        [qemu] (pkglib_IMAGES): Add `boot.img'.
        [qemu] (boot_img_SOURCES, boot_img_ASFLAGS, boot_img_LDFLAGS)
        [qemu] (boot_img_FORMAT): New variables.
        [qemu] (bin_UTILITIES): Add `grub-mkimage'.
        [qemu] (grub_mkimage_SOURCES, grub_mkimage_CFLAGS): New variables.
        [qemu] (kernel_img_SOURCES, kernel_img_HEADERS, kernel_img_CFLAGS)
        [qemu] (kernel_img_ASFLAGS, kernel_img_LDFLAGS)
        [qemu] (kernel_img_FORMAT): New variables.

        * configure.ac: Recognise `i386-qemu'.

        * util/i386/pc/grub-mkimage.c (compress_kernel): Add dummy variant
        (for no compression).
        [GRUB_MACHINE_QEMU] (generate_image): Misc adjustments to produce
        a valid i386 ROM image.  Make `GRUB_KERNEL_MACHINE_COMPRESSED_SIZE',
        `GRUB_KERNEL_MACHINE_INSTALL_DOS_PART' and
        `GRUB_KERNEL_MACHINE_INSTALL_BSD_PART' optional features (with
        ifdefs).

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/conf/i386-coreboot.rmk
    trunk/grub2/configure.ac
    trunk/grub2/include/grub/dl.h
    trunk/grub2/kern/dl.c
    trunk/grub2/kern/i386/coreboot/init.c
    trunk/grub2/kern/i386/dl.c
    trunk/grub2/kern/powerpc/dl.c
    trunk/grub2/kern/sparc64/dl.c
    trunk/grub2/kern/x86_64/dl.c
    trunk/grub2/util/i386/pc/grub-mkimage.c

Added Paths:
-----------
    trunk/grub2/boot/i386/qemu/
    trunk/grub2/boot/i386/qemu/boot.S
    trunk/grub2/conf/i386-qemu.rmk
    trunk/grub2/include/grub/i386/qemu/
    trunk/grub2/include/grub/i386/qemu/boot.h
    trunk/grub2/include/grub/i386/qemu/console.h
    trunk/grub2/include/grub/i386/qemu/init.h
    trunk/grub2/include/grub/i386/qemu/kernel.h
    trunk/grub2/include/grub/i386/qemu/loader.h
    trunk/grub2/include/grub/i386/qemu/machine.h
    trunk/grub2/include/grub/i386/qemu/memory.h
    trunk/grub2/include/grub/i386/qemu/serial.h
    trunk/grub2/include/grub/i386/qemu/time.h
    trunk/grub2/kern/i386/qemu/
    trunk/grub2/kern/i386/qemu/mmap.c
    trunk/grub2/kern/i386/qemu/startup.S

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2009-06-27 06:10:33 UTC (rev 2366)
+++ trunk/grub2/ChangeLog       2009-06-27 11:18:10 UTC (rev 2367)
@@ -1,5 +1,55 @@
 2009-06-27  Pavel Roskin  <address@hidden>
+2009-06-27  Robert Millan  <address@hidden>
 
+       * include/grub/dl.h: Include grub/elf.h.
+       (struct grub_dl): Add symtab field.
+       * kern/dl.c [GRUB_MACHINE_QEMU]: Define
+       GRUB_MODULES_MACHINE_READONLY.
+       (grub_dl_resolve_symbols): Populate mod->symtab, making a copy
+       of the header for read-only modules.
+       (grub_dl_unload): Free mod->symtab for read-only modules.
+       * kern/i386/dl.c: Use mod->symtab.
+       * kern/powerpc/dl.c: Likewise.
+       * kern/sparc64/dl.c: Likewise.
+       * kern/x86_64/dl.c: Likewise.
+
+       * conf/i386-qemu.rmk: New file.
+       * kern/i386/qemu/startup.S: Likewise.
+       * kern/i386/qemu/mmap.c: Likewise.
+       * boot/i386/qemu/boot.S: Likewise.
+       * include/grub/i386/qemu/time.h: Likewise.
+       * include/grub/i386/qemu/serial.h: Likewise.
+       * include/grub/i386/qemu/kernel.h: Likewise.
+       * include/grub/i386/qemu/console.h: Likewise.
+       * include/grub/i386/qemu/boot.h: Likewise.
+       * include/grub/i386/qemu/init.h: Likewise.
+       * include/grub/i386/qemu/machine.h: Likewise.
+       * include/grub/i386/qemu/loader.h: Likewise.
+       * include/grub/i386/qemu/memory.h: Likewise.
+
+       * conf/i386-coreboot.rmk (GRUB_BOOT_MACHINE_LINK_ADDR)
+       (GRUB_KERNEL_MACHINE_LINK_ADDR): New variables.
+       [qemu] (pkglib_IMAGES): Add `boot.img'.
+       [qemu] (boot_img_SOURCES, boot_img_ASFLAGS, boot_img_LDFLAGS)
+       [qemu] (boot_img_FORMAT): New variables.
+       [qemu] (bin_UTILITIES): Add `grub-mkimage'.
+       [qemu] (grub_mkimage_SOURCES, grub_mkimage_CFLAGS): New variables.
+       [qemu] (kernel_img_SOURCES, kernel_img_HEADERS, kernel_img_CFLAGS)
+       [qemu] (kernel_img_ASFLAGS, kernel_img_LDFLAGS)
+       [qemu] (kernel_img_FORMAT): New variables.
+
+       * configure.ac: Recognise `i386-qemu'.
+
+       * util/i386/pc/grub-mkimage.c (compress_kernel): Add dummy variant
+       (for no compression).
+       [GRUB_MACHINE_QEMU] (generate_image): Misc adjustments to produce
+       a valid i386 ROM image.  Make `GRUB_KERNEL_MACHINE_COMPRESSED_SIZE',
+       `GRUB_KERNEL_MACHINE_INSTALL_DOS_PART' and
+       `GRUB_KERNEL_MACHINE_INSTALL_BSD_PART' optional features (with
+       ifdefs).
+
+2009-06-27  Pavel Roskin  <address@hidden>
+
        * efiemu/prepare.c: Eliminate TYPE macro, it makes code hard to
        read.
        * efiemu/prepare32.c: Likewise.

Added: trunk/grub2/boot/i386/qemu/boot.S
===================================================================
--- trunk/grub2/boot/i386/qemu/boot.S                           (rev 0)
+++ trunk/grub2/boot/i386/qemu/boot.S   2009-06-27 11:18:10 UTC (rev 2367)
@@ -0,0 +1,67 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 1999,2000,2001,2002,2003,2005,2006,2007,2008,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 <config.h>
+#include <grub/symbol.h>
+#include <grub/machine/memory.h>
+#include <grub/machine/boot.h>
+#include <grub/machine/kernel.h>
+
+       .text
+       .code16
+       .globl _start
+_start:
+       /* Disable interrupts.  */
+       cli
+
+       jmp     1f
+
+       . = _start + GRUB_BOOT_MACHINE_CORE_ENTRY_ADDR
+VARIABLE(grub_core_entry_addr)
+       .long   0
+1:
+
+       /* Process VGA rom.  */
+       call    $0xc000, $0x3
+
+       /* Set up %ds, %ss, and %es.  */
+       xorw    %ax, %ax
+       movw    %ax, %ds
+       movw    %ax, %ss
+       movw    %ax, %es
+
+       /* Set up the real mode stack.  */
+       movl    $GRUB_MEMORY_MACHINE_REAL_STACK, %esp
+
+       /* Transition to protected mode.  We use pushl to force generation
+          of a flat return address.  */
+       pushl   $1f
+       DATA32  jmp real_to_prot
+       .code32
+1:
+       movl    grub_core_entry_addr, %edx
+       jmp     *%edx
+
+#include "../../../kern/i386/realmode.S"
+
+       /* Intel, in its infinite wisdom, decided to put the i8086 entry point
+          *right here* and this is why we need this kludge.  */
+
+       . = GRUB_BOOT_MACHINE_SIZE - 16
+       jmp     _start
+       . = GRUB_BOOT_MACHINE_SIZE

Modified: trunk/grub2/conf/i386-coreboot.rmk
===================================================================
--- trunk/grub2/conf/i386-coreboot.rmk  2009-06-27 06:10:33 UTC (rev 2366)
+++ trunk/grub2/conf/i386-coreboot.rmk  2009-06-27 11:18:10 UTC (rev 2367)
@@ -8,9 +8,12 @@
 script/sh/lexer.c_DEPENDENCIES = grub_script.tab.h
 
 # Images.
-pkglib_PROGRAMS = kernel.img
 
-# For kernel.img.
+GRUB_KERNEL_MACHINE_LINK_ADDR  = 0x8200
+
+ifeq ($(platform), coreboot)
+
+pkglib_PROGRAMS += kernel.img
 kernel_img_SOURCES = kern/i386/coreboot/startup.S \
        kern/i386/misc.S \
        kern/i386/coreboot/init.c \
@@ -34,8 +37,53 @@
        machine/memory.h machine/loader.h list.h handler.h command.h
 kernel_img_CFLAGS = $(COMMON_CFLAGS)
 kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
-kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,0x8200,-Bstatic
+kernel_img_LDFLAGS = $(COMMON_LDFLAGS) 
-Wl,-N,-S,-Ttext,$(GRUB_KERNEL_MACHINE_LINK_ADDR),-Bstatic
 
+endif
+
+ifeq ($(platform), qemu)
+
+GRUB_BOOT_MACHINE_LINK_ADDR    = 0xffe00
+
+pkglib_IMAGES += boot.img
+boot_img_SOURCES = boot/i386/qemu/boot.S
+boot_img_ASFLAGS = $(COMMON_ASFLAGS) 
-DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)
+boot_img_LDFLAGS = $(COMMON_LDFLAGS) 
$(TARGET_IMG_LDFLAGS)$(GRUB_BOOT_MACHINE_LINK_ADDR)
+boot_img_FORMAT = binary
+
+bin_UTILITIES += grub-mkimage
+grub_mkimage_SOURCES = util/i386/pc/grub-mkimage.c util/misc.c \
+       util/resolve.c
+grub_mkimage_CFLAGS = 
-DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)
+
+pkglib_IMAGES += kernel.img
+kernel_img_SOURCES = kern/i386/qemu/startup.S \
+       kern/i386/misc.S \
+       kern/i386/coreboot/init.c \
+       kern/i386/qemu/mmap.c \
+       kern/main.c kern/device.c \
+       kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
+       kern/misc.c kern/mm.c kern/reader.c kern/term.c \
+       kern/rescue_parser.c kern/rescue_reader.c \
+       kern/time.c kern/list.c kern/handler.c kern/command.c kern/corecmd.c \
+       kern/i386/dl.c kern/parser.c kern/partition.c \
+       kern/i386/tsc.c kern/i386/pit.c \
+       kern/generic/rtc_get_time_ms.c \
+       kern/generic/millisleep.c \
+       kern/env.c \
+       term/i386/pc/vga_text.c term/i386/vga_common.c \
+       symlist.c
+kernel_img_HEADERS = boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
+       env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
+       partition.h pc_partition.h reader.h symbol.h term.h time.h types.h \
+       machine/boot.h machine/console.h machine/init.h \
+       machine/memory.h machine/loader.h list.h handler.h command.h
+kernel_img_CFLAGS = $(COMMON_CFLAGS) 
-DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)
+kernel_img_ASFLAGS = $(COMMON_ASFLAGS) 
-DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)
+kernel_img_LDFLAGS = $(COMMON_LDFLAGS) 
$(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR)
+kernel_img_FORMAT = binary
+endif
+
 MOSTLYCLEANFILES += symlist.c kernel_syms.lst
 DEFSYMFILES += kernel_syms.lst
 

Added: trunk/grub2/conf/i386-qemu.rmk
===================================================================
--- trunk/grub2/conf/i386-qemu.rmk                              (rev 0)
+++ trunk/grub2/conf/i386-qemu.rmk      2009-06-27 11:18:10 UTC (rev 2367)
@@ -0,0 +1,2 @@
+# -*- makefile -*-
+include $(srcdir)/conf/i386-coreboot.mk

Modified: trunk/grub2/configure.ac
===================================================================
--- trunk/grub2/configure.ac    2009-06-27 06:10:33 UTC (rev 2366)
+++ trunk/grub2/configure.ac    2009-06-27 11:18:10 UTC (rev 2367)
@@ -85,6 +85,7 @@
   i386-coreboot) ;;
   i386-linuxbios) platform=coreboot ;;
   i386-ieee1275) ;;
+  i386-qemu) ;;
   powerpc-ieee1275) ;;
   sparc64-ieee1275) ;;
   *) AC_MSG_ERROR([platform "$platform" is not supported for target CPU 
"$target_cpu"]) ;;

Modified: trunk/grub2/include/grub/dl.h
===================================================================
--- trunk/grub2/include/grub/dl.h       2009-06-27 06:10:33 UTC (rev 2366)
+++ trunk/grub2/include/grub/dl.h       2009-06-27 11:18:10 UTC (rev 2367)
@@ -1,7 +1,7 @@
 /* dl.h - types and prototypes for loadable module support */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2002,2004,2005,2007,2008  Free Software Foundation, Inc.
+ *  Copyright (C) 2002,2004,2005,2007,2008,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
@@ -23,6 +23,7 @@
 #include <grub/symbol.h>
 #include <grub/err.h>
 #include <grub/types.h>
+#include <grub/elf.h>
 
 #define GRUB_MOD_INIT(name)    \
 static void grub_mod_init (grub_dl_t mod __attribute__ ((unused))) 
__attribute__ ((used)); \
@@ -78,6 +79,7 @@
   int ref_count;
   grub_dl_dep_t dep;
   grub_dl_segment_t segment;
+  Elf_Sym *symtab;
   void (*init) (struct grub_dl *mod);
   void (*fini) (void);
 };

Added: trunk/grub2/include/grub/i386/qemu/boot.h
===================================================================
--- trunk/grub2/include/grub/i386/qemu/boot.h                           (rev 0)
+++ trunk/grub2/include/grub/i386/qemu/boot.h   2009-06-27 11:18:10 UTC (rev 
2367)
@@ -0,0 +1,28 @@
+/*
+ *  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/>.
+ */
+
+#ifndef GRUB_BOOT_MACHINE_HEADER
+#define GRUB_BOOT_MACHINE_HEADER       1
+
+/* The size of boot.img.  */
+#define GRUB_BOOT_MACHINE_SIZE                 (0x100000 - 
GRUB_BOOT_MACHINE_LINK_ADDR)
+
+/* The offset of GRUB_CORE_ENTRY_ADDR.  */
+#define GRUB_BOOT_MACHINE_CORE_ENTRY_ADDR      0x4
+
+#endif

Added: trunk/grub2/include/grub/i386/qemu/console.h
===================================================================
--- trunk/grub2/include/grub/i386/qemu/console.h                                
(rev 0)
+++ trunk/grub2/include/grub/i386/qemu/console.h        2009-06-27 11:18:10 UTC 
(rev 2367)
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/console.h>

Added: trunk/grub2/include/grub/i386/qemu/init.h
===================================================================
--- trunk/grub2/include/grub/i386/qemu/init.h                           (rev 0)
+++ trunk/grub2/include/grub/i386/qemu/init.h   2009-06-27 11:18:10 UTC (rev 
2367)
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/init.h>

Added: trunk/grub2/include/grub/i386/qemu/kernel.h
===================================================================
--- trunk/grub2/include/grub/i386/qemu/kernel.h                         (rev 0)
+++ trunk/grub2/include/grub/i386/qemu/kernel.h 2009-06-27 11:18:10 UTC (rev 
2367)
@@ -0,0 +1,53 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2005,2006,2007,2008,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/>.
+ */
+
+#ifndef GRUB_KERNEL_MACHINE_HEADER
+#define GRUB_KERNEL_MACHINE_HEADER     1
+
+/* The offset of GRUB_CORE_ENTRY_ADDR.  */
+#define GRUB_KERNEL_MACHINE_CORE_ENTRY_ADDR    0x8
+
+/* The offset of GRUB_KERNEL_IMAGE_SIZE.  */
+#define GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE  0xc
+
+/* The offset of GRUB_PREFIX.  */
+#define GRUB_KERNEL_MACHINE_PREFIX             0x10
+
+/* End of the data section. */
+#define GRUB_KERNEL_MACHINE_DATA_END           0x50
+
+#ifndef ASM_FILE
+
+#include <grub/symbol.h>
+#include <grub/types.h>
+
+extern grub_addr_t grub_core_entry_addr;
+
+/* The size of kernel image.  */
+extern grub_int32_t grub_kernel_image_size;
+
+/* The total size of module images following the kernel.  */
+extern grub_int32_t grub_total_module_size;
+
+/* The prefix which points to the directory where GRUB modules and its
+   configuration file are located.  */
+extern char grub_prefix[];
+
+#endif /* ! ASM_FILE */
+
+#endif /* ! GRUB_KERNEL_MACHINE_HEADER */

Added: trunk/grub2/include/grub/i386/qemu/loader.h
===================================================================
--- trunk/grub2/include/grub/i386/qemu/loader.h                         (rev 0)
+++ trunk/grub2/include/grub/i386/qemu/loader.h 2009-06-27 11:18:10 UTC (rev 
2367)
@@ -0,0 +1 @@
+#include <grub/cpu/loader.h>

Added: trunk/grub2/include/grub/i386/qemu/machine.h
===================================================================
--- trunk/grub2/include/grub/i386/qemu/machine.h                                
(rev 0)
+++ trunk/grub2/include/grub/i386/qemu/machine.h        2009-06-27 11:18:10 UTC 
(rev 2367)
@@ -0,0 +1,24 @@
+/*
+ *  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/>.
+ */
+
+#ifndef GRUB_MACHINE_MACHINE_HEADER
+#define GRUB_MACHINE_MACHINE_HEADER    1
+
+#define GRUB_MACHINE_QEMU      1
+
+#endif /* ! GRUB_MACHINE_MACHINE_HEADER */

Added: trunk/grub2/include/grub/i386/qemu/memory.h
===================================================================
--- trunk/grub2/include/grub/i386/qemu/memory.h                         (rev 0)
+++ trunk/grub2/include/grub/i386/qemu/memory.h 2009-06-27 11:18:10 UTC (rev 
2367)
@@ -0,0 +1,45 @@
+/* memory.h - describe the memory map */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2002,2007  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/>.
+ */
+
+#ifndef _GRUB_MEMORY_MACHINE_HEADER
+#define _GRUB_MEMORY_MACHINE_HEADER      1
+
+#include <grub/symbol.h>
+#include <grub/i386/pc/memory.h>
+
+#ifndef ASM_FILE
+#include <grub/err.h>
+#include <grub/types.h>
+#endif
+
+#define GRUB_MEMORY_MACHINE_LOWER_USABLE               0x9fc00         /* 640 
kiB - 1 kiB */
+
+#define GRUB_MEMORY_MACHINE_UPPER_START                        0x100000        
/* 1 MiB */
+#define GRUB_MEMORY_MACHINE_LOWER_SIZE                 
GRUB_MEMORY_MACHINE_UPPER_START
+
+#ifndef ASM_FILE
+
+void grub_machine_mmap_init (void);
+
+grub_err_t EXPORT_FUNC(grub_machine_mmap_iterate)
+     (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, 
grub_uint32_t));
+
+#endif
+
+#endif /* ! _GRUB_MEMORY_MACHINE_HEADER */

Added: trunk/grub2/include/grub/i386/qemu/serial.h
===================================================================
--- trunk/grub2/include/grub/i386/qemu/serial.h                         (rev 0)
+++ trunk/grub2/include/grub/i386/qemu/serial.h 2009-06-27 11:18:10 UTC (rev 
2367)
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/serial.h>

Added: trunk/grub2/include/grub/i386/qemu/time.h
===================================================================
--- trunk/grub2/include/grub/i386/qemu/time.h                           (rev 0)
+++ trunk/grub2/include/grub/i386/qemu/time.h   2009-06-27 11:18:10 UTC (rev 
2367)
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/time.h>

Modified: trunk/grub2/kern/dl.c
===================================================================
--- trunk/grub2/kern/dl.c       2009-06-27 06:10:33 UTC (rev 2366)
+++ trunk/grub2/kern/dl.c       2009-06-27 11:18:10 UTC (rev 2367)
@@ -1,7 +1,7 @@
 /* dl.c - loadable module support */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2002,2003,2004,2005,2007,2008  Free Software Foundation, Inc.
+ *  Copyright (C) 2002,2003,2004,2005,2007,2008,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
@@ -28,7 +28,13 @@
 #include <grub/file.h>
 #include <grub/env.h>
 #include <grub/cache.h>
+#include <grub/machine/machine.h>
 
+/* Platforms where modules are in a readonly area of memory.  */
+#if defined(GRUB_MACHINE_QEMU)
+#define GRUB_MODULES_MACHINE_READONLY
+#endif
+
 
 
 struct grub_dl_list
@@ -309,7 +315,13 @@
   if (i == e->e_shnum)
     return grub_error (GRUB_ERR_BAD_MODULE, "no symbol table");
 
-  sym = (Elf_Sym *) ((char *) e + s->sh_offset);
+#ifdef GRUB_MODULES_MACHINE_READONLY
+  mod->symtab = grub_malloc (s->sh_size);
+  memcpy (mod->symtab, (char *) e + s->sh_offset, s->sh_size);
+#else
+  mod->symtab = (Elf_Sym *) ((char *) e + s->sh_offset);
+#endif
+  sym = mod->symtab;
   size = s->sh_size;
   entsize = s->sh_entsize;
 
@@ -671,6 +683,9 @@
     }
 
   grub_free (mod->name);
+#ifdef GRUB_MODULES_MACHINE_READONLY
+  grub_free (mod->symtab);
+#endif
   grub_free (mod);
   return 1;
 }

Modified: trunk/grub2/kern/i386/coreboot/init.c
===================================================================
--- trunk/grub2/kern/i386/coreboot/init.c       2009-06-27 06:10:33 UTC (rev 
2366)
+++ trunk/grub2/kern/i386/coreboot/init.c       2009-06-27 11:18:10 UTC (rev 
2367)
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2002,2003,2004,2005,2006,2007,2008  Free Software 
Foundation, Inc.
+ *  Copyright (C) 2002,2003,2004,2005,2006,2007,2008,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
@@ -23,6 +23,7 @@
 #include <grub/machine/memory.h>
 #include <grub/machine/console.h>
 #include <grub/machine/kernel.h>
+#include <grub/machine/machine.h>
 #include <grub/types.h>
 #include <grub/err.h>
 #include <grub/dl.h>
@@ -144,5 +145,9 @@
 grub_addr_t
 grub_arch_modules_addr (void)
 {
+#ifdef GRUB_MACHINE_QEMU
+  return grub_core_entry_addr + grub_kernel_image_size;
+#else
   return ALIGN_UP((grub_addr_t) _end, GRUB_MOD_ALIGN);
+#endif
 }

Modified: trunk/grub2/kern/i386/dl.c
===================================================================
--- trunk/grub2/kern/i386/dl.c  2009-06-27 06:10:33 UTC (rev 2366)
+++ trunk/grub2/kern/i386/dl.c  2009-06-27 11:18:10 UTC (rev 2367)
@@ -43,7 +43,6 @@
 {
   Elf32_Ehdr *e = ehdr;
   Elf32_Shdr *s;
-  Elf32_Sym *symtab;
   Elf32_Word entsize;
   unsigned i;
 
@@ -57,7 +56,6 @@
   if (i == e->e_shnum)
     return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found");
 
-  symtab = (Elf32_Sym *) ((char *) e + s->sh_offset);
   entsize = s->sh_entsize;
 
   for (i = 0, s = (Elf32_Shdr *) ((char *) e + e->e_shoff);
@@ -89,7 +87,7 @@
                                     "reloc offset is out of the segment");
 
                addr = (Elf32_Word *) ((char *) seg->addr + rel->r_offset);
-               sym = (Elf32_Sym *) ((char *) symtab
+               sym = (Elf32_Sym *) ((char *) mod->symtab
                                     + entsize * ELF32_R_SYM (rel->r_info));
 
                switch (ELF32_R_TYPE (rel->r_info))

Added: trunk/grub2/kern/i386/qemu/mmap.c
===================================================================
--- trunk/grub2/kern/i386/qemu/mmap.c                           (rev 0)
+++ trunk/grub2/kern/i386/qemu/mmap.c   2009-06-27 11:18:10 UTC (rev 2367)
@@ -0,0 +1,74 @@
+/*
+ *  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/machine/init.h>
+#include <grub/machine/memory.h>
+#include <grub/machine/boot.h>
+#include <grub/types.h>
+#include <grub/err.h>
+#include <grub/misc.h>
+#include <grub/i386/cmos.h>
+
+#define QEMU_CMOS_MEMSIZE_HIGH         0x35
+#define QEMU_CMOS_MEMSIZE_LOW          0x34
+
+#define min(a,b)       ((a) > (b) ? (b) : (a))
+
+extern char _start[];
+extern char _end[];
+
+grub_size_t grub_lower_mem, grub_upper_mem;
+grub_uint64_t mem_size;
+
+void
+grub_machine_mmap_init ()
+{
+  mem_size = grub_cmos_read (QEMU_CMOS_MEMSIZE_HIGH) << 24 | grub_cmos_read 
(QEMU_CMOS_MEMSIZE_LOW) << 16;
+
+  /* Don't ask... */
+  mem_size += (16 * 1024 * 1024);
+}
+
+grub_err_t
+grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, 
grub_uint64_t, grub_uint32_t))
+{
+  if (hook (0x0,
+           _start,
+           GRUB_MACHINE_MEMORY_AVAILABLE))
+    return 1;
+
+  if (hook (GRUB_MEMORY_MACHINE_UPPER,
+           0x100000 - GRUB_MEMORY_MACHINE_UPPER,
+           GRUB_MACHINE_MEMORY_RESERVED))
+    return 1;
+
+  /* Protect boot.img, which contains the gdt.  It is mapped at the top of 
memory
+     (it is also mapped below 0x100000, but we already reserved that area).  */
+  if (hook ((grub_uint32_t) -GRUB_BOOT_MACHINE_SIZE,
+           GRUB_BOOT_MACHINE_SIZE,
+           GRUB_MACHINE_MEMORY_RESERVED))
+    return 1;
+
+  /* Everything else is free.  */
+  if (hook (0x100000,
+           min (mem_size, (grub_uint32_t) -GRUB_BOOT_MACHINE_SIZE) - 0x100000,
+           GRUB_MACHINE_MEMORY_AVAILABLE))
+    return 1;
+
+  return 0;
+}

Added: trunk/grub2/kern/i386/qemu/startup.S
===================================================================
--- trunk/grub2/kern/i386/qemu/startup.S                                (rev 0)
+++ trunk/grub2/kern/i386/qemu/startup.S        2009-06-27 11:18:10 UTC (rev 
2367)
@@ -0,0 +1,97 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 1999,2000,2001,2002,2003,2005,2006,2007,2008,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 <config.h>
+#include <grub/symbol.h>
+#include <grub/machine/memory.h>
+#include <grub/machine/kernel.h>
+
+       .text
+       .code32
+       .globl _start
+_start:
+       jmp     codestart
+
+       . = _start + GRUB_KERNEL_MACHINE_CORE_ENTRY_ADDR
+VARIABLE(grub_core_entry_addr)
+       .long   0
+VARIABLE(grub_kernel_image_size)
+       .long   0
+VARIABLE(grub_prefix)
+       /* to be filled by grub-mkimage */
+
+       /*
+        *  Leave some breathing room for the prefix.
+        */
+
+       . = _start + GRUB_KERNEL_MACHINE_DATA_END
+
+codestart:
+       /* Relocate to low memory.  First we figure out our location.
+          We will derive the rom start address from it.  */
+       call    1f
+1:     popl    %esi
+
+       /* Rom size is a multiple of 64 kiB.  With this we get the
+          value of `grub_core_entry_addr' in %esi.  */
+       xorw    %si, %si
+
+       /* ... which allows us to access `grub_kernel_image_size'
+          before relocation.  */
+       movl    (grub_kernel_image_size - _start)(%esi), %ecx
+
+
+       movl    $_start, %edi
+       cld
+       rep
+       movsb
+       ljmp    $GRUB_MEMORY_MACHINE_PROT_MODE_CSEG, $1f
+1:
+
+#ifdef APPLE_CC
+       /* clean out the bss */
+       bss_start_abs = ABS (bss_start)
+       bss_end_abs = ABS (bss_end)
+
+       movl    bss_start_abs, %edi
+
+       /* compute the bss length */
+       movl    bss_end_abs, %ecx
+       subl    %edi, %ecx
+#else
+       /* clean out the bss */
+       movl    $BSS_START_SYMBOL, %edi
+
+       /* compute the bss length */
+       movl    $END_SYMBOL, %ecx
+       subl    %edi, %ecx
+#endif
+                       
+       /* clean out */
+       xorl    %eax, %eax
+       cld
+       rep
+       stosb
+
+       /*
+        *  Call the start of main body of C code.
+        */
+       call    EXT_C(grub_main)
+
+       /* This should never happen.  */
+       jmp     EXT_C(grub_stop)

Modified: trunk/grub2/kern/powerpc/dl.c
===================================================================
--- trunk/grub2/kern/powerpc/dl.c       2009-06-27 06:10:33 UTC (rev 2366)
+++ trunk/grub2/kern/powerpc/dl.c       2009-06-27 11:18:10 UTC (rev 2367)
@@ -44,7 +44,6 @@
 {
   Elf32_Ehdr *e = ehdr;
   Elf32_Shdr *s;
-  Elf32_Sym *symtab;
   Elf32_Word entsize;
   unsigned i;
 
@@ -58,7 +57,6 @@
   if (i == e->e_shnum)
     return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found");
 
-  symtab = (Elf32_Sym *) ((char *) e + s->sh_offset);
   entsize = s->sh_entsize;
 
   for (i = 0, s = (Elf32_Shdr *) ((char *) e + e->e_shoff);
@@ -91,7 +89,7 @@
                                     "reloc offset is out of the segment");
 
                addr = (Elf32_Word *) ((char *) seg->addr + rel->r_offset);
-               sym = (Elf32_Sym *) ((char *) symtab
+               sym = (Elf32_Sym *) ((char *) mod->symtab
                                     + entsize * ELF32_R_SYM (rel->r_info));
 
                /* On the PPC the value does not have an explicit

Modified: trunk/grub2/kern/sparc64/dl.c
===================================================================
--- trunk/grub2/kern/sparc64/dl.c       2009-06-27 06:10:33 UTC (rev 2366)
+++ trunk/grub2/kern/sparc64/dl.c       2009-06-27 11:18:10 UTC (rev 2367)
@@ -44,7 +44,6 @@
 {
   Elf64_Ehdr *e = ehdr;
   Elf64_Shdr *s;
-  Elf64_Sym *symtab;
   Elf64_Word entsize;
   unsigned i;
 
@@ -58,7 +57,6 @@
   if (i == e->e_shnum)
     return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found");
 
-  symtab = (Elf64_Sym *) ((char *) e + s->sh_offset);
   entsize = s->sh_entsize;
 
   for (i = 0, s = (Elf64_Shdr *) ((char *) e + e->e_shoff);
@@ -91,7 +89,7 @@
                                     "reloc offset is out of the segment");
 
                addr = (Elf64_Word *) ((char *) seg->addr + rel->r_offset);
-               sym = (Elf64_Sym *) ((char *) symtab
+               sym = (Elf64_Sym *) ((char *) mod->symtab
                                     + entsize * ELF64_R_SYM (rel->r_info));
 
                value = sym->st_value + rel->r_addend;

Modified: trunk/grub2/kern/x86_64/dl.c
===================================================================
--- trunk/grub2/kern/x86_64/dl.c        2009-06-27 06:10:33 UTC (rev 2366)
+++ trunk/grub2/kern/x86_64/dl.c        2009-06-27 11:18:10 UTC (rev 2367)
@@ -43,7 +43,6 @@
 {
   Elf64_Ehdr *e = ehdr;
   Elf64_Shdr *s;
-  Elf64_Sym *symtab;
   Elf64_Word entsize;
   unsigned i;
 
@@ -57,7 +56,6 @@
   if (i == e->e_shnum)
     return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found");
 
-  symtab = (Elf64_Sym *) ((char *) e + s->sh_offset);
   entsize = s->sh_entsize;
 
   for (i = 0, s = (Elf64_Shdr *) ((char *) e + e->e_shoff);
@@ -91,7 +89,7 @@
 
                addr32 = (Elf64_Word *) ((char *) seg->addr + rel->r_offset);
                addr64 = (Elf64_Xword *) addr32;
-               sym = (Elf64_Sym *) ((char *) symtab
+               sym = (Elf64_Sym *) ((char *) mod->symtab
                                     + entsize * ELF64_R_SYM (rel->r_info));
 
                switch (ELF64_R_TYPE (rel->r_info))

Modified: trunk/grub2/util/i386/pc/grub-mkimage.c
===================================================================
--- trunk/grub2/util/i386/pc/grub-mkimage.c     2009-06-27 06:10:33 UTC (rev 
2366)
+++ trunk/grub2/util/i386/pc/grub-mkimage.c     2009-06-27 11:18:10 UTC (rev 
2367)
@@ -124,6 +124,17 @@
   *core_size += GRUB_KERNEL_MACHINE_RAW_SIZE;
 }
 
+#else
+
+static void
+compress_kernel (char *kernel_img, size_t kernel_size,
+               char **core_img, size_t *core_size)
+{
+  *core_img = xmalloc (kernel_size);
+  memcpy (*core_img, kernel_img, kernel_size);
+  *core_size = kernel_size;
+}
+
 #endif
 
 static void
@@ -237,6 +248,8 @@
   if (num > 0xffff)
     grub_util_error ("the core image is too big");
 
+#if defined(GRUB_MACHINE_PCBIOS)
+
   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)
@@ -253,13 +266,54 @@
   free (boot_img);
   free (boot_path);
 
+#elif defined(GRUB_MACHINE_QEMU)
+
+  {
+    char *rom_img;
+    size_t rom_size;
+
+    boot_path = grub_util_get_path (dir, "boot.img");
+    boot_size = grub_util_get_image_size (boot_path);
+    boot_img = grub_util_read_image (boot_path);
+
+    /* Rom sizes must be 64k-aligned.  */
+    rom_size = ALIGN_UP (core_size + boot_size, 64 * 1024);
+
+    rom_img = xmalloc (rom_size);
+    memset (rom_img, 0, rom_size);
+
+    *((grub_int32_t *) (core_img + GRUB_KERNEL_MACHINE_CORE_ENTRY_ADDR))
+      = grub_cpu_to_le32 ((grub_uint32_t) -rom_size);
+
+    memcpy (rom_img, core_img, core_size);
+
+    *((grub_int32_t *) (boot_img + GRUB_BOOT_MACHINE_CORE_ENTRY_ADDR))
+      = grub_cpu_to_le32 ((grub_uint32_t) -rom_size);
+
+    memcpy (rom_img + rom_size - boot_size, boot_img, boot_size);
+
+    free (core_img);
+    core_img = rom_img;
+    core_size = rom_size;
+
+    free (boot_img);
+    free (boot_path);
+  }
+
+#endif
+
+#ifdef GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
   *((grub_uint32_t *) (core_img + GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE))
     = grub_cpu_to_le32 (total_module_size);
+#endif
   *((grub_uint32_t *) (core_img + GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE))
     = grub_cpu_to_le32 (kernel_size);
+#ifdef GRUB_KERNEL_MACHINE_COMPRESSED_SIZE
   *((grub_uint32_t *) (core_img + GRUB_KERNEL_MACHINE_COMPRESSED_SIZE))
     = grub_cpu_to_le32 (core_size - GRUB_KERNEL_MACHINE_RAW_SIZE);
+#endif
 
+#if defined(GRUB_KERNEL_MACHINE_INSTALL_DOS_PART) && 
defined(GRUB_KERNEL_MACHINE_INSTALL_BSD_PART)
   /* If we included a drive in our prefix, let GRUB know it doesn't have to
      prepend the drive told by BIOS.  */
   if (prefix[0] == '(')
@@ -269,10 +323,13 @@
       *((grub_int32_t *) (core_img + GRUB_KERNEL_MACHINE_INSTALL_BSD_PART))
        = grub_cpu_to_le32 (-2);
     }
+#endif
 
+#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);
+#endif
 
   grub_util_write_image (core_img, core_size, out);
   free (kernel_img);





reply via email to

[Prev in Thread] Current Thread [Next in Thread]