[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] xen/arm{32, 64}: fix section shift when mapping 2MB block in boot page table
On 01/15/2014 01:32 PM, Ian Campbell wrote: > On Tue, 2014-01-14 at 06:19 +0800, Chen Baozi wrote: >> Section shift for level-2 page table should be #21 rather than #20. Besides, >> since there are {FIRST,SECOND,THIRD}_SHIFT macros defined in asm/page.h, use >> these macros instead of hard-coded shift value. >> >> Signed-off-by: Chen Baozi <baozich@xxxxxxxxx> > > Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > > WRT a 4.4 freeze exception the main bit is the use of #21 instead of #20 > as the shift for the L2 entry, which can result in an UNK/SBZP bit being > set. ARM ARM says: > > Hardware must implement the bit as Read-As-Zero, and must ignore > writes to the field. > > Software must not rely on the field reading as all 0s, and > except for writing back to the register must treat the value > as if it is UNKNOWN. Software must use an SBZP policy to write > to the field. > > The danger is that some future version of the architecture assigns > meaning to that bit. All in all this seems like a pretty benign issue, > but on the flip side the fix is reasonable low risk, the only real > danger is that one of the replacements is wrong and most of them are > pretty trivial, although s/#18/#(SECOND_SHIFT - 3)/ is a bit less so. > > I was initially leaning towards putting this into the queue for 4.5, but > on reflection I'm now starting to lean the other way. > > Does anyone feel strongly that this shouldn't go into 4.4? This sounds a good fix for Xen 4.4. Acked-by: Julien Grall <julien.grall@xxxxxxxxxx> >> --- >> xen/arch/arm/arm32/head.S | 20 ++++++++++---------- >> xen/arch/arm/arm64/head.S | 26 +++++++++++++------------- >> 2 files changed, 23 insertions(+), 23 deletions(-) >> >> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S >> index 96230ac..f3eab89 100644 >> --- a/xen/arch/arm/arm32/head.S >> +++ b/xen/arch/arm/arm32/head.S >> @@ -291,14 +291,14 @@ cpu_init_done: >> ldr r4, =boot_second >> add r4, r4, r10 /* r1 := paddr (boot_second) */ >> >> - lsr r2, r9, #20 /* Base address for 2MB mapping */ >> - lsl r2, r2, #20 >> + lsr r2, r9, #SECOND_SHIFT /* Base address for 2MB mapping */ >> + lsl r2, r2, #SECOND_SHIFT >> orr r2, r2, #PT_UPPER(MEM) /* r2:r3 := section map */ >> orr r2, r2, #PT_LOWER(MEM) >> >> /* ... map of vaddr(start) in boot_second */ >> ldr r1, =start >> - lsr r1, #18 /* Slot for vaddr(start) */ >> + lsr r1, #(SECOND_SHIFT - 3) /* Slot for vaddr(start) */ >> strd r2, r3, [r4, r1] /* Map vaddr(start) */ >> >> /* ... map of paddr(start) in boot_second */ >> @@ -307,7 +307,7 @@ cpu_init_done: >> * then the mapping was done in >> * boot_pgtable above */ >> >> - mov r1, r9, lsr #18 /* Slot for paddr(start) */ >> + mov r1, r9, lsr #(SECOND_SHIFT - 3) /* Slot for paddr(start) */ >> strd r2, r3, [r4, r1] /* Map Xen there */ >> 1: >> >> @@ -339,8 +339,8 @@ paging: >> /* Add UART to the fixmap table */ >> ldr r1, =xen_fixmap /* r1 := vaddr (xen_fixmap) */ >> mov r3, #0 >> - lsr r2, r11, #12 >> - lsl r2, r2, #12 /* 4K aligned paddr of UART */ >> + lsr r2, r11, #THIRD_SHIFT >> + lsl r2, r2, #THIRD_SHIFT /* 4K aligned paddr of UART */ >> orr r2, r2, #PT_UPPER(DEV_L3) >> orr r2, r2, #PT_LOWER(DEV_L3) /* r2:r3 := 4K dev map including >> UART */ >> strd r2, r3, [r1, #(FIXMAP_CONSOLE*8)] /* Map it in the first >> fixmap's slot */ >> @@ -353,7 +353,7 @@ paging: >> orr r2, r2, #PT_UPPER(PT) >> orr r2, r2, #PT_LOWER(PT) /* r2:r3 := table map of xen_fixmap */ >> ldr r4, =FIXMAP_ADDR(0) >> - mov r4, r4, lsr #18 /* r4 := Slot for FIXMAP(0) */ >> + mov r4, r4, lsr #(SECOND_SHIFT - 3) /* r4 := Slot for FIXMAP(0) >> */ >> strd r2, r3, [r1, r4] /* Map it in the fixmap's slot */ >> >> /* Use a virtual address to access the UART. */ >> @@ -365,12 +365,12 @@ paging: >> >> ldr r1, =boot_second >> mov r3, #0x0 >> - lsr r2, r8, #21 >> - lsl r2, r2, #21 /* r2: 2MB-aligned paddr of DTB */ >> + lsr r2, r8, #SECOND_SHIFT >> + lsl r2, r2, #SECOND_SHIFT /* r2: 2MB-aligned paddr of DTB */ >> orr r2, r2, #PT_UPPER(MEM) >> orr r2, r2, #PT_LOWER(MEM) /* r2:r3 := 2MB RAM incl. DTB */ >> ldr r4, =BOOT_FDT_VIRT_START >> - mov r4, r4, lsr #18 /* Slot for BOOT_FDT_VIRT_START */ >> + mov r4, r4, lsr #(SECOND_SHIFT) /* Slot for BOOT_FDT_VIRT_START >> */ >> strd r2, r3, [r1, r4] /* Map it in the early fdt slot */ >> dsb >> 1: >> diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S >> index bebddf0..5b164e9 100644 >> --- a/xen/arch/arm/arm64/head.S >> +++ b/xen/arch/arm/arm64/head.S >> @@ -278,11 +278,11 @@ skip_bss: >> str x2, [x4, #0] /* Map it in slot 0 */ >> >> /* ... map of paddr(start) in boot_first */ >> - lsr x2, x19, #30 /* x2 := Offset of base paddr in >> boot_first */ >> + lsr x2, x19, #FIRST_SHIFT /* x2 := Offset of base paddr in >> boot_first */ >> and x1, x2, 0x1ff /* x1 := Slot to use */ >> cbz x1, 1f /* It's in slot 0, map in boot_second >> */ >> >> - lsl x2, x2, #30 /* Base address for 1GB mapping */ >> + lsl x2, x2, #FIRST_SHIFT /* Base address for 1GB mapping */ >> mov x3, #PT_MEM /* x2 := Section map */ >> orr x2, x2, x3 >> lsl x1, x1, #3 /* x1 := Slot offset */ >> @@ -292,23 +292,23 @@ skip_bss: >> ldr x4, =boot_second >> add x4, x4, x20 /* x4 := paddr (boot_second) */ >> >> - lsr x2, x19, #20 /* Base address for 2MB mapping */ >> - lsl x2, x2, #20 >> + lsr x2, x19, #SECOND_SHIFT /* Base address for 2MB mapping */ >> + lsl x2, x2, #SECOND_SHIFT >> mov x3, #PT_MEM /* x2 := Section map */ >> orr x2, x2, x3 >> >> /* ... map of vaddr(start) in boot_second */ >> ldr x1, =start >> - lsr x1, x1, #18 /* Slot for vaddr(start) */ >> + lsr x1, x1, #(SECOND_SHIFT - 3) /* Slot for vaddr(start) */ >> str x2, [x4, x1] /* Map vaddr(start) */ >> >> /* ... map of paddr(start) in boot_second */ >> - lsr x1, x19, #30 /* Base paddr */ >> + lsr x1, x19, #FIRST_SHIFT /* Base paddr */ >> cbnz x1, 1f /* If paddr(start) is not in slot 0 >> * then the mapping was done in >> * boot_pgtable or boot_first above */ >> >> - lsr x1, x19, #18 /* Slot for paddr(start) */ >> + lsr x1, x19, #(SECOND_SHIFT - 3) /* Slot for paddr(start) */ >> str x2, [x4, x1] /* Map Xen there */ >> 1: >> >> @@ -340,8 +340,8 @@ paging: >> /* Add UART to the fixmap table */ >> ldr x1, =xen_fixmap >> add x1, x1, x20 /* x1 := paddr (xen_fixmap) */ >> - lsr x2, x23, #12 >> - lsl x2, x2, #12 /* 4K aligned paddr of UART */ >> + lsr x2, x23, #THIRD_SHIFT >> + lsl x2, x2, #THIRD_SHIFT /* 4K aligned paddr of UART */ >> mov x3, #PT_DEV_L3 >> orr x2, x2, x3 /* x2 := 4K dev map including UART */ >> str x2, [x1, #(FIXMAP_CONSOLE*8)] /* Map it in the first fixmap's >> slot */ >> @@ -354,7 +354,7 @@ paging: >> mov x3, #PT_PT >> orr x2, x2, x3 /* x2 := table map of xen_fixmap */ >> ldr x1, =FIXMAP_ADDR(0) >> - lsr x1, x1, #18 /* x1 := Slot for FIXMAP(0) */ >> + lsr x1, x1, #(SECOND_SHIFT - 3) /* x1 := Slot for FIXMAP(0) */ >> str x2, [x4, x1] /* Map it in the fixmap's slot */ >> >> /* Use a virtual address to access the UART. */ >> @@ -364,12 +364,12 @@ paging: >> /* Map the DTB in the boot misc slot */ >> cbnz x22, 1f /* Only on boot CPU */ >> >> - lsr x2, x21, #21 >> - lsl x2, x2, #21 /* x2 := 2MB-aligned paddr of DTB */ >> + lsr x2, x21, #SECOND_SHIFT >> + lsl x2, x2, #SECOND_SHIFT /* x2 := 2MB-aligned paddr of DTB */ >> mov x3, #PT_MEM /* x2 := 2MB RAM incl. DTB */ >> orr x2, x2, x3 >> ldr x1, =BOOT_FDT_VIRT_START >> - lsr x1, x1, #18 /* x4 := Slot for BOOT_FDT_VIRT_START >> */ >> + lsr x1, x1, #(SECOND_SHIFT - 3) /* x4 := Slot for >> BOOT_FDT_VIRT_START */ >> str x2, [x4, x1] /* Map it in the early fdt slot */ >> dsb sy >> 1: > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel > -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |