Looks good Jan. Thanks again.
Do you want me to re-submit the Linux-side patch with
the necessary changes or are you working on that too?
Thanks,
Dan
> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@xxxxxxxxxx]
> Sent: Tuesday, June 16, 2009 8:59 AM
> To: xen-devel@xxxxxxxxxxxxxxxxxxx
> Cc: Dan Magenheimer
> Subject: [Xen-devel] [PATCH] tmem: fix 32-on-64 support
>
>
> This implicitly required coverting the tmem_op structure from
> anonymous
> to standard struct/union sub-fields, and extending the get-fields.sh
> helper script to deal with typedef-ed guest handles used as types of
> translated compound type fields.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
>
> --- 2009-06-10.orig/tools/libxc/xc_tmem.c 2009-05-27
> 13:54:05.000000000 +0200
> +++ 2009-06-10/tools/libxc/xc_tmem.c 2009-06-16
> 16:39:08.000000000 +0200
> @@ -43,11 +43,11 @@ int xc_tmem_control(int xc,
>
> op.cmd = TMEM_CONTROL;
> op.pool_id = pool_id;
> - op.subop = subop;
> - op.cli_id = cli_id;
> - op.arg1 = arg1;
> - op.arg2 = arg2;
> - op.buf.p = buf;
> + op.u.ctrl.subop = subop;
> + op.u.ctrl.cli_id = cli_id;
> + op.u.ctrl.arg1 = arg1;
> + op.u.ctrl.arg2 = arg2;
> + op.u.ctrl.buf.p = buf;
>
> if (subop == TMEMC_LIST) {
> if ((arg1 != 0) && (lock_pages(buf, arg1) != 0))
> --- 2009-06-10.orig/xen/common/tmem.c 2009-06-16
> 16:38:02.000000000 +0200
> +++ 2009-06-10/xen/common/tmem.c 2009-06-16
> 11:34:21.000000000 +0200
> @@ -1842,7 +1842,8 @@ EXPORT long do_tmem_op(tmem_cli_op_t uop
> {
> tmem_write_lock(&tmem_rwlock);
> tmem_write_lock_set = 1;
> - rc = do_tmem_control(op.subop, op.cli_id, op.arg1,
> op.arg2, op.buf);
> + rc = do_tmem_control(op.u.ctrl.subop, op.u.ctrl.cli_id,
> + op.u.ctrl.arg1, op.u.ctrl.arg2,
> op.u.ctrl.buf);
> goto out;
> }
>
> @@ -1887,27 +1888,31 @@ EXPORT long do_tmem_op(tmem_cli_op_t uop
> switch ( op.cmd )
> {
> case TMEM_NEW_POOL:
> - rc = do_tmem_new_pool(op.flags,op.uuid[0],op.uuid[1]);
> + rc = do_tmem_new_pool(op.u.new.flags,
> + op.u.new.uuid[0], op.u.new.uuid[1]);
> break;
> case TMEM_NEW_PAGE:
> - rc = do_tmem_put(pool, op.object, op.index, op.cmfn,
> 0, 0, 0);
> + rc = do_tmem_put(pool, op.u.gen.object,
> op.u.gen.index, op.u.gen.cmfn,
> + 0, 0, 0);
> break;
> case TMEM_PUT_PAGE:
> - rc = do_tmem_put(pool, op.object, op.index, op.cmfn,
> 0, 0, PAGE_SIZE);
> + rc = do_tmem_put(pool, op.u.gen.object,
> op.u.gen.index, op.u.gen.cmfn,
> + 0, 0, PAGE_SIZE);
> if (rc == 1) succ_put = 1;
> else non_succ_put = 1;
> break;
> case TMEM_GET_PAGE:
> - rc = do_tmem_get(pool, op.object, op.index, op.cmfn,
> 0, 0, PAGE_SIZE);
> + rc = do_tmem_get(pool, op.u.gen.object,
> op.u.gen.index, op.u.gen.cmfn,
> + 0, 0, PAGE_SIZE);
> if (rc == 1) succ_get = 1;
> else non_succ_get = 1;
> break;
> case TMEM_FLUSH_PAGE:
> flush = 1;
> - rc = do_tmem_flush_page(pool, op.object, op.index);
> + rc = do_tmem_flush_page(pool, op.u.gen.object,
> op.u.gen.index);
> break;
> case TMEM_FLUSH_OBJECT:
> - rc = do_tmem_flush_object(pool, op.object);
> + rc = do_tmem_flush_object(pool, op.u.gen.object);
> flush_obj = 1;
> break;
> case TMEM_DESTROY_POOL:
> @@ -1915,12 +1920,14 @@ EXPORT long do_tmem_op(tmem_cli_op_t uop
> rc = do_tmem_destroy_pool(op.pool_id);
> break;
> case TMEM_READ:
> - rc = do_tmem_get(pool, op.object, op.index, op.cmfn,
> - op.tmem_offset, op.pfn_offset, op.len);
> + rc = do_tmem_get(pool, op.u.gen.object,
> op.u.gen.index, op.u.gen.cmfn,
> + op.u.gen.tmem_offset, op.u.gen.pfn_offset,
> + op.u.gen.len);
> break;
> case TMEM_WRITE:
> - rc = do_tmem_put(pool, op.object, op.index, op.cmfn,
> - op.tmem_offset, op.pfn_offset, op.len);
> + rc = do_tmem_put(pool, op.u.gen.object,
> op.u.gen.index, op.u.gen.cmfn,
> + op.u.gen.tmem_offset, op.u.gen.pfn_offset,
> + op.u.gen.len);
> break;
> case TMEM_XCHG:
> /* need to hold global lock to ensure xchg is atomic */
> --- 2009-06-10.orig/xen/include/xen/tmem_xen.h
> 2009-06-15 15:11:54.000000000 +0200
> +++ 2009-06-10/xen/include/xen/tmem_xen.h 2009-06-16
> 15:09:40.000000000 +0200
> @@ -16,6 +16,9 @@
> #include <xen/guest_access.h> /* copy_from_guest */
> #include <xen/hash.h> /* hash_long */
> #include <public/tmem.h>
> +#ifdef CONFIG_COMPAT
> +#include <compat/tmem.h>
> +#endif
>
> struct tmem_host_dependent_client {
> struct domain *domain;
> @@ -286,6 +289,29 @@ typedef XEN_GUEST_HANDLE(tmem_op_t) tmem
>
> static inline int tmh_get_tmemop_from_client(tmem_op_t *op,
> tmem_cli_op_t uops)
> {
> +#ifdef CONFIG_COMPAT
> + if ( is_pv_32on64_vcpu(current) )
> + {
> + int rc;
> + enum XLAT_tmem_op_u u;
> + tmem_op_compat_t cop;
> +
> + rc = copy_from_guest(&cop, guest_handle_cast(uops, void), 1);
> + if ( rc )
> + return rc;
> + switch ( cop.cmd )
> + {
> + case TMEM_NEW_POOL: u = XLAT_tmem_op_u_new; break;
> + case TMEM_CONTROL: u = XLAT_tmem_op_u_ctrl; break;
> + default: u = XLAT_tmem_op_u_gen; break;
> + }
> +#define XLAT_tmem_op_HNDL_u_ctrl_buf(_d_, _s_) \
> + guest_from_compat_handle((_d_)->u.ctrl.buf,
> (_s_)->u.ctrl.buf)
> + XLAT_tmem_op(op, &cop);
> +#undef XLAT_tmem_op_HNDL_u_ctrl_buf
> + return 0;
> + }
> +#endif
> return copy_from_guest(op, uops, 1);
> }
>
> --- 2009-06-10.orig/xen/include/xlat.lst 2009-06-16
> 16:38:02.000000000 +0200
> +++ 2009-06-10/xen/include/xlat.lst 2009-06-15
> 15:14:25.000000000 +0200
> @@ -57,6 +57,7 @@
> ! sched_poll sched.h
> ? sched_remote_shutdown sched.h
> ? sched_shutdown sched.h
> +! tmem_op tmem.h
> ? t_buf trace.h
> ? vcpu_get_physid vcpu.h
> ? vcpu_register_vcpu_info vcpu.h
> @@ -74,6 +75,3 @@
> ? processor_px platform.h
> ! psd_package platform.h
> ! processor_performance platform.h
> -# ? tmem_op_t tmem.h
> -# ? tmem_cli_mfn_t tmem.h
> -# ? tmem_cli_va_t tmem.h
> --- 2009-06-10.orig/xen/include/public/tmem.h 2009-06-15
> 14:58:25.000000000 +0200
> +++ 2009-06-10/xen/include/public/tmem.h 2009-06-16
> 11:30:05.000000000 +0200
> @@ -75,14 +75,14 @@ struct tmem_op {
> struct { /* for cmd == TMEM_NEW_POOL */
> uint64_t uuid[2];
> uint32_t flags;
> - };
> + } new;
> struct { /* for cmd == TMEM_CONTROL */
> uint32_t subop;
> uint32_t cli_id;
> uint32_t arg1;
> uint32_t arg2;
> tmem_cli_va_t buf;
> - };
> + } ctrl;
> struct {
> uint64_t object;
> uint32_t index;
> @@ -90,8 +90,8 @@ struct tmem_op {
> uint32_t pfn_offset;
> uint32_t len;
> tmem_cli_mfn_t cmfn; /* client machine page frame */
> - };
> - };
> + } gen;
> + } u;
> };
> typedef struct tmem_op tmem_op_t;
> DEFINE_XEN_GUEST_HANDLE(tmem_op_t);
> --- 2009-06-10.orig/xen/tools/get-fields.sh 2009-06-16
> 16:38:02.000000000 +0200
> +++ 2009-06-10/xen/tools/get-fields.sh 2009-06-16
> 15:08:22.000000000 +0200
> @@ -34,6 +34,34 @@ get_fields ()
> done
> }
>
> +get_typedefs ()
> +{
> + local level=1 state=
> + for token in $1
> + do
> + case "$token" in
> + typedef)
> + test $level != 1 || state=1
> + ;;
> + COMPAT_HANDLE\(*\))
> + test $level != 1 -o "$state" != 1 || state=2
> + ;;
> + [\{\[])
> + level=$(expr $level + 1)
> + ;;
> + [\}\]])
> + level=$(expr $level - 1)
> + ;;
> + ";")
> + test $level != 1 || state=
> + ;;
> + [a-zA-Z_]*)
> + test $level != 1 -o "$state" != 2 ||
> echo "$token"
> + ;;
> + esac
> + done
> +}
> +
> build_enums ()
> {
> local level=1 kind= fields= members= named= id= token
> @@ -166,7 +194,21 @@ for line in sys.stdin.readlines():
> fi
> ;;
> [a-zA-Z]*)
> - id=$token
> + if [ -z "$id" -a -z "$type" -a
> -z "$array_type" ]
> + then
> + for id in $typedefs
> + do
> + test $id !=
> "$token" || type=$id
> + done
> + if [ -z "$type" ]
> + then
> + id=$token
> + else
> + id=
> + fi
> + else
> + id=$token
> + fi
> ;;
> [\,\;])
> if [ $level = 2 -a -n "$(echo
> $id | $SED 's,^_pad[[:digit:]]*,,')" ]
> @@ -281,6 +323,18 @@ build_body ()
> if [ -n "$array" ]
> then
> array="$array $token"
> + elif [ -z "$id" -a -z "$type" -a -z
> "$array_type" ]
> + then
> + for id in $typedefs
> + do
> + test $id != "$token" || type=$id
> + done
> + if [ -z "$type" ]
> + then
> + id=$token
> + else
> + id=
> + fi
> else
> id=$token
> fi
> @@ -419,7 +473,8 @@ build_check ()
> echo ""
> }
>
> -fields="$(get_fields $(echo $2 | $SED
> 's,^compat_xen,compat_,') "$($SED -e 's,^[[:space:]]#.*,,' -e
> 's!\([]\[,;:{}]\)! \1 !g' $3)")"
> +list="$($SED -e 's,^[[:space:]]#.*,,' -e 's!\([]\[,;:{}]\)!
> \1 !g' $3)"
> +fields="$(get_fields $(echo $2 | $SED
> 's,^compat_xen,compat_,') "$list")"
> if [ -z "$fields" ]
> then
> echo "Fields of '$2' not found in '$3'" >&2
> @@ -429,6 +484,7 @@ name=${2#compat_}
> name=${name#xen}
> case "$1" in
> "!")
> + typedefs="$(get_typedefs "$list")"
> build_enums $name "$fields"
> build_body $name "$fields"
> ;;
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|