示例#1
0
文件: p2m.c 项目: DenisLug/mptcp
bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn)
{
	pte_t *ptep;
	unsigned int level;

	/* don't track P2M changes in autotranslate guests */
	if (unlikely(xen_feature(XENFEAT_auto_translated_physmap)))
		return true;

	if (unlikely(pfn >= xen_p2m_size)) {
		BUG_ON(mfn != INVALID_P2M_ENTRY);
		return true;
	}

	/*
	 * The interface requires atomic updates on p2m elements.
	 * xen_safe_write_ulong() is using __put_user which does an atomic
	 * store via asm().
	 */
	if (likely(!xen_safe_write_ulong(xen_p2m_addr + pfn, mfn)))
		return true;

	ptep = lookup_address((unsigned long)(xen_p2m_addr + pfn), &level);
	BUG_ON(!ptep || level != PG_LEVEL_4K);

	if (pte_pfn(*ptep) == PFN_DOWN(__pa(p2m_missing)))
		return mfn == INVALID_P2M_ENTRY;

	if (pte_pfn(*ptep) == PFN_DOWN(__pa(p2m_identity)))
		return mfn == IDENTITY_FRAME(pfn);

	return false;
}
示例#2
0
文件: p2m.c 项目: quadcores/cbs_4.2.4
bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn)
{
    pte_t *ptep;
    unsigned int level;

    /* don't track P2M changes in autotranslate guests */
    if (unlikely(xen_feature(XENFEAT_auto_translated_physmap)))
        return true;

    if (unlikely(pfn >= xen_p2m_size)) {
        BUG_ON(mfn != INVALID_P2M_ENTRY);
        return true;
    }

    if (likely(!xen_safe_write_ulong(xen_p2m_addr + pfn, mfn)))
        return true;

    ptep = lookup_address((unsigned long)(xen_p2m_addr + pfn), &level);
    BUG_ON(!ptep || level != PG_LEVEL_4K);

    if (pte_pfn(*ptep) == PFN_DOWN(__pa(p2m_missing)))
        return mfn == INVALID_P2M_ENTRY;

    if (pte_pfn(*ptep) == PFN_DOWN(__pa(p2m_identity)))
        return mfn == IDENTITY_FRAME(pfn);

    return false;
}