[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Generate headers with arch-specific structs.
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |