On Thu, Mar 12, 2015 at 4:13 PM, Julien Grall <julien.gr...@linaro.org>
wrote:

> Hi Tamas,
>
> On 06/03/15 21:24, Tamas K Lengyel wrote:
> > +        /*
> > +         * Preempt setting mem_access permissions as required by XSA-89,
> > +         * if it's not the last iteration.
> > +         */
> > +        if ( op == MEMACCESS && count )
> > +        {
> > +            uint32_t progress = paddr_to_pfn(addr) - sgfn + 1;
> > +
> > +            if ( (egfn - sgfn) > progress && !(progress & mask)
> > +                 && hypercall_preempt_check() )
> > +            {
> > +                rc = progress;
> > +                goto out;
> > +            }
> > +        }
> > +
>
> Would it be possible to merge the memaccess prempt check with the
> relinquish one?
>
> That may require some change in the relinquish version but I think it
> would be cleaner.
>

Well, I don't really see an obvious way how the two could be combined.


>
> [..]
>
> > +bool_t p2m_mem_access_check(paddr_t gpa, vaddr_t gla, const struct
> npfec npfec)
> > +{
> > +    int rc;
> > +    bool_t violation;
> > +    xenmem_access_t xma;
> > +    mem_event_request_t *req;
> > +    struct vcpu *v = current;
> > +    struct p2m_domain *p2m = p2m_get_hostp2m(v->domain);
> > +
> > +    /* Mem_access is not in use. */
> > +    if ( !p2m->mem_access_enabled )
> > +        return true;
>
> true should be used with bool not boot_t.
>
> > +
> > +    rc = p2m_get_mem_access(v->domain, paddr_to_pfn(gpa), &xma);
> > +    if ( rc )
> > +        return true;
>
> Ditto (I won't repeat for the few other place below)
>

There was just a discussion how there is no difference between 0/1 and
false/true other than maybe style. If one is preferred over the other, I'm
fine with either. Is this really an issue?


>
> > +
> > +    /* Now check for mem_access violation. */
> > +    switch ( xma )
> > +    {
> > +    case XENMEM_access_rwx:
> > +        violation = false;
> > +        break;
> > +    case XENMEM_access_rw:
> > +        violation = npfec.insn_fetch;
> > +        break;
> > +    case XENMEM_access_wx:
> > +        violation = npfec.read_access;
> > +        break;
> > +    case XENMEM_access_rx:
> > +    case XENMEM_access_rx2rw:
> > +        violation = npfec.write_access;
> > +        break;
> > +    case XENMEM_access_x:
> > +        violation = npfec.read_access || npfec.write_access;
> > +        break;
> > +    case XENMEM_access_w:
> > +        violation = npfec.read_access || npfec.insn_fetch;
> > +        break;
> > +    case XENMEM_access_r:
> > +        violation = npfec.write_access || npfec.insn_fetch;
> > +        break;
> > +    default:
> > +    case XENMEM_access_n:
> > +    case XENMEM_access_n2rwx:
> > +        violation = true;
> > +        break;
> > +    }
> > +
> > +    if ( !violation )
> > +        return true;
>
> Ditto
>
> > +
> > +    /* First, handle rx2rw and n2rwx conversion automatically. */
> > +    if ( npfec.write_access && xma == XENMEM_access_rx2rw )
> > +    {
> > +        rc = p2m_set_mem_access(v->domain, paddr_to_pfn(gpa), 1,
> > +                                0, ~0, XENMEM_access_rw);
> > +        return false;
>
> Same as true.
>
> [..]
>
> > +    if ( !i )
> > +    {
> > +        /*
> > +         * No setting was found in the Radix tree. Check if the
> > +         * entry exists in the page-tables.
> > +         */
> > +        paddr_t maddr = p2m_lookup(d, gpfn << PAGE_SHIFT, NULL);
> > +        if ( INVALID_PADDR == maddr )
> > +            return -ESRCH;
> > +
> > +        /* If entry exists then its rwx. */
> > +        *access = XENMEM_access_rwx;
> > +    }
> > +    else
> > +    {
> > +        /* Setting was found in the Radix tree. */
> > +        index = radix_tree_ptr_to_int(i);
> > +        if ( index >= ARRAY_SIZE(memaccess) )
> > +            return -ERANGE;
>
> We trust the value stored in the radix tree. So I think this could be
> turned into an ASSERT/BUG_ON.
>

Sure.


>
> [..]
>
> > @@ -243,12 +245,17 @@ static inline bool_t
> p2m_mem_event_sanity_check(struct domain *d)
> >
> >  /* Get access type for a pfn
> >   * If pfn == -1ul, gets the default access type */
> > -static inline
> >  int p2m_get_mem_access(struct domain *d, unsigned long pfn,
> > -                       xenmem_access_t *access)
> > -{
> > -    return -ENOSYS;
> > -}
> > +                       xenmem_access_t *access);
> > +
>
> p2m_get_mem_access is called by the common code. So it should be moved
> in xen/include/xen/p2m-common.h
>
> In general, any function called by common code should be have the
> prototype declared in common header.
>

Ack, I'll move it into p2m-common.h once the function in ARM is actually
defined in the subsequent patch.


>
> Regards,
>
> --
> Julien Grall
>

Thanks,
Tamas
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

Reply via email to