[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V13 4/7] xen/arm: Data abort exception (R/W) mem_events.
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. [..] > +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) > + > + /* 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. [..] > @@ -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. Regards, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |