[syslinux:master] mboot.c32: autodetect Solaris

syslinux-bot for H. Peter Anvin hpa at linux.intel.com
Mon May 3 15:15:12 PDT 2010


Commit-ID:  c2bd46bfc2eddc9bea70edadd203b257527e3583
Gitweb:     http://syslinux.zytor.com/commit/c2bd46bfc2eddc9bea70edadd203b257527e3583
Author:     H. Peter Anvin <hpa at linux.intel.com>
AuthorDate: Mon, 3 May 2010 15:11:10 -0700
Committer:  H. Peter Anvin <hpa at linux.intel.com>
CommitDate: Mon, 3 May 2010 15:11:10 -0700

mboot.c32: autodetect Solaris

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 at linux.intel.com>


---
 com32/mboot/map.c     |    4 ++++
 com32/mboot/mboot.c   |   22 ++++++++++++++++------
 com32/mboot/mboot.h   |    3 ++-
 com32/mboot/solaris.c |   11 ++++++++++-
 4 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/com32/mboot/map.c b/com32/mboot/map.c
index a32f9b3..267e50c 100644
--- a/com32/mboot/map.c
+++ b/com32/mboot/map.c
@@ -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
diff --git a/com32/mboot/mboot.c b/com32/mboot/mboot.c
index d008da0..915c785 100644
--- a/com32/mboot/mboot.c
+++ b/com32/mboot/mboot.c
@@ -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++;
     }
diff --git a/com32/mboot/mboot.h b/com32/mboot/mboot.h
index 761ac87..b646cd3 100644
--- a/com32/mboot/mboot.h
+++ b/com32/mboot/mboot.h
@@ -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 */
diff --git a/com32/mboot/solaris.c b/com32/mboot/solaris.c
index 3b31660..1b153dd 100644
--- a/com32/mboot/solaris.c
+++ b/com32/mboot/solaris.c
@@ -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
@@ -35,12 +35,21 @@
 
 #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) {



More information about the Syslinux-commits mailing list