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

Re: [Xen-devel] [PATCH v6] x86/altp2m: Added xc_altp2m_set_mem_access_multi()



>>> On 13.10.17 at 22:42, <petre.pircalabu@xxxxxxxxx> wrote:
> @@ -4586,6 +4620,107 @@ static int do_altp2m_op(
>      return rc;
>  }
>  
> +DEFINE_XEN_GUEST_HANDLE(compat_hvm_altp2m_op_t);
> +
> +#ifndef CHECK_hvm_altp2m_op
> +#define CHECK_hvm_altp2m_op \
> +    CHECK_SIZE_(struct, hvm_altp2m_op); \
> +    CHECK_FIELD_(struct, hvm_altp2m_op, version); \
> +    CHECK_FIELD_(struct, hvm_altp2m_op, cmd); \
> +    CHECK_FIELD_(struct, hvm_altp2m_op, domain); \
> +    CHECK_FIELD_(struct, hvm_altp2m_op, pad1); \
> +    CHECK_FIELD_(struct, hvm_altp2m_op, pad2);
> +#endif /* CHECK_hvm_altp2m_op */
> +
> +#ifndef CHECK_hvm_altp2m_set_mem_access_multi
> +#define CHECK_hvm_altp2m_set_mem_access_multi \
> +    CHECK_SIZE_(struct, hvm_altp2m_set_mem_access_multi); \
> +    CHECK_FIELD_(struct, hvm_altp2m_set_mem_access_multi, view); \
> +    CHECK_FIELD_(struct, hvm_altp2m_set_mem_access_multi, pad); \
> +    CHECK_FIELD_(struct, hvm_altp2m_set_mem_access_multi, nr); \
> +    CHECK_FIELD_(struct, hvm_altp2m_set_mem_access_multi, opaque);
> +#endif /* CHECK_hvm_altp2m_set_mem_access_multi */

Please omit the trailing semicolons in both cases, just like the
generated macros don't have them. They're ...

> +CHECK_hvm_altp2m_op;
> +CHECK_hvm_altp2m_set_mem_access_multi;

... redundant with the ones here.

> +static int compat_altp2m_op(
> +    XEN_GUEST_HANDLE_PARAM(void) arg)
> +{
> +    int rc = 0;
> +    struct compat_hvm_altp2m_op a;
> +    union
> +    {
> +        XEN_GUEST_HANDLE_PARAM(void) hnd;
> +        struct xen_hvm_altp2m_op *altp2m_op;
> +    } nat;
> +
> +    if ( !hvm_altp2m_supported() )
> +        return -EOPNOTSUPP;
> +
> +    if ( copy_from_guest(&a, arg, 1) )
> +        return -EFAULT;
> +
> +    if ( a.pad1 || a.pad2 ||
> +         (a.version != HVMOP_ALTP2M_INTERFACE_VERSION) )
> +        return -EINVAL;
> +
> +    set_xen_guest_handle(nat.hnd, COMPAT_ARG_XLAT_VIRT_BASE);
> +
> +    switch ( a.cmd )
> +    {
> +    case HVMOP_altp2m_set_mem_access_multi:
> +        BUILD_BUG_ON(sizeof(struct xen_hvm_altp2m_set_mem_access_multi) <
> +                     sizeof(struct compat_hvm_altp2m_set_mem_access_multi));

With the checking macros above I would hope this isn't needed
anymore.

> +#define XLAT_hvm_altp2m_set_mem_access_multi_HNDL_pfn_list(_d_, _s_); \
> +        guest_from_compat_handle((_d_)->pfn_list, (_s_)->pfn_list)
> +#define XLAT_hvm_altp2m_set_mem_access_multi_HNDL_access_list(_d_, _s_); \
> +        guest_from_compat_handle((_d_)->access_list, (_s_)->access_list)
> +        
> XLAT_hvm_altp2m_set_mem_access_multi(&nat.altp2m_op->u.set_mem_access_multi,
> +                                             &a.u.set_mem_access_multi);
> +#undef XLAT_hvm_altp2m_set_mem_access_multi_HNDL_pfn_list
> +#undef XLAT_hvm_altp2m_set_mem_access_multi_HNDL_access_list
> +        break;
> +    default:
> +        return do_altp2m_op(arg);
> +    }
> +
> +    /*
> +     * Manually fill the common part of the xen_hvm_altp2m_op structure 
> because
> +     * the generated XLAT_hvm_altp2m_op macro doesn't correctly handle the
> +     * translation of all fields from compat_hvm_altp2m_op to 
> xen_hvm_altp2m_op.
> +     */

I think a variant of this comment would now better be placed ahead
of the CHECK_hvm_altp2m_* macro definitions above, with the one
here becoming brief by simply referring to the larger one.

> +    nat.altp2m_op->version  = a.version;
> +    nat.altp2m_op->cmd      = a.cmd;
> +    nat.altp2m_op->domain   = a.domain;
> +    nat.altp2m_op->pad1     = a.pad1;
> +    nat.altp2m_op->pad2     = a.pad2;
> +
> +    rc = do_altp2m_op(nat.hnd);
> +
> +    switch ( a.cmd )
> +    {
> +    case HVMOP_altp2m_set_mem_access_multi:
> +        /*
> +         * The return code can be positive only if it is the return value
> +         * of hypercall_create_continuation. In this case, the opaque value
> +         * must be copied back to the guest.
> +         */
> +        if ( rc > 0 )
> +        {

ASSERT(rc == ...);

> +            a.u.set_mem_access_multi.opaque =
> +                nat.altp2m_op->u.set_mem_access_multi.opaque;
> +            if ( __copy_field_to_guest(guest_handle_cast(arg,
> +                                                         
> compat_hvm_altp2m_op_t),
> +                                       &a, u.set_mem_access_multi.opaque) )
> +                rc = -EFAULT;
> +        }
> +        break;

default:
    ASSERT_UNREACHABLE();

Jan

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

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