All of lore.kernel.org
 help / color / mirror / Atom feed
* Patch - loader for plan9's a.out format.
@ 2005-06-24  1:23 Tim Newsham
  2005-06-24  9:38 ` Keir Fraser
  2005-06-25 22:59 ` David Hopwood
  0 siblings, 2 replies; 7+ messages in thread
From: Tim Newsham @ 2005-06-24  1:23 UTC (permalink / raw)
  To: xen-devel

The set of patches below add support for loading plan9's a.out
format using the linux builder.  This is considerably simpler
than having a seperate builder, shares more code and should
be easier to maintain.  Hopefully the original plan9 builder
can go away in the future.

I've been able to test this manually with vm-tools but am
still having some problems (unrelated I think) with xm.

Tim Newsham
http://www.lava.net/~newsham/


diff -Nurp libxc.orig/Makefile libxc/Makefile
--- libxc.orig/Makefile	2005-06-22 13:34:23.000000000 -1000
+++ libxc/Makefile	2005-06-23 15:13:04.000000000 -1000
@@ -19,6 +19,7 @@ SRCS     += xc_core.c
  SRCS     += xc_domain.c
  SRCS     += xc_evtchn.c
  SRCS     += xc_gnttab.c
+SRCS     += xc_load_aout9.c
  SRCS     += xc_load_bin.c
  SRCS     += xc_load_elf.c
  SRCS     += xc_linux_build.c
diff -Nurp libxc.orig/xc_aout9.h libxc/xc_aout9.h
--- libxc.orig/xc_aout9.h	1969-12-31 14:00:00.000000000 -1000
+++ libxc/xc_aout9.h	2005-06-22 13:46:24.000000000 -1000
@@ -0,0 +1,30 @@
+
+typedef struct	Exec
+{
+	long	magic;		/* magic number */
+	long	text;	 	/* size of text segment */
+	long	data;	 	/* size of initialized data */
+	long	bss;	  	/* size of uninitialized data */
+	long	syms;	 	/* size of symbol table */
+	long	entry;	 	/* entry point */
+	long	spsz;		/* size of pc/sp offset table */
+	long	pcsz;		/* size of pc/line number table */
+} Exec;
+
+#define	_MAGIC(b)	((((4*b)+0)*b)+7)
+#define	A_MAGIC		_MAGIC(8)	/* 68020 */
+#define	I_MAGIC		_MAGIC(11)	/* intel 386 */
+#define	J_MAGIC		_MAGIC(12)	/* intel 960 (retired) */
+#define	K_MAGIC		_MAGIC(13)	/* sparc */
+#define	V_MAGIC		_MAGIC(16)	/* mips 3000 BE */
+#define	X_MAGIC		_MAGIC(17)	/* att dsp 3210 (retired) */
+#define	M_MAGIC		_MAGIC(18)	/* mips 4000 BE */
+#define	D_MAGIC		_MAGIC(19)	/* amd 29000 (retired) */
+#define	E_MAGIC		_MAGIC(20)	/* arm */
+#define	Q_MAGIC		_MAGIC(21)	/* powerpc */
+#define	N_MAGIC		_MAGIC(22)	/* mips 4000 LE */
+#define	L_MAGIC		_MAGIC(23)	/* dec alpha */
+#define	P_MAGIC		_MAGIC(24)	/* mips 3000 LE */
+#define	U_MAGIC		_MAGIC(25)	/* sparc64 */
+#define	S_MAGIC		_MAGIC(26)	/* amd64 */
+
diff -Nurp libxc.orig/xc_linux_build.c libxc/xc_linux_build.c
--- libxc.orig/xc_linux_build.c	2005-06-22 13:34:22.000000000 -1000
+++ libxc/xc_linux_build.c	2005-06-23 15:12:48.000000000 -1000
@@ -14,6 +14,7 @@


  #include "xc_elf.h"
+#include "xc_aout9.h"
  #include <stdlib.h>
  #include <zlib.h>

@@ -38,7 +39,8 @@ static int probeimageformat(char *image,
                              struct load_funcs *load_funcs)
  {
      if ( probe_elf(image, image_size, load_funcs) &&
-         probe_bin(image, image_size, load_funcs) )
+         probe_bin(image, image_size, load_funcs) &&
+	 probe_aout9(image, image_size, load_funcs) )
      {
          ERROR( "Unrecognized image format" );
          return -EINVAL;
diff -Nurp libxc.orig/xc_load_aout9.c libxc/xc_load_aout9.c
--- libxc.orig/xc_load_aout9.c	1969-12-31 14:00:00.000000000 -1000
+++ libxc/xc_load_aout9.c	2005-06-23 04:32:36.000000000 -1000
@@ -0,0 +1,166 @@
+
+#include "xc_private.h"
+#include "xc_aout9.h"
+
+#if defined(__i386__)
+  #define A9_MAGIC I_MAGIC
+#elif defined(__x86_64__)
+  #define A9_MAGIC S_MAGIC
+#elif defined(__ia64__)
+  #define A9_MAGIC 0
+#else
+#error "Unsupported architecture"
+#endif
+
+
+#define round_pgup(_p)    (((_p)+(PAGE_SIZE-1))&PAGE_MASK)
+#define round_pgdown(_p)  ((_p)&PAGE_MASK)
+
+static int parseaout9image(char *, unsigned long, struct domain_setup_info *);
+static int loadaout9image(char *, unsigned long, int, u32, unsigned long *, struct domain_setup_info *);
+static void copyout(int, u32, unsigned long *, unsigned long, void *, int);
+struct Exec *get_header(unsigned char *, unsigned long, struct Exec *);
+
+
+int 
+probe_aout9(
+    char *image,
+    unsigned long image_size,
+    struct load_funcs *load_funcs)
+{
+    struct Exec ehdr;
+
+    if (!get_header(image, image_size, &ehdr)) {
+        ERROR("Kernel image does not have a a.out9 header.");
+        return -EINVAL;
+    }
+
+    load_funcs->parseimage = parseaout9image;
+    load_funcs->loadimage = loadaout9image;
+    return 0;
+}
+
+static int 
+parseaout9image(
+    char *image,
+    unsigned long image_size,
+    struct domain_setup_info *dsi)
+{
+    struct Exec ehdr;
+    unsigned long start, txtsz, end;
+
+    if (!get_header(image, image_size, &ehdr)) {
+        ERROR("Kernel image does not have a a.out9 header.");
+        return -EINVAL;
+    }
+
+    if (sizeof ehdr + ehdr.text + ehdr.data > image_size) {
+        ERROR("a.out program extends past end of image.");
+        return -EINVAL;
+    }
+
+    start = round_pgdown(ehdr.entry);
+    txtsz = round_pgup(ehdr.text);
+    end = start + txtsz + ehdr.data + ehdr.bss;
+
+    dsi->v_start	= start;
+    dsi->v_kernstart	= start;
+    dsi->v_kernend	= end;
+    dsi->v_kernentry	= ehdr.entry;
+    dsi->v_end		= end;
+
+    /* XXX load symbols */
+
+    return 0;
+}
+
+static int 
+loadaout9image(
+    char *image,
+    unsigned long image_size,
+    int xch, u32 dom,
+    unsigned long *parray,
+    struct domain_setup_info *dsi)
+{
+    struct Exec ehdr;
+    unsigned long txtsz;
+
+    if (!get_header(image, image_size, &ehdr)) {
+        ERROR("Kernel image does not have a a.out9 header.");
+        return -EINVAL;
+    }
+
+    txtsz = round_pgup(ehdr.text);
+    copyout(xch, dom, parray, 
+            0, image, sizeof ehdr + ehdr.text);
+    copyout(xch, dom, parray, 
+            txtsz, image + sizeof ehdr + ehdr.text, ehdr.data);
+    /* XXX zeroing of BSS needed? */
+
+    /* XXX load symbols */
+
+    return 0;
+}
+
+/*
+ * copyout data to the domain given an offset to the start
+ * of its memory region described by parray.
+ */
+static void
+copyout(
+    int xch, u32 dom,
+    unsigned long *parray,
+    unsigned long off,
+    void *buf,
+    int sz)
+{
+    unsigned long pgoff, chunksz;
+    void *pg;
+
+    while (sz > 0) {
+        pgoff = off & (PAGE_SIZE-1);
+        chunksz = sz;
+        if(chunksz > PAGE_SIZE - pgoff)
+            chunksz = PAGE_SIZE - pgoff;
+
+        pg = xc_map_foreign_range(xch, dom, PAGE_SIZE, PROT_WRITE, 
+                                  parray[off>>PAGE_SHIFT]);
+        memcpy(pg + pgoff, buf, chunksz);
+        munmap(pg, PAGE_SIZE);
+
+        off += chunksz;
+        buf += chunksz;
+        sz -= chunksz;
+    }
+}
+ 
+/*
+ * Decode the header from the start of image and return it.
+ */
+struct Exec *
+get_header(
+    unsigned char *image,
+    unsigned long image_size,
+    struct Exec *ehdr)
+{
+    unsigned long *v;
+    int i;
+
+    if (A9_MAGIC == 0)
+        return 0;
+
+    if (image_size < sizeof ehdr)
+        return 0;
+
+    /* ... all big endian words */
+    v = (unsigned long *)ehdr;
+    for (i = 0; i < sizeof *ehdr; i += 4) {
+        v[i/4] = (image[i+0]<<24) | (image[i+1]<<16) | 
+                 (image[i+2]<<8) | image[i+3];
+    }
+
+    if(ehdr->magic != A9_MAGIC)
+        return 0;
+    return ehdr;
+}
+
diff -Nurp libxc.orig/xc_private.h libxc/xc_private.h
--- libxc.orig/xc_private.h	2005-06-22 13:34:22.000000000 -1000
+++ libxc/xc_private.h	2005-06-22 15:30:42.000000000 -1000
@@ -304,5 +304,6 @@ int pin_table(int xc_handle, unsigned in
  /* image loading */
  int probe_elf(char *image, unsigned long image_size, struct load_funcs *funcs);
  int probe_bin(char *image, unsigned long image_size, struct load_funcs *funcs);
+int probe_aout9(char *image, unsigned long image_size, struct load_funcs *funcs);

  #endif /* __XC_PRIVATE_H__ */

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Patch - loader for plan9's a.out format.
  2005-06-24  1:23 Patch - loader for plan9's a.out format Tim Newsham
@ 2005-06-24  9:38 ` Keir Fraser
  2005-06-25 22:59 ` David Hopwood
  1 sibling, 0 replies; 7+ messages in thread
From: Keir Fraser @ 2005-06-24  9:38 UTC (permalink / raw)
  To: Tim Newsham; +Cc: xen-devel


On 24 Jun 2005, at 02:23, Tim Newsham wrote:

> The set of patches below add support for loading plan9's a.out
> format using the linux builder.  This is considerably simpler
> than having a seperate builder, shares more code and should
> be easier to maintain.  Hopefully the original plan9 builder
> can go away in the future.
>
> I've been able to test this manually with vm-tools but am
> still having some problems (unrelated I think) with xm.

Good patch, but I'd like to kill off the original plan9 builder at the 
same time we check this in. Also, the patch does not apply cleanly 
against current head of repository.

  -- Keir

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Patch - loader for plan9's a.out format.
  2005-06-24  1:23 Patch - loader for plan9's a.out format Tim Newsham
  2005-06-24  9:38 ` Keir Fraser
@ 2005-06-25 22:59 ` David Hopwood
  2005-06-25 23:24   ` Kip Macy
  1 sibling, 1 reply; 7+ messages in thread
From: David Hopwood @ 2005-06-25 22:59 UTC (permalink / raw)
  To: xen-devel

Tim Newsham wrote:
> The set of patches below add support for loading plan9's a.out
> format using the linux builder.  This is considerably simpler
> than having a seperate builder, shares more code and should
> be easier to maintain.  Hopefully the original plan9 builder
> can go away in the future.

Should the linux builder be renamed to something like 'generic_build'?

-- 
David Hopwood <david.nospam.hopwood@blueyonder.co.uk>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Patch - loader for plan9's a.out format.
  2005-06-25 22:59 ` David Hopwood
@ 2005-06-25 23:24   ` Kip Macy
  2005-06-26  1:09     ` David Hopwood
  2005-06-27 14:03     ` Ronald G. Minnich
  0 siblings, 2 replies; 7+ messages in thread
From: Kip Macy @ 2005-06-25 23:24 UTC (permalink / raw)
  To: david.nospam.hopwood; +Cc: xen-devel

Considering that NetBSD and FreeBSD have used it for some time, yes.
'generic_elf_build' would probably be a slightly better name.


      -Kip


On 6/25/05, David Hopwood <david.nospam.hopwood@blueyonder.co.uk> wrote:
> Tim Newsham wrote:
> > The set of patches below add support for loading plan9's a.out
> > format using the linux builder.  This is considerably simpler
> > than having a seperate builder, shares more code and should
> > be easier to maintain.  Hopefully the original plan9 builder
> > can go away in the future.
> 
> Should the linux builder be renamed to something like 'generic_build'?
> 
> --
> David Hopwood <david.nospam.hopwood@blueyonder.co.uk>
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Patch - loader for plan9's a.out format.
  2005-06-25 23:24   ` Kip Macy
@ 2005-06-26  1:09     ` David Hopwood
  2005-06-26  1:50       ` Kip Macy
  2005-06-27 14:03     ` Ronald G. Minnich
  1 sibling, 1 reply; 7+ messages in thread
From: David Hopwood @ 2005-06-26  1:09 UTC (permalink / raw)
  To: xen-devel

Kip Macy wrote:
> Considering that NetBSD and FreeBSD have used it for some time, yes.
> 'generic_elf_build' would probably be a slightly better name.

IIUC, it supports ELF, raw binaries, and now plan9 a.out.

-- 
David Hopwood <david.nospam.hopwood@blueyonder.co.uk>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Patch - loader for plan9's a.out format.
  2005-06-26  1:09     ` David Hopwood
@ 2005-06-26  1:50       ` Kip Macy
  0 siblings, 0 replies; 7+ messages in thread
From: Kip Macy @ 2005-06-26  1:50 UTC (permalink / raw)
  To: david.nospam.hopwood; +Cc: xen-devel

I guess I haven't been paying attention. In that case it really is generic.

  -Kip

On 6/25/05, David Hopwood <david.nospam.hopwood@blueyonder.co.uk> wrote:
> Kip Macy wrote:
> > Considering that NetBSD and FreeBSD have used it for some time, yes.
> > 'generic_elf_build' would probably be a slightly better name.
> 
> IIUC, it supports ELF, raw binaries, and now plan9 a.out.
> 
> --
> David Hopwood <david.nospam.hopwood@blueyonder.co.uk>
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Patch - loader for plan9's a.out format.
  2005-06-25 23:24   ` Kip Macy
  2005-06-26  1:09     ` David Hopwood
@ 2005-06-27 14:03     ` Ronald G. Minnich
  1 sibling, 0 replies; 7+ messages in thread
From: Ronald G. Minnich @ 2005-06-27 14:03 UTC (permalink / raw)
  To: Kip Macy; +Cc: xen-devel



On Sat, 25 Jun 2005, Kip Macy wrote:

> Considering that NetBSD and FreeBSD have used it for some time, yes.
> 'generic_elf_build' would probably be a slightly better name.

no, generic_build. plan9 a.out images are not ELF.

ron

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2005-06-27 14:03 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-06-24  1:23 Patch - loader for plan9's a.out format Tim Newsham
2005-06-24  9:38 ` Keir Fraser
2005-06-25 22:59 ` David Hopwood
2005-06-25 23:24   ` Kip Macy
2005-06-26  1:09     ` David Hopwood
2005-06-26  1:50       ` Kip Macy
2005-06-27 14:03     ` Ronald G. Minnich

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.