WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] Generate headers with arch-specific struc

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Generate headers with arch-specific structs.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 26 Jan 2007 05:35:23 -0800
Delivery-date: Fri, 26 Jan 2007 05:51:22 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Emmanuel Ackaouy <ack@xxxxxxxxxxxxx>
# Date 1169763412 0
# Node ID 583441e296a1096eac5959ab743715fbabd93605
# Parent  4aa6044ab967337dde6d5abd08cb64b3ceb77dec
Generate headers with arch-specific structs.

This patch adds a script to generate headers with arch-specific
structs which can be included on any architecture.  Can be used
to deal with structs of "foreign" architectures, needed for
32-on-64 support for example.

Signed-off-by: Gerd Hoffmann <kraxel@xxxxxxx>
---
 Makefile                                  |   11 +-
 tools/Rules.mk                            |    2 
 xen/Makefile                              |    4 
 xen/include/public/foreign/Makefile       |   37 +++++++
 xen/include/public/foreign/mkchecker.py   |   58 +++++++++++
 xen/include/public/foreign/mkheader.py    |  153 ++++++++++++++++++++++++++++++
 xen/include/public/foreign/reference.size |   17 +++
 xen/include/public/foreign/structs.py     |   52 ++++++++++
 8 files changed, 331 insertions(+), 3 deletions(-)

diff -r 4aa6044ab967 -r 583441e296a1 Makefile
--- a/Makefile  Thu Jan 25 22:16:52 2007 +0000
+++ b/Makefile  Thu Jan 25 22:16:52 2007 +0000
@@ -22,7 +22,7 @@ install: install-xen install-kernels ins
 install: install-xen install-kernels install-tools install-docs
 
 .PHONY: build
-build: kernels
+build: kernels build-headers
        $(MAKE) -C xen build
        $(MAKE) -C tools build
        $(MAKE) -C docs build
@@ -59,11 +59,11 @@ prep-kernels:
        for i in $(XKERNELS) ; do $(MAKE) $$i-prep || exit 1; done
 
 .PHONY: install-xen
-install-xen:
+install-xen: build-headers
        $(MAKE) -C xen install
 
 .PHONY: install-tools
-install-tools:
+install-tools: build-headers
        $(MAKE) -C tools install
 
 .PHONY: install-kernels
@@ -81,6 +81,11 @@ dev-docs:
 # Build all the various kernels and modules
 .PHONY: kbuild
 kbuild: kernels
+
+# generate header files
+.PHONY: build-headers
+build-headers:
+       $(MAKE) -C xen/include/public/foreign
 
 # Delete the kernel build trees entirely
 .PHONY: kdelete
diff -r 4aa6044ab967 -r 583441e296a1 tools/Rules.mk
--- a/tools/Rules.mk    Thu Jan 25 22:16:52 2007 +0000
+++ b/tools/Rules.mk    Thu Jan 25 22:16:52 2007 +0000
@@ -52,5 +52,7 @@ mk-symlinks-xen:
        ( cd xen/io && ln -sf ../../$(XEN_ROOT)/xen/include/public/io/*.h . )
        mkdir -p xen/arch-x86
        ( cd xen/arch-x86 && ln -sf 
../../$(XEN_ROOT)/xen/include/public/arch-x86/*.h . )
+       mkdir -p xen/foreign
+       ( cd xen/foreign && ln -sf 
../../$(XEN_ROOT)/xen/include/public/foreign/*.h . )
 
 mk-symlinks: mk-symlinks-xen mk-symlinks-$(XEN_OS)
diff -r 4aa6044ab967 -r 583441e296a1 xen/Makefile
--- a/xen/Makefile      Thu Jan 25 22:16:52 2007 +0000
+++ b/xen/Makefile      Thu Jan 25 22:16:52 2007 +0000
@@ -35,10 +35,13 @@ _install: $(TARGET).gz
                $(INSTALL_DIR) $(DESTDIR)/usr/include/xen/hvm
        [ -d $(DESTDIR)/usr/include/xen/io ] || \
                $(INSTALL_DIR) $(DESTDIR)/usr/include/xen/io
+       [ -d $(DESTDIR)/usr/include/xen/foreign ] || \
+               $(INSTALL_DIR) $(DESTDIR)/usr/include/xen/foreign
        $(INSTALL_DATA) include/public/*.h $(DESTDIR)/usr/include/xen
        $(INSTALL_DATA) include/public/arch-x86/*.h 
$(DESTDIR)/usr/include/xen/arch-x86
        $(INSTALL_DATA) include/public/hvm/*.h $(DESTDIR)/usr/include/xen/hvm
        $(INSTALL_DATA) include/public/io/*.h $(DESTDIR)/usr/include/xen/io
+       $(INSTALL_DATA) include/public/foreign/*.h 
$(DESTDIR)/usr/include/xen/foreign
        $(INSTALL_DATA) include/public/COPYING $(DESTDIR)/usr/include/xen
 
 .PHONY: _debug
@@ -48,6 +51,7 @@ _debug:
 .PHONY: _clean
 _clean: delete-unfresh-files
        $(MAKE) -C tools clean
+       $(MAKE) -C include/public/foreign clean
        $(MAKE) -f $(BASEDIR)/Rules.mk -C include clean
        $(MAKE) -f $(BASEDIR)/Rules.mk -C common clean
        $(MAKE) -f $(BASEDIR)/Rules.mk -C drivers clean
diff -r 4aa6044ab967 -r 583441e296a1 xen/include/public/foreign/Makefile
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/public/foreign/Makefile       Thu Jan 25 22:16:52 2007 +0000
@@ -0,0 +1,37 @@
+XEN_ROOT := ../../../..
+include $(XEN_ROOT)/tools/Rules.mk
+
+architectures := x86_32 x86_64 ia64
+headers := $(patsubst %, %.h, $(architectures))
+scripts := $(wildcard *.py)
+
+.PHONY: all clean check-headers
+all: $(headers) check-headers
+
+clean:
+       rm -f $(headers)
+       rm -f checker checker.c $(XEN_TARGET_ARCH).size
+       rm -f *.pyc *.o *~
+
+check-headers: checker
+ifeq ($(CROSS_COMPILE),)
+       ./checker > $(XEN_TARGET_ARCH).size
+       diff -u reference.size $(XEN_TARGET_ARCH).size
+else
+       @echo "cross build: skipping check"
+endif
+
+x86_32.h: ../arch-x86/xen-x86_32.h ../arch-x86/xen.h ../xen.h $(scripts)
+       python mkheader.py $* $@ $(filter %.h,$^)
+
+x86_64.h: ../arch-x86/xen-x86_64.h ../arch-x86/xen.h ../xen.h $(scripts)
+       python mkheader.py $* $@ $(filter %.h,$^)
+
+ia64.h: ../arch-ia64.h ../xen.h $(scripts)
+       python mkheader.py $* $@ $(filter %.h,$^)
+
+checker: checker.c $(headers)
+       $(HOSTCC) $(CFLAGS) -o $@ $<
+
+checker.c: $(scripts)
+       python mkchecker.py $(XEN_TARGET_ARCH) $@ $(architectures)
diff -r 4aa6044ab967 -r 583441e296a1 xen/include/public/foreign/mkchecker.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/public/foreign/mkchecker.py   Thu Jan 25 22:16:52 2007 +0000
@@ -0,0 +1,58 @@
+#!/usr/bin/python
+
+import sys;
+from structs import structs;
+
+# command line arguments
+arch    = sys.argv[1];
+outfile = sys.argv[2];
+archs   = sys.argv[3:];
+
+f = open(outfile, "w");
+f.write('''
+/*
+ * sanity checks for generated foreign headers:
+ *  - verify struct sizes
+ *
+ * generated by %s -- DO NOT EDIT
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <inttypes.h>
+#include "../xen.h"
+''');
+
+for a in archs:
+    f.write('#include "%s.h"\n' % a);
+
+f.write('int main(int argc, char *argv[])\n{\n');
+
+f.write('\tprintf("\\n");');
+f.write('printf("%-20s |", "structs");\n');
+for a in archs:
+    f.write('\tprintf("%%8s", "%s");\n' % a);
+f.write('\tprintf("\\n");');
+
+f.write('\tprintf("\\n");');
+for struct in structs:
+    f.write('\tprintf("%%-20s |", "%s");\n' % struct);
+    for a in archs:
+        if a == arch:
+            s = struct; # native
+        else:
+            s = struct + "_" + a;
+        f.write('#ifdef %s_has_no_%s\n' % (a, struct));
+        f.write('\tprintf("%8s", "-");\n');
+        f.write("#else\n");
+        f.write('\tprintf("%%8zd", sizeof(struct %s));\n' % s);
+        f.write("#endif\n");
+
+    f.write('\tprintf("\\n");\n\n');
+
+f.write('\tprintf("\\n");\n');
+f.write('\texit(0);\n');
+f.write('}\n');
+
+f.close();
+
diff -r 4aa6044ab967 -r 583441e296a1 xen/include/public/foreign/mkheader.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/public/foreign/mkheader.py    Thu Jan 25 22:16:52 2007 +0000
@@ -0,0 +1,153 @@
+#!/usr/bin/python
+
+import sys, re;
+from structs import structs, defines;
+
+# command line arguments
+arch    = sys.argv[1];
+outfile = sys.argv[2];
+infiles = sys.argv[3:];
+
+
+###########################################################################
+# configuration #2: architecture information
+
+inttypes = {};
+header = {};
+footer = {};
+
+# x86_32
+inttypes["x86_32"] = {
+    "unsigned long" : "uint32_t",
+    "long"          : "uint32_t",
+    "xen_pfn_t"     : "uint32_t",
+};
+header["x86_32"] = """
+#define __i386___X86_32 1
+#pragma pack(push, 4)
+""";
+footer["x86_32"] = """
+#pragma pack(pop)
+""";
+
+# x86_64
+inttypes["x86_64"] = {
+    "unsigned long" : "__align8__ uint64_t",
+    "long"          : "__align8__ uint64_t",
+    "xen_pfn_t"     : "__align8__ uint64_t",
+};
+header["x86_64"] = """
+#ifdef __GNUC__
+# define __DECL_REG(name) union { uint64_t r ## name, e ## name; }
+# define __align8__ __attribute__((aligned (8)))
+#else
+# define __DECL_REG(name) uint64_t r ## name
+# define __align8__ FIXME
+#endif
+#define __x86_64___X86_64 1
+""";
+
+# ia64
+inttypes["ia64"] = {
+    "unsigned long" : "__align8__ uint64_t",
+    "long"          : "__align8__ uint64_t",
+    "xen_pfn_t"     : "__align8__ uint64_t",
+    "long double"   : "__align16__ ldouble_t",
+};
+header["ia64"] = """
+#define __align8__ __attribute__((aligned (8)))
+#define __align16__ __attribute__((aligned (16)))
+typedef unsigned char ldouble_t[16];
+""";
+
+
+###########################################################################
+# main
+
+input  = "";
+output = "";
+fileid = re.sub("[-.]", "_", "__FOREIGN_%s__" % outfile.upper());
+
+# read input header files
+for name in infiles:
+    f = open(name, "r");
+    input += f.read();
+    f.close();
+
+# add header
+output += """
+/*
+ * public xen defines and struct for %s
+ * generated by %s -- DO NOT EDIT
+ */
+
+#ifndef %s
+#define %s 1
+
+""" % (arch, sys.argv[0], fileid, fileid)
+
+if arch in header:
+    output += header[arch];
+    output += "\n";
+
+# add defines to output
+for line in re.findall("#define[^\n]+", input):
+    for define in defines:
+        regex = "#define\s+%s\\b" % define;
+        match = re.search(regex, line);
+        if None == match:
+            continue;
+        if define.upper()[0] == define[0]:
+            replace = define + "_" + arch.upper();
+        else:
+            replace = define + "_" + arch;
+        regex = "\\b%s\\b" % define;
+        output += re.sub(regex, replace, line) + "\n";
+output += "\n";
+
+# delete defines, comments, empty lines
+input = re.sub("#define[^\n]+\n", "", input);
+input = re.compile("/\*(.*?)\*/", re.S).sub("", input)
+input = re.compile("\n\s*\n", re.S).sub("\n", input);
+
+# add structs to output
+for struct in structs:
+    regex = "struct\s+%s\s*\{(.*?)\n\};" % struct;
+    match = re.search(regex, input, re.S)
+    if None == match:
+        output += "#define %s_has_no_%s 1\n" % (arch, struct);
+    else:
+        output += "struct %s_%s {%s\n};\n" % (struct, arch, match.group(1));
+        output += "typedef struct %s_%s %s_%s_t;\n" % (struct, arch, struct, 
arch);
+    output += "\n";
+
+# add footer
+if arch in footer:
+    output += footer[arch];
+    output += "\n";
+output += "#endif /* %s */\n" % fileid;
+
+# replace: defines
+for define in defines:
+    if define.upper()[0] == define[0]:
+        replace = define + "_" + arch.upper();
+    else:
+        replace = define + "_" + arch;
+    output = re.sub("\\b%s\\b" % define, replace, output);
+
+# replace: structs + struct typedefs
+for struct in structs:
+    output = re.sub("\\b(struct\s+%s)\\b" % struct, "\\1_%s" % arch, output);
+    output = re.sub("\\b(%s)_t\\b" % struct, "\\1_%s_t" % arch, output);
+
+# replace: integer types
+integers = inttypes[arch].keys();
+integers.sort(lambda a, b: cmp(len(b),len(a)));
+for type in integers:
+    output = re.sub("\\b%s\\b" % type, inttypes[arch][type], output);
+
+# print results
+f = open(outfile, "w");
+f.write(output);
+f.close;
+
diff -r 4aa6044ab967 -r 583441e296a1 xen/include/public/foreign/reference.size
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/public/foreign/reference.size Thu Jan 25 22:16:52 2007 +0000
@@ -0,0 +1,17 @@
+
+structs              |  x86_32  x86_64    ia64
+
+start_info           |    1104    1152    1152
+trap_info            |       8      16       -
+pt_fpreg             |       -       -      16
+cpu_user_regs        |      68     200     496
+xen_ia64_boot_param  |       -       -      96
+ia64_tr_entry        |       -       -      32
+vcpu_extra_regs      |       -       -     536
+vcpu_guest_context   |    2800    5168    1056
+arch_vcpu_info       |      24      16       0
+vcpu_time_info       |      32      32      32
+vcpu_info            |      64      64      48
+arch_shared_info     |     268     280     272
+shared_info          |    2584    3368    4384
+
diff -r 4aa6044ab967 -r 583441e296a1 xen/include/public/foreign/structs.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/public/foreign/structs.py     Thu Jan 25 22:16:52 2007 +0000
@@ -0,0 +1,52 @@
+# configuration: what needs translation
+
+structs = [ "start_info",
+            "trap_info",
+            "pt_fpreg",
+            "cpu_user_regs",
+            "xen_ia64_boot_param",
+            "ia64_tr_entry",
+            "vcpu_extra_regs",
+            "vcpu_guest_context",
+            "arch_vcpu_info",
+            "vcpu_time_info",
+            "vcpu_info",
+            "arch_shared_info",
+            "shared_info" ];
+
+defines = [ "__i386__",
+            "__x86_64__",
+
+            "FLAT_RING1_CS",
+            "FLAT_RING1_DS",
+            "FLAT_RING1_SS",
+
+            "FLAT_RING3_CS64",
+            "FLAT_RING3_DS64",
+            "FLAT_RING3_SS64",
+            "FLAT_KERNEL_CS64",
+            "FLAT_KERNEL_DS64",
+            "FLAT_KERNEL_SS64",
+
+            "FLAT_KERNEL_CS",
+            "FLAT_KERNEL_DS",
+            "FLAT_KERNEL_SS",
+
+            # x86_{32,64}
+            "_VGCF_i387_valid",
+            "VGCF_i387_valid",
+            "_VGCF_in_kernel",
+            "VGCF_in_kernel",
+            "_VGCF_failsafe_disables_events",
+            "VGCF_failsafe_disables_events",
+            "_VGCF_syscall_disables_events",
+            "VGCF_syscall_disables_events",
+
+            # ia64
+            "VGCF_EXTRA_REGS",
+
+            # all archs
+            "xen_pfn_to_cr3",
+            "MAX_VIRT_CPUS",
+            "MAX_GUEST_CMDLINE" ];
+

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] Generate headers with arch-specific structs., Xen patchbot-unstable <=