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-devel

[Xen-devel] [patch] Generate general usable headers with arch-specific s

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [patch] Generate general usable headers with arch-specific structs.
From: Gerd Hoffmann <kraxel@xxxxxxx>
Date: Thu, 02 Nov 2006 16:09:46 +0100
Cc: jbeulich@xxxxxxxxxx
Delivery-date: Thu, 02 Nov 2006 13:51:09 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: quilt/0.44-15
  Hi,

Adds scripts to generate header files containing arch-specific structs
which can be included everythere.  A step to allow the tools deal with
non-native architecures.  Required for 32-on-64 tools support, but
probably also usable for other things.

python this time, also moved into xen/include/public.

please apply,
  Gerd

Signed-off-by: Gerd Hoffmann <kraxel@xxxxxxx>
---
 tools/Rules.mk                            |    2 
 xen/Makefile                              |    5 
 xen/include/public/foreign/Makefile       |   26 +++++
 xen/include/public/foreign/mkchecker.py   |   56 ++++++++++
 xen/include/public/foreign/mkheader.py    |  153 ++++++++++++++++++++++++++++++
 xen/include/public/foreign/reference.size |   16 +++
 xen/include/public/foreign/structs.py     |   34 ++++++
 7 files changed, 292 insertions(+)

Index: build-32-unstable-11822/xen/include/public/foreign/Makefile
===================================================================
--- /dev/null
+++ build-32-unstable-11822/xen/include/public/foreign/Makefile
@@ -0,0 +1,26 @@
+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
+       ./checker > $(XEN_TARGET_ARCH).size
+       diff -u reference.size $(XEN_TARGET_ARCH).size
+
+%.h: ../arch-%.h ../xen.h $(scripts)
+       python mkheader.py $* $@ $< ../xen.h
+
+checker.o: checker.c $(headers)
+
+checker.c: $(scripts)
+       python mkchecker.py $(XEN_TARGET_ARCH) $@ $(architectures)
Index: build-32-unstable-11822/xen/include/public/foreign/mkheader.py
===================================================================
--- /dev/null
+++ build-32-unstable-11822/xen/include/public/foreign/mkheader.py
@@ -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"] = """
+#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
+""";
+
+# ia64
+# FIXME: this all needs double checking
+inttypes["ia64"] = {
+    "unsigned long" : "__align8__ uint64_t",
+    "long"          : "__align8__ uint64_t",
+    "xen_pfn_t"     : "__align8__ uint64_t",
+    "long double"   : "ldouble_t",
+};
+header["ia64"] = """
+#define __align8__ __attribute__((aligned (8)))
+typedef unsigned char ldouble_t[10];
+""";
+
+
+###########################################################################
+# 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*\{(.*?)\};" % struct;
+    match = re.search("struct\s+" + struct + "\s*\{(.*?)\};", input, re.S)
+    if None == match:
+        output += "#define %s_has_no_%s 1\n" % (arch, struct);
+    else:
+        output += "struct %s_%s {%s};\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;
+
Index: build-32-unstable-11822/xen/include/public/foreign/structs.py
===================================================================
--- /dev/null
+++ build-32-unstable-11822/xen/include/public/foreign/structs.py
@@ -0,0 +1,34 @@
+# configuration: what needs translation
+
+structs = [ "start_info",
+            "trap_info",
+            "pt_fpreg",
+            "cpu_user_regs",
+            "ia64_tr_entry",
+            "vcpu_extra_regs",
+            "vcpu_guest_context",
+            "arch_vcpu_info",
+            "vcpu_time_info",
+            "vcpu_info",
+            "arch_shared_info",
+            "shared_info" ];
+
+defines = [ "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",
+
+            "xen_pfn_to_cr3",
+            "MAX_VIRT_CPUS",
+            "MAX_GUEST_CMDLINE" ];
+
Index: build-32-unstable-11822/xen/include/public/foreign/reference.size
===================================================================
--- /dev/null
+++ build-32-unstable-11822/xen/include/public/foreign/reference.size
@@ -0,0 +1,16 @@
+
+structs              |  x86_32  x86_64    ia64
+
+start_info           |    1104    1152    1152
+trap_info            |       8      16       -
+pt_fpreg             |       -       -      16
+cpu_user_regs        |      68     200     496
+ia64_tr_entry        |       -       -      32
+vcpu_extra_regs      |       -       -     536
+vcpu_guest_context   |    2800    5168    1048
+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
+
Index: build-32-unstable-11822/xen/Makefile
===================================================================
--- build-32-unstable-11822.orig/xen/Makefile
+++ build-32-unstable-11822/xen/Makefile
@@ -31,8 +31,11 @@ _install: $(TARGET).gz
        $(INSTALL_DATA) $(TARGET)-syms $(DESTDIR)/boot/$(notdir 
$(TARGET))-syms-$(XEN_FULLVERSION)
        [ -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/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
@@ -42,6 +45,7 @@ _debug:
 .PHONY: _clean
 _clean: delete-unfresh-files
        $(MAKE) -C tools clean
+       $(MAKE) -C include/public/foreign clean
        $(MAKE) -f $(BASEDIR)/Rules.mk -C common clean
        $(MAKE) -f $(BASEDIR)/Rules.mk -C drivers clean
        $(MAKE) -f $(BASEDIR)/Rules.mk -C acm clean
@@ -60,6 +64,7 @@ $(TARGET).gz: $(TARGET)
 
 $(TARGET): delete-unfresh-files
        $(MAKE) -C tools
+       $(MAKE) -C include/public/foreign
        $(MAKE) -f $(BASEDIR)/Rules.mk include/xen/compile.h
        $(MAKE) -f $(BASEDIR)/Rules.mk include/xen/acm_policy.h
        [ -e include/asm ] || ln -sf asm-$(TARGET_ARCH) include/asm
Index: build-32-unstable-11822/xen/include/public/foreign/mkchecker.py
===================================================================
--- /dev/null
+++ build-32-unstable-11822/xen/include/public/foreign/mkchecker.py
@@ -0,0 +1,56 @@
+#!/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 <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");');
+
+f.write('\tprintf("\\n");');
+f.write('\texit(0);\n');
+f.write('}\n');
+
+f.close();
Index: build-32-unstable-11822/tools/Rules.mk
===================================================================
--- build-32-unstable-11822.orig/tools/Rules.mk
+++ build-32-unstable-11822/tools/Rules.mk
@@ -41,5 +41,7 @@ mk-symlinks-xen:
        ( cd xen/hvm && ln -sf ../../$(XEN_ROOT)/xen/include/public/hvm/*.h . )
        mkdir -p xen/io
        ( cd xen/io && ln -sf ../../$(XEN_ROOT)/xen/include/public/io/*.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)

--


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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [patch] Generate general usable headers with arch-specific structs., Gerd Hoffmann <=