Jan Beulich
2006-Oct-04 15:32 UTC
[Xen-devel] [PATCH, RFC 5/17] 32-on-64 aggregate argument translation and guest startup
Index: 2006-10-04/Config.mk ==================================================================--- 2006-10-04.orig/Config.mk 2006-07-31 13:57:55.000000000 +0200 +++ 2006-10-04/Config.mk 2006-10-04 15:10:46.000000000 +0200 @@ -8,6 +8,8 @@ XEN_COMPILE_ARCH ?= $(shell uname -m XEN_TARGET_ARCH ?= $(XEN_COMPILE_ARCH) XEN_TARGET_X86_PAE ?= n +SHELL ?= /bin/sh + # Tools to run on system hosting the build HOSTCC = gcc HOSTCFLAGS = -Wall -Werror -Wstrict-prototypes -O2 -fomit-frame-pointer Index: 2006-10-04/xen/arch/x86/domain_build.c ==================================================================--- 2006-10-04.orig/xen/arch/x86/domain_build.c 2006-10-04 15:03:07.000000000 +0200 +++ 2006-10-04/xen/arch/x86/domain_build.c 2006-10-04 15:10:46.000000000 +0200 @@ -19,6 +19,7 @@ #include <xen/version.h> #include <xen/iocap.h> #include <xen/bitops.h> +#include <xen/compat.h> #include <asm/regs.h> #include <asm/system.h> #include <asm/io.h> @@ -852,6 +853,11 @@ int construct_dom0(struct domain *d, si->console.dom0.info_size = sizeof(struct dom0_vga_console_info); } +#ifdef CONFIG_COMPAT + if ( IS_COMPAT(d) ) + xlat_start_info(si, XLAT_start_info_console_dom0); +#endif + /* Reinstate the caller''s page tables. */ write_ptbase(current); local_irq_enable(); Index: 2006-10-04/xen/arch/x86/setup.c ==================================================================--- 2006-10-04.orig/xen/arch/x86/setup.c 2006-10-04 09:21:12.000000000 +0200 +++ 2006-10-04/xen/arch/x86/setup.c 2006-10-04 15:10:46.000000000 +0200 @@ -17,6 +17,10 @@ #include <xen/hypercall.h> #include <xen/keyhandler.h> #include <public/version.h> +#ifdef CONFIG_COMPAT +#include <compat/platform.h> +#include <compat/xen.h> +#endif #include <asm/bitops.h> #include <asm/smp.h> #include <asm/processor.h> @@ -435,6 +439,14 @@ void __init __start_xen(multiboot_info_t BUILD_BUG_ON(sizeof(shared_info_t) > PAGE_SIZE); BUILD_BUG_ON(sizeof(vcpu_info_t) != 64); +#ifdef CONFIG_COMPAT + BUILD_BUG_ON(sizeof(((struct compat_platform_op *)0)->u) !+ sizeof(((struct compat_platform_op *)0)->u.pad)); + BUILD_BUG_ON(sizeof(start_info_compat_t) > PAGE_SIZE); + BUILD_BUG_ON(sizeof(shared_info_compat_t) > PAGE_SIZE); + BUILD_BUG_ON(sizeof(vcpu_info_compat_t) != 64); +#endif + /* Check definitions in public headers match internal defs. */ BUILD_BUG_ON(__HYPERVISOR_VIRT_START != HYPERVISOR_VIRT_START); #ifdef HYPERVISOR_VIRT_END Index: 2006-10-04/xen/common/compat/Makefile ==================================================================--- 2006-10-04.orig/xen/common/compat/Makefile 2006-10-04 15:09:52.000000000 +0200 +++ 2006-10-04/xen/common/compat/Makefile 2006-10-04 15:10:46.000000000 +0200 @@ -1,4 +1,5 @@ obj-y += kernel.o +obj-y += xlat.o # extra dependencies kernel.o: ../kernel.c Index: 2006-10-04/xen/common/compat/xlat.c ==================================================================--- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ 2006-10-04/xen/common/compat/xlat.c 2006-10-04 15:10:46.000000000 +0200 @@ -0,0 +1,32 @@ +/****************************************************************************** + * xlat.c + */ + +#include <xen/compat.h> +#include <xen/lib.h> +#include <public/xen.h> +#include <compat/xen.h> + +/* In-place translation functons: */ +void xlat_start_info(struct start_info *native, + enum XLAT_start_info_console console) +{ + struct compat_start_info *compat = (void *)native; + + BUILD_BUG_ON(sizeof(*native) < sizeof(*compat)); + XLAT_start_info(compat, native); +} + +#define xen_dom0_vga_console_info dom0_vga_console_info +CHECK_dom0_vga_console_info +#undef dom0_vga_console_info + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ Index: 2006-10-04/xen/include/Makefile ==================================================================--- 2006-10-04.orig/xen/include/Makefile 2006-10-04 15:09:52.000000000 +0200 +++ 2006-10-04/xen/include/Makefile 2006-10-04 15:10:46.000000000 +0200 @@ -4,7 +4,7 @@ compat-arch-$(CONFIG_X86) := x86_32 headers-y := $(shell find public -name ''*.h'' -not -name ''*-*'' | sed ''s,^public,compat,'') headers-y := $(filter-out %/dom0_ops.h %/io/xs_wire.h,$(headers-y)) -headers-y += compat/arch-$(compat-arch-y).h +headers-y += compat/arch-$(compat-arch-y).h compat/xlat.h cppflags-y := -include public/xen-compat.h cppflags-$(CONFIG_X86) += -m32 @@ -53,5 +53,12 @@ compat/%.c: public/%.h Makefile >$@.new mv -f $@.new $@ +compat/xlat.h: xlat.lst $(filter-out compat/xlat.h,$(headers-y)) $(BASEDIR)/tools/get-fields.sh Makefile + grep -v ''^[[:space:]]*#'' xlat.lst | \ + while read what name hdr; do \ + $(SHELL) $(BASEDIR)/tools/get-fields.sh "$$what" compat_$$name $$(echo compat/$$hdr | sed ''s,@arch@,$(compat-arch-y),g'') || exit $$?; \ + done >$@.new + mv -f $@.new $@ + clean:: rm -rf compat Index: 2006-10-04/xen/include/xlat.lst ==================================================================--- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ 2006-10-04/xen/include/xlat.lst 2006-10-04 15:10:46.000000000 +0200 @@ -0,0 +1,5 @@ +# First column indicator: +# ! - needs translation +# ? - needs checking +? dom0_vga_console_info xen.h +! start_info xen.h Index: 2006-10-04/xen/tools/get-fields.sh ==================================================================--- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ 2006-10-04/xen/tools/get-fields.sh 2006-10-04 15:10:46.000000000 +0200 @@ -0,0 +1,400 @@ +#!/bin/sh +test -n "$1" -a -n "$2" -a -n "$3" +set -ef + +get_fields() { + local level=1 aggr=0 name= fields+ for token in $2 + do + case "$token" in + struct|union) + test $level != 1 || aggr=1 fields= name+ ;; + "{") + level=$(expr $level + 1) + ;; + "}") + level=$(expr $level - 1) + if [ $level = 1 -a $name = $1 ] + then + echo "$fields }" + return 0 + fi + ;; + [[:alpha:]_]*) + test $aggr = 0 -o -n "$name" || name="$token" + ;; + esac + test $aggr = 0 || fields="$fields $token" + done +} + +build_enums() { + local level=1 kind= fields= members= named= id= token + for token in $2 + do + case "$token" in + struct|union) + test $level != 2 || fields=" " + kind="$token;$kind" + ;; + "{") + level=$(expr $level + 1) + ;; + "}") + level=$(expr $level - 1) + if [ $level = 1 ] + then + if [ "${kind%%;*}" = union ] + then + echo + echo "enum XLAT_$1 {" + for m in $members + do + echo " XLAT_${1}_$m," + done + echo "};" + fi + return 0 + elif [ $level = 2 ] + then + named=''?'' + fi + ;; + [[:alpha:]]*) + id=$token + if [ -n "$named" -a -n "${kind#*;}" ] + then + build_enums ${1}_$token "$fields" + named=''!'' + fi + ;; + ",") + test $level != 2 || members="$members $id" + ;; + ";") + test $level != 2 || members="$members $id" + test -z "$named" || kind=${kind#*;} + named+ ;; + esac + test -z "$fields" || fields="$fields $token" + done +} + +handle_field() { + if [ -z "$5" ] + then + echo " \\" + if [ -z "$4" ] + then + echo -n "$1(_d_)->$3 = (_s_)->$3;" + else + echo -n "$1XLAT_${2}_HNDL_$(echo $3 | sed ''s,\.,_,g'')(_d_, _s_);" + fi + elif [ -z "$(echo "$5" | sed ''s,[^{}],,g'')" ] + then + local tag=$(echo "$5" | sed ''s,[[:space:]]*\(struct\|union\)[[:space:]]\+\(compat_\)\?\([[:alnum:]_]\+\)[[:space:]].*,\3,'') + echo " \\" + echo -n "${1}XLAT_$tag(&(_d_)->$3, &(_s_)->$3);" + else + local level=1 kind= fields= id= array= arrlvl=1 type= token + for token in $5 + do + case "$token" in + struct|union) + test $level != 2 || fields=" " + if [ $level == 1 ] + then + kind=$token + if [ $kind = union ] + then + echo " \\" + echo -n "${1}switch ($(echo $3 | sed ''s,\.,_,g'')) {" + fi + fi + ;; + "{") + level=$(expr $level + 1) id+ ;; + "}") + level=$(expr $level - 1) id+ if [ $level == 1 -a $kind = union ] + then + echo " \\" + echo -n "$1}" + fi + ;; + "[") + if [ $level != 2 -o $arrlvl != 1 ] + then + : + elif [ -z "$array" ] + then + array=" " + else + array="$array;" + fi + arrlvl=$(expr $arrlvl + 1) + ;; + "]") + arrlvl=$(expr $arrlvl - 1) + ;; + COMPAT_HANDLE\(*\)) + if [ $level == 2 -a -z "$id" ] + then + type=${token#COMPAT_HANDLE?} + type=${type%?} + type=${type#compat_} + fi + ;; + [[:alpha:]]*) + id=$token + ;; + [\,\;]) + if [ $level == 2 -a -n "$(echo $id | sed ''s,^_pad[[:digit:]]*,,'')" ] + then + if [ $kind = union ] + then + echo " \\" + echo -n "${1}case XLAT_${2}_$(echo $3.$id | sed ''s,\.,_,g''):" + handle_field "$1 " $2 $3.$id "$type" "$fields" + elif [ -z "$array" ] + then + handle_field "$1" $2 $3.$id "$type" "$fields" + else + handle_array "$1" $2 $3.$id "${array#*;}" "$type" "$fields" + fi + test "$token" != ";" || fields= id= type+ array+ if [ $kind = union ] + then + echo " \\" + echo -n "$1 break;" + fi + fi + ;; + *) + if [ -n "$array" ] + then + array="$array $token" + fi + ;; + esac + test -z "$fields" || fields="$fields $token" + done + fi +} + +handle_array() { + local i="i$(echo $4 | sed ''s,[^;], ,g'' | wc -w)" + echo " \\" + echo "$1{ \\" + echo "$1 unsigned int $i; \\" + echo -n "$1 for ($i = 0; $i < "${4%%;*}"; ++$i) {" + if [ "$4" = "${4#*;}" ] + then + handle_field "$1 " $2 $3[$i] "$5" "$6" + else + handle_array "$1 " $2 $3[$i] "${4#*;}" "$5" "$6" + fi + echo " \\" + echo "$1 } \\" + echo -n "$1}" +} + +build_body() { + echo + echo -n "#define XLAT_$1(_d_, _s_)" + local level=1 fields= id= array= arrlvl=1 type= token + for token in $2 + do + case "$token" in + struct|union) + test $level != 2 || fields=" " + ;; + "{") + level=$(expr $level + 1) id+ ;; + "}") + level=$(expr $level - 1) id+ ;; + "[") + if [ $level != 2 -o $arrlvl != 1 ] + then + : + elif [ -z "$array" ] + then + array=" " + else + array="$array;" + fi + arrlvl=$(expr $arrlvl + 1) + ;; + "]") + arrlvl=$(expr $arrlvl - 1) + ;; + COMPAT_HANDLE\(*\)) + if [ $level == 2 -a -z "$id" ] + then + type=${token#COMPAT_HANDLE?} + type=${type%?} + type=${type#compat_} + fi + ;; + [[:alpha:]_]*) + if [ -n "$array" ] + then + array="$array $token" + else + id=$token + array+ fi + ;; + [[:digit:]]*|0[xX][[:xdigit:]]*) + if [ -n "$array" ] + then + array="$array $token" + fi + ;; + [\,\;]) + if [ $level == 2 -a -n "$(echo $id | sed ''s,^_pad[[:digit:]]*,,'')" ] + then + if [ -z "$array" ] + then + handle_field " " $1 $id "$type" "$fields" + else + handle_array " " $1 $id "${array#*;}" "$type" "$fields" + fi + test "$token" != ";" || fields= id= type+ array+ fi + ;; + *) + if [ -n "$array" ] + then + array="$array $token" + fi + ;; + esac + test -z "$fields" || fields="$fields $token" + done + echo "" +} + +check_field() { + if [ -z "$(echo "$4" | sed ''s,[^{}],,g'')" ] + then + echo " \\" + local n=$(echo $3 | sed ''s,[^.], ,g'' | wc -w) + if [ -n "$4" ] + then + for n in $4 + do + case $n in + struct|union) + ;; + [[:alpha:]_]*) + echo -n " CHECK_$n" + break + ;; + *) + echo "Malformed compound declaration: ''$n''" >&2 + exit 1 + ;; + esac + done + elif [ $n = 0 ] + then + echo -n " CHECK_FIELD_($1, $2, $3);" + else + echo -n " CHECK_SUBFIELD_${n}_($1, $2, $(echo $3 | sed ''s!\.!, !g''));" + fi + else + local level=1 fields= id= token + for token in $4 + do + case "$token" in + struct|union) + test $level != 2 || fields=" " + ;; + "{") + level=$(expr $level + 1) id+ ;; + "}") + level=$(expr $level - 1) id+ ;; + [[:alpha:]]*) + id=$token + ;; + [\,\;]) + if [ $level == 2 -a -n "$(echo $id | sed ''s,^_pad[[:digit:]]*,,'')" ] + then + check_field $1 $2 $3.$id "$fields" + test "$token" != ";" || fields= id+ fi + ;; + esac + test -z "$fields" || fields="$fields $token" + done + fi +} + +build_check() { + echo + echo -n "#define CHECK_$1" + local level=1 fields= kind= id= arrlvl=1 token + for token in $2 + do + case "$token" in + struct|union) + test $level != 1 || kind=$token + test $level != 2 || fields=" " + ;; + "{") + level=$(expr $level + 1) id+ ;; + "}") + level=$(expr $level - 1) id+ ;; + "[") + arrlvl=$(expr $arrlvl + 1) + ;; + "]") + arrlvl=$(expr $arrlvl - 1) + ;; + [[:alpha:]_]*) + test $level != 2 -o $arrlvl != 1 || id=$token + ;; + [\,\;]) + if [ $level == 2 -a -n "$(echo $id | sed ''s,^_pad[[:digit:]]*,,'')" ] + then + check_field $kind $1 $id "$fields" + test "$token" != ";" || fields= id+ fi + ;; + esac + test -z "$fields" || fields="$fields $token" + done + echo "" +} + +fields="$(get_fields $2 "$(sed -e ''s,^[[:space:]]#.*,,'' -e ''s!\([]\[,;:{}]\)! \1 !g'' $3)")" +if [ -z "$fields" ] +then + echo "Fields of ''$2'' not found in ''$3''" >&2 + exit 1 +fi +case "$1" in +"!") + build_enums ${2#compat_} "$fields" + build_body ${2#compat_} "$fields" + ;; +"?") + build_check ${2#compat_} "$fields" + ;; +*) + echo "Invalid translation indicator: ''$1''" >&2 + exit 1 + ;; +esac _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel