diff --git a/tools/tests/pdx/test-pdx.c b/tools/tests/pdx/test-pdx.c index 4de8d43d86..6728ffc7a5 100644 --- a/tools/tests/pdx/test-pdx.c +++ b/tools/tests/pdx/test-pdx.c @@ -88,6 +88,22 @@ int main(int argc, char **argv) .compress = true, }, #endif + /* Range contained in a previous one. */ + { + .ranges = { + /* Overlapping ranges. */ + { .start = 0, .end = (1UL << MAX_ORDER) * 2 }, + { .start = 0, .end = (1UL << MAX_ORDER) * 1 }, + /* Extra range to force offset compression to be engaged. */ + { .start = (1UL << MAX_ORDER) * 3, + .end = (1UL << MAX_ORDER) * 4 }, + }, +#ifdef CONFIG_PDX_OFFSET_COMPRESSION + .compress = true, +#else + .compress = false, +#endif + }, /* PDX compression, 2 ranges covered by the lower mask. */ { .ranges = { diff --git a/xen/common/pdx.c b/xen/common/pdx.c index e7e16e193e..23655ef3bd 100644 --- a/xen/common/pdx.c +++ b/xen/common/pdx.c @@ -393,8 +393,9 @@ bool __init pfn_pdx_compression_setup(paddr_t base) (ranges[i - 1].base_pfn + ranges[i - 1].pages) ) continue; - ranges[i - 1].pages = ranges[i].base_pfn + ranges[i].pages - - ranges[i - 1].base_pfn; + ranges[i - 1].pages = max(ranges[i - 1].pages, + ranges[i].base_pfn + ranges[i].pages - + ranges[i - 1].base_pfn); if ( i + 1 < nr_ranges ) memmove(&ranges[i], &ranges[i + 1],