[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [UNIKRAFT PATCH RFCv3 27/32] plat/kvm/arm: Add a memory hole at the beginning 128M
Previously, arm64 kvm will setup 0x0-0x3fffffff as a device mmio area. Hence user can even read/write 0x0 arbitrarily without panic. After whis patch, we can prevent the memory corruption to some extent since this set the beginning 128M as NONE attr. Signed-off-by: Jia He <justin.he@xxxxxxx> --- plat/kvm/arm/pagetable64.S | 42 ++++++++++++++++++++++------- plat/kvm/include/kvm-arm/arm64/mm.h | 7 ++--- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/plat/kvm/arm/pagetable64.S b/plat/kvm/arm/pagetable64.S index 1c2a349..6fd9f3b 100644 --- a/plat/kvm/arm/pagetable64.S +++ b/plat/kvm/arm/pagetable64.S @@ -38,13 +38,17 @@ #include <arm/cpu_defs.h> /* * The following is the Memory Layout of AArch64 Virtual Machine - * | 0 - 0x3FFFFFFF | 0x40000000 - 0x7FFFFFFFFF | 512GB - 1TB | - * -------------------------------------------------------------------------- - * | DEVICES MMIO | DTB|TEXT|DATA|BSS|PAGETABLE|BOOTSTACK | PCI-e High Mem | - * -------------------------------------------------------------------------- + * | 0-0x7FFFFFF | 0x8000000-0x3FFFFFFF | 0x40000000-0x7FFFFFFFFF | 512GB-1TB | + * ---------------------------------------------------------------------------- + * | HOLE | DEVICES MMIO | <1> | <2> | + * ---------------------------------------------------------------------------- + * <1> DTB|TEXT|DATA|BSS|PAGETABLE|BOOTSTACK + * <2> PCI-e High Mem */ -#define DEVICE_ADDR_START 0 -#define DEVICE_ADDR_SIZE 0x40000000 +#define HOLE_START 0 +#define HOLE_MEM_ENTRIES 64 /* 128M */ +#define DEVICE_ADDR_START 0x8000000 +#define DEVICE_ENTRIES 448 /* 512-64 */ #define RAM_ADDR_START 0x40000000 #define RAM_L2_ENTRIES 255 #define RAM_ADDR_SIZE (0x40000000 * RAM_L2_ENTRIES) @@ -83,14 +87,29 @@ ENTRY(create_pagetables) bl link_l0_pagetable /* - * Using 1GiB block to map device address space (0x0 ~ 0x3fffffff) + * Using 1GiB block to map the hole memory (0x0 ~ 0x7ffffff) and device + * address space (0x0 ~ 0x3fffffff) */ - add x6, x14, #L1_TABLE_OFFSET + /* Build a L2 block pagetable */ + add x6, x14, #L2_TABLE_OFFSET + ldr x7, =0 /* NONE ATTR*/ + mov x8, #HOLE_START + mov x9, x8 + ldr x10, =HOLE_MEM_ENTRIES + bl build_l2_block_pagetable + + add x6, x14, #L2_TABLE_OFFSET ldr x7, =SECT_ATTR_DEVICE_nGnRE mov x8, #DEVICE_ADDR_START mov x9, x8 - mov x10, #1 - bl build_l1_block_pagetable + ldr x10, =DEVICE_ENTRIES + bl build_l2_block_pagetable + + /* Link this L2 block pagetable to L1 entry */ + add x6, x14, #L1_TABLE_OFFSET + mov x8, #HOLE_START + add x9, x14, #L2_TABLE_OFFSET + bl link_l1_pagetable /* * Using 1GiB block to map RAM address space @@ -135,6 +154,7 @@ ENTRY(create_pagetables) */ /* 1st: Build a L2 block pagetable */ add x6, x14, #L2_TABLE_OFFSET + add x6, x6, #__PAGE_SIZE ldr x7, =SECT_ATTR_NORMAL mov x8, #RAM_ADDR_START mov x9, x8 @@ -145,6 +165,7 @@ ENTRY(create_pagetables) add x6, x14, #L1_TABLE_OFFSET mov x8, #RAM_ADDR_START add x9, x14, #L2_TABLE_OFFSET + add x9, x9, #__PAGE_SIZE bl link_l1_pagetable /* 3rd: Build a L3 pagetable for image occupied memory */ @@ -160,6 +181,7 @@ ENTRY(create_pagetables) /* 4th: Link this L3 pagetable to L2 entry */ add x6, x14, #L2_TABLE_OFFSET + add x6, x6, #__PAGE_SIZE 1: mov x8, x17 mov x9, x16 diff --git a/plat/kvm/include/kvm-arm/arm64/mm.h b/plat/kvm/include/kvm-arm/arm64/mm.h index 9ec1273..612b9ec 100644 --- a/plat/kvm/include/kvm-arm/arm64/mm.h +++ b/plat/kvm/include/kvm-arm/arm64/mm.h @@ -62,11 +62,12 @@ * Each entry in L2_TABLE can map to a 2MiB block memory or link to a * L3_TABLE which supports 2MiB memory mapping. We need a L3_TABLE to * cover image area for us to manager different sections attributes. - * So, we need one page for L2_TABLE to provide 511 enties for 2MiB - * block mapping and 1 entry for L3_TABLE link. + * So, we need two page for L2_TABLE. One is to provide a protecting hole + * from memory corrupting. One is to provide 511 enties for 2MiB block + * mapping and 1 entry for L3_TABLE link. */ #define L2_TABLE_OFFSET (L1_TABLE_OFFSET + L1_TABLE_SIZE) -#define L2_TABLE_SIZE __PAGE_SIZE +#define L2_TABLE_SIZE (__PAGE_SIZE * 2) /* * We will use Unikraft image's size to caculate the L3_TABLE_SIZE. -- 2.17.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |