merge mainline and various cleanups
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 17 May 2011 12:02:18 +0000 (14:02 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 17 May 2011 12:02:18 +0000 (14:02 +0200)
13 files changed:
1  2 
configure.ac
gentpl.py
grub-core/Makefile.am
grub-core/Makefile.core.def
grub-core/kern/main.c
grub-core/kern/mips/cache_flush.S
grub-core/kern/mips/qemu_mips/init.c
grub-core/kern/mips/startup.S
include/grub/mips/qemu_mips/memory.h
include/grub/mips/qemu_mips/serial.h
include/grub/mips/qemu_mips/time.h
include/grub/offsets.h
util/grub-mkimage.c

diff --cc configure.ac
@@@ -122,8 -123,12 +123,13 @@@ case "$target_cpu"-"$platform" i
    i386-qemu) ;;
    powerpc-ieee1275) ;;
    sparc64-ieee1275) ;;
 -  mips-qemu-mips) ;;
+   ia64-efi) ;;
-   mips-yeeloong) ;;
 +  mips-qemu_mips) ;;
++  mips-qemu-mips) platform=qemu_mips;;
+   mips-yeeloong) platform=loongson ;;
+   mips-fuloong) platform=loongson ;;
+   mips-loongson) ;;
+   mips-arc) ;;
    *-emu) ;;
    *) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;;
  esac
@@@ -156,8 -161,9 +162,9 @@@ case "$platform" i
    qemu)               machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;;
    pc)         machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_PCBIOS=1" ;;
    emu)                machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EMU=1" ;;
-   yeeloong)   machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_YEELOONG=1 -DGRUB_MACHINE_MIPS_BONITO=1" ;;
-   qemu_mips)  machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_QEMU_MIPS=1" ;;
+   loongson)   machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_LOONGSON=1 -DGRUB_MACHINE_MIPS_BONITO=1" ;;
 -  qemu-mips)  machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_QEMU_MIPS=1 -DGRUB_MACHINE_MIPS_BONITO=1" ;;
 -  mips-arc)   machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_ARC=1 -DGRUB_MACHINE_ARC=1" ;;
++  qemu_mips)  machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_QEMU_MIPS=1 -DGRUB_MACHINE_MIPS_BONITO=1" ;;
++  arc)        machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_ARC=1" ;;
  esac
  case "$target_cpu" in
    mips)       machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS=1" ;;
diff --cc gentpl.py
+++ b/gentpl.py
@@@ -6,8 -6,8 +6,9 @@@
  
  GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot",
                     "i386_multiboot", "i386_ieee1275", "x86_64_efi",
-                    "mips_yeeloong", "mips_qemu_mips", "sparc64_ieee1275",
-                    "powerpc_ieee1275" ]
+                    "mips_loongson", "sparc64_ieee1275",
 -                   "powerpc_ieee1275", "mips_arc", "ia64_efi" ]
++                   "powerpc_ieee1275", "mips_arc", "ia64_efi",
++                   "mips_qemu_mips" ]
  
  GROUPS = {}
  
@@@ -17,7 -17,7 +18,7 @@@ GROUPS["common"]   = GRUB_PLATFORMS[:
  GROUPS["i386"]     = [ "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", "i386_multiboot", "i386_ieee1275" ]
  GROUPS["x86_64"]   = [ "x86_64_efi" ]
  GROUPS["x86"]      = GROUPS["i386"] + GROUPS["x86_64"]
- GROUPS["mips"]     = [ "mips_yeeloong", "mips_qemu_mips" ]
 -GROUPS["mips"]     = [ "mips_loongson", "mips_arc" ]
++GROUPS["mips"]     = [ "mips_loongson", "mips_qemu_mips", "mips_arc" ]
  GROUPS["sparc64"]  = [ "sparc64_ieee1275" ]
  GROUPS["powerpc"]  = [ "powerpc_ieee1275" ]
  
@@@ -29,8 -29,8 +30,8 @@@ GROUPS["ieee1275"]   = [ "i386_ieee1275
  GROUPS["noemu"]   = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu")
  
  # Groups based on hardware features
- GROUPS["cmos"] = GROUPS["x86"][:] + ["mips_yeeloong", "mips_qemu_mips" ]; GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi")
- GROUPS["pci"]      = GROUPS["x86"] + ["mips_yeeloong"]
 -GROUPS["cmos"] = GROUPS["x86"][:] + ["mips_loongson"]; GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi")
++GROUPS["cmos"] = GROUPS["x86"][:] + ["mips_loongson", "mips_qemu_mips"]; GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi")
+ GROUPS["pci"]      = GROUPS["x86"] + ["mips_loongson"]
  GROUPS["usb"]      = GROUPS["pci"]
  
  # If gfxterm is main output console integrate it into kernel
@@@ -39,7 -39,7 +40,7 @@@ GROUPS["videomodules"]   = GRUB_PLATFOR
  for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i)
  
  # Similar for terminfo
- GROUPS["terminfoinkernel"] = ["mips_yeeloong"] + GROUPS["ieee1275"];
 -GROUPS["terminfoinkernel"] = ["mips_loongson", "mips_arc"] + GROUPS["ieee1275"];
++GROUPS["terminfoinkernel"] = ["mips_loongson", "mips_arc", "mips_qemu_mips" ] + GROUPS["ieee1275"];
  GROUPS["terminfomodule"]   = GRUB_PLATFORMS[:];
  for i in GROUPS["terminfoinkernel"]: GROUPS["terminfomodule"].remove(i)
  
@@@ -125,7 -125,22 +125,26 @@@ KERNEL_HEADER_FILES += $(top_srcdir)/in
  KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pit.h
  endif
  
- if COND_mips_yeeloong
+ if COND_ia64_efi
+ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
+ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/time.h
+ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
+ endif
+ if COND_mips
+ KERNEL_HEADER_FILES += $(top_builddir)/include/grub/cpu/kernel.h
+ endif
+ if COND_mips_arc
+ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
+ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arc/arc.h
+ endif
++if COND_mips_qemu_mips
++KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
++endif
++
+ if COND_mips_loongson
  KERNEL_HEADER_FILES += $(top_builddir)/include/grub/keyboard_layouts.h
  KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
  KERNEL_HEADER_FILES += $(top_builddir)/include/grub/cpu/cache.h
@@@ -32,11 -38,12 +38,13 @@@ kernel = 
    i386_coreboot_ldflags    = '-Wl,-Ttext=0x8200';
    i386_multiboot_ldflags   = '-Wl,-Ttext=0x8200';
    i386_ieee1275_ldflags    = '-Wl,-Ttext=0x10000';
-   mips_yeeloong_ldflags    = '-Wl,-Ttext,0x80200000';
+   mips_loongson_ldflags    = '-Wl,-Ttext,0x80200000';
    powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000';
    sparc64_ieee1275_ldflags = '-Wl,-Ttext,0x4400';
+   mips_arc_ldflags    = '-Wl,-Ttext,0x8a000000';
++  mips_qemu_mips_ldflags    = '-Wl,-Ttext,0x80200000';
  
-   mips_yeeloong_cppflags = '-DUSE_ASCII_FAILBACK';
+   mips_loongson_cppflags = '-DUSE_ASCII_FAILBACK';
    i386_qemu_cppflags     = '-DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)';
    emu_cflags = '$(CFLAGS_GNULIB)';
    emu_cppflags = '$(CPPFLAGS_GNULIB)';
    mips = kern/mips/cache.S;
    mips = kern/mips/dl.c;
    mips = kern/mips/init.c;
-   mips_yeeloong = kern/mips/yeeloong/init.c;
-   mips_qemu_mips = kern/mips/qemu-mips/init.c;
-   mips_yeeloong = term/at_keyboard.c;
-   mips_yeeloong = term/serial.c;
-   mips_yeeloong = video/sm712.c;
++  mips_qemu_mips = kern/mips/qemu_mips/init.c;
++  mips_qemu_mips = term/ns8250.c;
++  mips_qemu_mips = term/serial.c;
++
+   mips_arc = kern/mips/arc/init.c;
+   mips_arc = term/arc/console.c;
+   mips_arc = disk/arc/arcdisk.c;
+   mips_loongson = term/ns8250.c;
+   mips_loongson = bus/bonito.c;
+   mips_loongson = bus/cs5536.c;
+   mips_loongson = bus/pci.c;
+   mips_loongson = kern/mips/loongson/init.c;
+   mips_loongson = term/at_keyboard.c;
+   mips_loongson = term/serial.c;
+   mips_loongson = video/sm712.c;
+   mips_loongson = video/sis315pro.c;
    extra_dist = video/sm712_init.c;
-   mips_yeeloong = commands/keylayouts.c;
+   mips_loongson = commands/keylayouts.c;
  
    powerpc_ieee1275 = kern/ieee1275/init.c;
    powerpc_ieee1275 = kern/powerpc/cache.S;
@@@ -297,12 -314,11 +319,12 @@@ image = 
    common = lib/xzembed/xz_dec_lzma2.c;
    common = lib/xzembed/xz_dec_stream.c;
  
-   cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/xzembed';
-   mips_cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/xzembed -DGRUB_EMBED_DECOMPRESSOR=1 -DGRUB_MACHINE_LINK_ADDR=0x80200000';
+   cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/xzembed -DGRUB_EMBED_DECOMPRESSOR=1';
  
    objcopyflags = '-O binary';
-   ldflags = '-static-libgcc -Wl,-Ttext,0x80100000';
+   mips_loongson_ldflags = '-static-libgcc -Wl,-Ttext,0x80100000';
++  mips_qemu_mips_ldflags = '-static-libgcc -Wl,-Ttext,0x80100000';
+   mips_arc_ldflags = '-static-libgcc -Wl,-Ttext,0x89f00000';
    ldadd = '-lgcc';
    cflags = '-static-libgcc';
    enable = mips;
@@@ -313,10 -329,11 +335,12 @@@ image = 
    mips = boot/mips/startup_raw.S;
    common = boot/decompressor/none.c;
  
-   mips_cppflags = '-DGRUB_EMBED_DECOMPRESSOR=1 -DGRUB_MACHINE_LINK_ADDR=0x80200000';
+   cppflags = '-DGRUB_EMBED_DECOMPRESSOR=1';
  
    objcopyflags = '-O binary';
-   ldflags = '-static-libgcc -Wl,-Ttext,0x80100000';
+   mips_loongson_ldflags = '-static-libgcc -Wl,-Ttext,0x80100000';
++  mips_qemu_mips_ldflags = '-static-libgcc -Wl,-Ttext,0x80100000';
+   mips_arc_ldflags = '-static-libgcc -Wl,-Ttext,0x89f00000';
    ldadd = '-lgcc';
    cflags = '-static-libgcc';
    enable = mips;
@@@ -53,8 -53,8 +53,8 @@@ grub_module_iterate (int (*hook) (struc
      }
  }
  
- /* This is actualy platform-independant but used only on yeeloong and sparc.  */
- #if defined (GRUB_MACHINE_MIPS_YEELOONG) || defined (GRUB_MACHINE_SPARC64)
+ /* This is actualy platform-independant but used only on loongson and sparc.  */
 -#if defined (GRUB_MACHINE_MIPS_LOONGSON) || defined (GRUB_MACHINE_SPARC64)
++#if defined (GRUB_MACHINE_MIPS_LOONGSON) || defined (GRUB_MACHINE_MIPS_QEMU_MIPS) || defined (GRUB_MACHINE_SPARC64)
  grub_addr_t
  grub_modules_get_end (void)
  {
@@@ -20,8 -17,7 +20,8 @@@
        subu $t1, $t3, $t2
  2:
        cache 0, 0($t0)
-       addiu $t1, $t1, 0xffff
+       addiu $t1, $t1, -0x4
        bne $t1, $zero, 2b
-        addiu $t0, $t0, 0x1
+        addiu $t0, $t0, 0x4
        sync
 +#endif
@@@ -6,24 -6,25 +6,31 @@@
  #include <grub/misc.h>
  #include <grub/mm.h>
  #include <grub/time.h>
 -#include <grub/machine/kernel.h>
  #include <grub/machine/memory.h>
 -#include <grub/cpu/kernel.h>
++#include <grub/cpu/memory.h>
 +#include <grub/memory.h>
  
  #define RAMSIZE (*(grub_uint32_t *) ((16 << 20) - 264))
  
--grub_uint32_t
--grub_get_rtc (void)
--{
--  static int calln = 0;
--  return calln++;
--}
++extern void grub_serial_init (void);
++extern void grub_terminfo_init (void);
  
  void
  grub_machine_init (void)
  {
--  grub_mm_init_region ((void *) GRUB_MACHINE_MEMORY_USABLE,
--                     RAMSIZE - (GRUB_MACHINE_MEMORY_USABLE & 0x7fffffff));
++  grub_addr_t modend;
++
++  /* FIXME: measure this.  */
++  grub_arch_cpuclock = 64000000;
++
++  modend = grub_modules_get_end ();
++  grub_mm_init_region ((void *) modend, RAMSIZE
++                     - (modend - GRUB_ARCH_LOWMEMVSTART));
++
    grub_install_get_time_ms (grub_rtc_get_time_ms);
++
++  grub_terminfo_init ();
++  grub_serial_init ();
  }
  
  void
@@@ -35,7 -36,7 +36,7 @@@ start
        bal cont
         nop
  
-       . = _start + GRUB_KERNEL_MIPS_YEELOONG_TOTAL_MODULE_SIZE
 -      . = _start + GRUB_KERNEL_MIPS_LOONGSON_TOTAL_MODULE_SIZE
++      . = _start + GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
  total_module_size:
        .long 0
  
  #define GRUB_MACHINE_MEMORY_STACK_HIGH       0x80f00000
  #define GRUB_MACHINE_MEMORY_USABLE       0x81000000
  
- #define GRUB_MACHINE_MEMORY_AVAILABLE        1
- #define GRUB_MACHINE_MEMORY_MAX_TYPE         1
-   /* This one is special: it's used internally but is never reported
-      by firmware. */
- #define GRUB_MACHINE_MEMORY_HOLE      2
- #define GRUB_MACHINE_MEMORY_RESERVED GRUB_MACHINE_MEMORY_HOLE
  #ifndef ASM_FILE
- typedef grub_addr_t grub_phys_addr_t;
- static inline grub_phys_addr_t
- grub_vtop (void *a)
- {
-   return ((grub_phys_addr_t) a) & 0x1fffffff;
- }
- static inline void *
- grub_map_memory (grub_phys_addr_t a, grub_size_t size __attribute__ ((unused)))
- {
-   return (void *) (a | 0x80000000);
- }
- static inline void
- grub_unmap_memory (void *a __attribute__ ((unused)),
-                  grub_size_t size __attribute__ ((unused)))
- {
- }
--grub_err_t EXPORT_FUNC (grub_machine_mmap_iterate)
--(int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t));
 -grub_err_t EXPORT_FUNC(grub_machine_mmap_iterate)
 -     (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t));
--
  static inline grub_err_t
  grub_machine_mmap_register (grub_uint64_t start __attribute__ ((unused)),
                            grub_uint64_t size __attribute__ ((unused)),
@@@ -19,6 -19,6 +19,6 @@@
  #ifndef GRUB_MACHINE_SERIAL_HEADER
  #define GRUB_MACHINE_SERIAL_HEADER    1
  
--#define GRUB_MACHINE_SERIAL_PORTS { 0x140003f8 }
++#define GRUB_MACHINE_SERIAL_PORTS { 0xb40003f8 }
  
  #endif 
  #define KERNEL_MACHINE_TIME_HEADER    1
  
  #include <grub/symbol.h>
--
--#define GRUB_TICKS_PER_SECOND 1000
--
--/* Return the real time in ticks.  */
--grub_uint32_t EXPORT_FUNC (grub_get_rtc) (void);
--
--static inline void
--grub_cpu_idle(void)
--{
--}
++#include <grub/cpu/time.h>
  
  #endif /* ! KERNEL_MACHINE_TIME_HEADER */
  #define GRUB_KERNEL_POWERPC_IEEE1275_LINK_ALIGN 4
  #define GRUB_KERNEL_POWERPC_IEEE1275_LINK_ADDR 0x200000
  
- #define GRUB_KERNEL_MIPS_YEELOONG_LINK_ADDR         0x80200000
+ #define GRUB_KERNEL_MIPS_LOONGSON_LINK_ADDR         0x80200000
  
- #define GRUB_KERNEL_MIPS_YEELOONG_LINK_ALIGN  32
+ #define GRUB_KERNEL_MIPS_LOONGSON_LINK_ALIGN  32
  
- #define GRUB_KERNEL_MIPS_COMPRESSED_SIZE          0x8
- #define GRUB_KERNEL_MIPS_UNCOMPRESSED_SIZE        0xc
+ #define GRUB_KERNEL_MIPS_LOONGSON_COMPRESSED_SIZE          0x8
+ #define GRUB_KERNEL_MIPS_LOONGSON_UNCOMPRESSED_SIZE        0xc
  
- #define GRUB_KERNEL_MIPS_YEELOONG_COMPRESSED_SIZE          GRUB_KERNEL_MIPS_COMPRESSED_SIZE
- #define GRUB_KERNEL_MIPS_YEELOONG_UNCOMPRESSED_SIZE        GRUB_KERNEL_MIPS_UNCOMPRESSED_SIZE
+ #define GRUB_KERNEL_MIPS_LOONGSON_TOTAL_MODULE_SIZE   0x08
+ #define GRUB_KERNEL_MIPS_LOONGSON_PREFIX              0x0c
+ #define GRUB_KERNEL_MIPS_LOONGSON_PREFIX_END          0x54
  
- #define GRUB_KERNEL_MIPS_QEMU_MIPS_COMPRESSED_SIZE          GRUB_KERNEL_MIPS_COMPRESSED_SIZE
- #define GRUB_KERNEL_MIPS_QEMU_MIPS_UNCOMPRESSED_SIZE        GRUB_KERNEL_MIPS_UNCOMPRESSED_SIZE
++#define GRUB_KERNEL_MIPS_QEMU_MIPS_LINK_ADDR         0x80200000
++#define GRUB_KERNEL_MIPS_QEMU_MIPS_LINK_ALIGN  32
++#define GRUB_KERNEL_MIPS_QEMU_MIPS_COMPRESSED_SIZE          0x8
++#define GRUB_KERNEL_MIPS_QEMU_MIPS_UNCOMPRESSED_SIZE        0xc
++#define GRUB_KERNEL_MIPS_QEMU_MIPS_TOTAL_MODULE_SIZE  0x08
++#define GRUB_KERNEL_MIPS_QEMU_MIPS_PREFIX             0x0c
++#define GRUB_KERNEL_MIPS_QEMU_MIPS_PREFIX_END         0x54
 +
- #define GRUB_KERNEL_MIPS_TOTAL_MODULE_SIZE    0x08
- #define GRUB_KERNEL_MIPS_PREFIX               0x0c
- #define GRUB_KERNEL_MIPS_PREFIX_END           0x54
+ #define GRUB_KERNEL_MIPS_ARC_LINK_ADDR         0x8a000000
  
- #define GRUB_KERNEL_MIPS_YEELOONG_TOTAL_MODULE_SIZE   GRUB_KERNEL_MIPS_TOTAL_MODULE_SIZE
- #define GRUB_KERNEL_MIPS_YEELOONG_PREFIX              GRUB_KERNEL_MIPS_PREFIX
- #define GRUB_KERNEL_MIPS_YEELOONG_PREFIX_END          GRUB_KERNEL_MIPS_PREFIX_END
+ #define GRUB_KERNEL_MIPS_ARC_LINK_ALIGN  32
  
- #define GRUB_KERNEL_MIPS_QEMU_MIPS_TOTAL_MODULE_SIZE  GRUB_KERNEL_MIPS_TOTAL_MODULE_SIZE
- #define GRUB_KERNEL_MIPS_QEMU_MIPS_PREFIX             GRUB_KERNEL_MIPS_PREFIX
- #define GRUB_KERNEL_MIPS_QEMU_MIPS_PREFIX_END         GRUB_KERNEL_MIPS_PREFIX_END
+ #define GRUB_KERNEL_MIPS_ARC_COMPRESSED_SIZE          0x8
+ #define GRUB_KERNEL_MIPS_ARC_UNCOMPRESSED_SIZE        0xc
+ #define GRUB_KERNEL_MIPS_ARC_TOTAL_MODULE_SIZE        0x08
+ #define GRUB_KERNEL_MIPS_ARC_PREFIX           0x0c
+ #define GRUB_KERNEL_MIPS_ARC_PREFIX_END               0x54
  
  /* The offset of GRUB_PREFIX.  */
  #define GRUB_KERNEL_I386_EFI_PREFIX           0x8
  
  #define GRUB_KERNEL_POWERPC_IEEE1275_MOD_ALIGN 0x1000
  
- #define GRUB_KERNEL_MIPS_MOD_ALIGN 0x1
- #define GRUB_KERNEL_MIPS_YEELOONG_MOD_ALIGN GRUB_KERNEL_MIPS_MOD_ALIGN
- #define GRUB_KERNEL_MIPS_QEMU_MIPS_MOD_ALIGN GRUB_KERNEL_MIPS_MOD_ALIGN
+ #define GRUB_KERNEL_MIPS_LOONGSON_MOD_ALIGN 0x1
+ #define GRUB_KERNEL_MIPS_ARC_MOD_ALIGN 0x1
++#define GRUB_KERNEL_MIPS_QEMU_MIPS_MOD_ALIGN 0x1
  
  /* Minimal gap between _end and the start of the modules.  It's a hack
     for PowerMac to prevent "CLAIM failed" error.  The real fix is to
@@@ -354,6 -400,48 +400,70 @@@ struct image_target_desc image_targets[
        .install_bsd_part = TARGET_NO_FIELD,
        .link_addr = GRUB_KERNEL_SPARC64_IEEE1275_LINK_ADDR
      },
+     {
+       .dirname = "ia64-efi",
+       .names = {"ia64-efi", NULL},
+       .voidp_sizeof = 8,
+       .bigendian = 0, 
+       .id = IMAGE_EFI, 
+       .flags = PLATFORM_FLAGS_NONE,
+       .prefix = GRUB_KERNEL_IA64_EFI_PREFIX,
+       .prefix_end = GRUB_KERNEL_IA64_EFI_PREFIX_END,
+       .raw_size = 0,
+       .total_module_size = TARGET_NO_FIELD,
+       .kernel_image_size = TARGET_NO_FIELD,
+       .compressed_size = TARGET_NO_FIELD,
+       .section_align = GRUB_PE32_SECTION_ALIGNMENT,
+       .vaddr_offset = EFI64_HEADER_SIZE,
+       .install_dos_part = TARGET_NO_FIELD,
+       .install_bsd_part = TARGET_NO_FIELD,
+       .pe_target = GRUB_PE32_MACHINE_IA64,
+       .elf_target = EM_IA_64,
+     },
+     {
+       .dirname = "mips-arc",
+       .names = {"mips-arc", NULL},
+       .voidp_sizeof = 4,
+       .bigendian = 1,
+       .id = IMAGE_MIPS_ARC, 
+       .flags = PLATFORM_FLAGS_DECOMPRESSORS,
+       .prefix = GRUB_KERNEL_MIPS_ARC_PREFIX,
+       .prefix_end = GRUB_KERNEL_MIPS_ARC_PREFIX_END,
+       .raw_size = 0,
+       .total_module_size = GRUB_KERNEL_MIPS_ARC_TOTAL_MODULE_SIZE,
+       .compressed_size = TARGET_NO_FIELD,
+       .kernel_image_size = TARGET_NO_FIELD,
+       .section_align = 1,
+       .vaddr_offset = 0,
+       .install_dos_part = TARGET_NO_FIELD,
+       .install_bsd_part = TARGET_NO_FIELD,
+       .link_addr = GRUB_KERNEL_MIPS_ARC_LINK_ADDR,
+       .elf_target = EM_MIPS,
+       .link_align = GRUB_KERNEL_MIPS_ARC_LINK_ALIGN,
+       .default_compression = COMPRESSION_NONE
+     },
++    {
++      .dirname = "mips-qemu_mips",
++      .names = { "mips-qemu_mips-elf", NULL },
++      .voidp_sizeof = 4,
++      .bigendian = 0,
++      .id = IMAGE_LOONGSON_ELF, 
++      .flags = PLATFORM_FLAGS_DECOMPRESSORS,
++      .prefix = GRUB_KERNEL_MIPS_QEMU_MIPS_PREFIX,
++      .prefix_end = GRUB_KERNEL_MIPS_QEMU_MIPS_PREFIX_END,
++      .raw_size = 0,
++      .total_module_size = GRUB_KERNEL_MIPS_QEMU_MIPS_TOTAL_MODULE_SIZE,
++      .compressed_size = TARGET_NO_FIELD,
++      .kernel_image_size = TARGET_NO_FIELD,
++      .section_align = 1,
++      .vaddr_offset = 0,
++      .install_dos_part = TARGET_NO_FIELD,
++      .install_bsd_part = TARGET_NO_FIELD,
++      .link_addr = GRUB_KERNEL_MIPS_QEMU_MIPS_LINK_ADDR,
++      .elf_target = EM_MIPS,
++      .link_align = GRUB_KERNEL_MIPS_QEMU_MIPS_LINK_ALIGN,
++      .default_compression = COMPRESSION_NONE
++    },
    };
  
  #define grub_target_to_host32(x) (grub_target_to_host32_real (image_target, (x)))