[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[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@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.