mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/arm: Harden setup_frametable_mappings
The amount of supported physical memory depends on the frametable size and the number of struct page_info entries that can fit into it. Define a macro PAGE_INFO_SIZE to store the current size of the struct page_info (i.e. 56B for arm64 and 32B for arm32) and add a sanity check in setup_frametable_mappings to be notified whenever the size of the structure changes. Also call a panic if the calculated frametable_size exceeds the limit defined by FRAMETABLE_SIZE macro. Update the comments regarding the frametable in asm/config.h. Signed-off-by: Michal Orzel <michal.orzel@amd.com> Reviewed-by: Julien Grall <jgrall@amazon.com>
This commit is contained in:
1 parent
b2220f8525
commit
93017efd7c
3 files changed
+19
-2
No files matched your search
@@ -82,7 +82,7 @@
|
||||
* ARM32 layout:
|
||||
* 0 - 12M <COMMON>
|
||||
*
|
||||
* 32M - 128M Frametable: 24 bytes per page for 16GB of RAM
|
||||
* 32M - 128M Frametable: 32 bytes per page for 12GB of RAM
|
||||
* 256M - 1G VMAP: ioremap and early_ioremap use this virtual address
|
||||
* space
|
||||
*
|
||||
@@ -95,7 +95,7 @@
|
||||
*
|
||||
* 1G - 2G VMAP: ioremap and early_ioremap
|
||||
*
|
||||
* 32G - 64G Frametable: 24 bytes per page for 5.3TB of RAM
|
||||
* 32G - 64G Frametable: 56 bytes per page for 2TB of RAM
|
||||
*
|
||||
* 0x0000008000000000 - 0x00007fffffffffff (127.5TB, L0 slots [1..255])
|
||||
* Unused
|
||||
|
||||
@@ -26,6 +26,17 @@
|
||||
*/
|
||||
#define PFN_ORDER(_pfn) ((_pfn)->v.free.order)
|
||||
|
||||
/*
|
||||
* The size of struct page_info impacts the number of entries that can fit
|
||||
* into the frametable area and thus it affects the amount of physical memory
|
||||
* we claim to support. Define PAGE_INFO_SIZE to be used for sanity checking.
|
||||
*/
|
||||
#ifdef CONFIG_ARM_64
|
||||
#define PAGE_INFO_SIZE 56
|
||||
#else
|
||||
#define PAGE_INFO_SIZE 32
|
||||
#endif
|
||||
|
||||
struct page_info
|
||||
{
|
||||
/* Each frame can be threaded onto a doubly-linked list. */
|
||||
|
||||
@@ -676,6 +676,12 @@ void __init setup_frametable_mappings(paddr_t ps, paddr_t pe)
|
||||
const unsigned long mapping_size = frametable_size < MB(32) ? MB(2) : MB(32);
|
||||
int rc;
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct page_info) != PAGE_INFO_SIZE);
|
||||
|
||||
if ( frametable_size > FRAMETABLE_SIZE )
|
||||
panic("The frametable cannot cover the physical region %#"PRIpaddr" - %#"PRIpaddr"\n",
|
||||
ps, pe);
|
||||
|
||||
frametable_base_pdx = mfn_to_pdx(maddr_to_mfn(ps));
|
||||
/* Round up to 2M or 32M boundary, as appropriate. */
|
||||
frametable_size = ROUNDUP(frametable_size, mapping_size);
|
||||
|
||||