From: Keir Fraser Date: Wed, 9 Jul 2008 10:04:18 +0000 (+0100) Subject: p2m: Support page orders other than 0 (4kB) and 9 (2MB) X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14188^2~73 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=acf7f0aa5de29f0b49a3c4c6aecea9018a727a6c;p=xen.git p2m: Support page orders other than 0 (4kB) and 9 (2MB) Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index dba676d57a..bf97d45c00 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -530,11 +530,25 @@ void p2m_change_entry_type_global(struct domain *d, p2m_unlock(p2m); } -static inline +static int set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, - unsigned int page_order, p2m_type_t p2mt) + unsigned int page_order, p2m_type_t p2mt) { - return d->arch.p2m->set_entry(d, gfn, mfn, page_order, p2mt); + unsigned long todo = 1ul << page_order; + unsigned int order; + int rc = 0; + + while ( todo ) + { + order = (((gfn | mfn_x(mfn) | todo) & ((1ul << 9) - 1)) == 0) ? 9 : 0; + rc = d->arch.p2m->set_entry(d, gfn, mfn, order, p2mt); + gfn += 1ul << order; + if ( mfn_x(mfn) != INVALID_MFN ) + mfn = _mfn(mfn_x(mfn) + (1ul << order)); + todo -= 1ul << order; + } + + return rc; } // Allocate a new p2m table for a domain.