407 lines
12 KiB
Diff
407 lines
12 KiB
Diff
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@suse.de>
|
|
---
|
|
tools/Rules.mk | 2
|
|
xen/Makefile | 5
|
|
xen/include/public/foreign/Makefile | 30 +++++
|
|
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 | 49 +++++++++
|
|
7 files changed, 314 insertions(+)
|
|
|
|
Index: xen-3.0.4-testing/xen/include/public/foreign/Makefile
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-3.0.4-testing/xen/include/public/foreign/Makefile
|
|
@@ -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) -o $@ $<
|
|
+
|
|
+checker.c: $(scripts)
|
|
+ python mkchecker.py $(XEN_TARGET_ARCH) $@ $(architectures)
|
|
Index: xen-3.0.4-testing/xen/include/public/foreign/mkheader.py
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-3.0.4-testing/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"] = """
|
|
+#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;
|
|
+
|
|
Index: xen-3.0.4-testing/xen/include/public/foreign/structs.py
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-3.0.4-testing/xen/include/public/foreign/structs.py
|
|
@@ -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" ];
|
|
+
|
|
Index: xen-3.0.4-testing/xen/include/public/foreign/reference.size
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-3.0.4-testing/xen/include/public/foreign/reference.size
|
|
@@ -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
|
|
+
|
|
Index: xen-3.0.4-testing/xen/Makefile
|
|
===================================================================
|
|
--- xen-3.0.4-testing.orig/xen/Makefile
|
|
+++ xen-3.0.4-testing/xen/Makefile
|
|
@@ -36,10 +36,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
|
|
@@ -49,6 +52,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
|
|
@@ -68,6 +72,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: xen-3.0.4-testing/xen/include/public/foreign/mkchecker.py
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-3.0.4-testing/xen/include/public/foreign/mkchecker.py
|
|
@@ -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();
|
|
+
|
|
Index: xen-3.0.4-testing/tools/Rules.mk
|
|
===================================================================
|
|
--- xen-3.0.4-testing.orig/tools/Rules.mk
|
|
+++ xen-3.0.4-testing/tools/Rules.mk
|
|
@@ -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)
|