mboot.c32: autodetect Solaris
authorH. Peter Anvin <hpa@linux.intel.com>
Mon, 3 May 2010 22:11:10 +0000 (15:11 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Mon, 3 May 2010 22:11:10 +0000 (15:11 -0700)
Autodetect Solaris kernels (based on the ELF header OSABI field) and
use the Solaris workarounds in that case.

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
com32/mboot/map.c
com32/mboot/mboot.c
com32/mboot/mboot.h
com32/mboot/solaris.c

index a32f9b3..267e50c 100644 (file)
@@ -151,6 +151,10 @@ struct multiboot_header *map_image(void *ptr, size_t len)
        !eh->e_phnum || eh->e_phoff + eh->e_phentsize * eh->e_phnum > len)
        eh = NULL;              /* No valid ELF header found */
 
+    /* Is this a Solaris kernel? */
+    if (!set.solaris && eh && kernel_is_solaris(eh))
+       opt.solaris = true;
+
     /*
      * Note: the Multiboot Specification implies that AOUT_KLUDGE should
      * have precedence over the ELF header.  However, Grub disagrees, and
index d008da0..915c785 100644 (file)
@@ -36,7 +36,7 @@
 
 struct multiboot_info mbinfo;
 struct syslinux_pm_regs regs;
-struct my_options opt;
+struct my_options opt, set;
 
 struct module_data {
     void *data;
@@ -161,11 +161,21 @@ int main(int argc, char *argv[])
     argv++;
 
     while (*argv) {
-       if (!strcmp(*argv, "-solaris"))
-           opt.solaris = true;
-       else if (!strcmp(*argv, "-aout"))
-           opt.aout = true;
-       else
+       bool v = true;
+       const char *p = *argv;
+
+       if (!memcmp(p, "-no", 3)) {
+           v = false;
+           p += 3;
+       }
+
+       if (!strcmp(p, "-solaris")) {
+           opt.solaris = v;
+           set.solaris = true;
+       } else if (!strcmp(p, "-aout")) {
+           opt.aout = v;
+           set.aout = true;
+       } else
            break;
        argv++;
     }
index 761ac87..b646cd3 100644 (file)
@@ -73,7 +73,7 @@ extern struct syslinux_pm_regs regs;
 extern struct my_options {
     bool solaris;
     bool aout;
-} opt;
+} opt, set;
 
 /* map.c */
 #define MAP_HIGH       1
@@ -91,6 +91,7 @@ void mboot_make_memmap(void);
 void mboot_apm(void);
 
 /* solaris.c */
+bool kernel_is_solaris(const Elf32_Ehdr *);
 void mboot_solaris_dhcp_hack(void);
 
 /* syslinux.c */
index 3b31660..1b153dd 100644 (file)
@@ -1,6 +1,6 @@
 /* ----------------------------------------------------------------------- *
  *
- *   Copyright 2009 Intel Corporation; author: H. Peter Anvin
+ *   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
  *
  *   Permission is hereby granted, free of charge, to any person
  *   obtaining a copy of this software and associated documentation
 
 #include "mboot.h"
 #include <syslinux/pxe.h>
+#include <syslinux/config.h>
+
+bool kernel_is_solaris(const Elf32_Ehdr *eh)
+{
+    return eh->e_ident[EI_OSABI] == 6; /* ABI == Solaris */
+}
 
 void mboot_solaris_dhcp_hack(void)
 {
     void *dhcpdata;
     size_t dhcplen;
 
+    if (syslinux_derivative_info()->c.filesystem != SYSLINUX_FS_PXELINUX)
+       return;
+    
     if (!pxe_get_cached_info(PXENV_PACKET_TYPE_DHCP_ACK, &dhcpdata, &dhcplen)) {
        mbinfo.drives_addr = map_data(dhcpdata, dhcplen, 4, 0);
        if (mbinfo.drives_addr) {