x86/xen: fix set_phys_range_identity() if pfn_e > MAX_P2M_PFN
Allow set_phys_range_identity() to work with a range that overlaps MAX_P2M_PFN by clamping pfn_e to MAX_P2M_PFN. Signed-off-by: David Vrabel <david.vrabel@citrix.com> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Tested-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
@@ -774,7 +774,7 @@ unsigned long __init set_phys_range_identity(unsigned long pfn_s,
|
|||||||
{
|
{
|
||||||
unsigned long pfn;
|
unsigned long pfn;
|
||||||
|
|
||||||
if (unlikely(pfn_s >= MAX_P2M_PFN || pfn_e >= MAX_P2M_PFN))
|
if (unlikely(pfn_s >= MAX_P2M_PFN))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (unlikely(xen_feature(XENFEAT_auto_translated_physmap)))
|
if (unlikely(xen_feature(XENFEAT_auto_translated_physmap)))
|
||||||
@@ -783,6 +783,9 @@ unsigned long __init set_phys_range_identity(unsigned long pfn_s,
|
|||||||
if (pfn_s > pfn_e)
|
if (pfn_s > pfn_e)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (pfn_e > MAX_P2M_PFN)
|
||||||
|
pfn_e = MAX_P2M_PFN;
|
||||||
|
|
||||||
for (pfn = (pfn_s & ~(P2M_MID_PER_PAGE * P2M_PER_PAGE - 1));
|
for (pfn = (pfn_s & ~(P2M_MID_PER_PAGE * P2M_PER_PAGE - 1));
|
||||||
pfn < ALIGN(pfn_e, (P2M_MID_PER_PAGE * P2M_PER_PAGE));
|
pfn < ALIGN(pfn_e, (P2M_MID_PER_PAGE * P2M_PER_PAGE));
|
||||||
pfn += P2M_MID_PER_PAGE * P2M_PER_PAGE)
|
pfn += P2M_MID_PER_PAGE * P2M_PER_PAGE)
|
||||||
|
Reference in New Issue
Block a user