On Mon, 3 Jun 2013, Stephen Boyd wrote: > On 06/03/13 15:45, Russell King - ARM Linux wrote: > > On Mon, Jun 03, 2013 at 03:37:39PM -0700, Stephen Boyd wrote: > >> In my case I'm booting a kernel with textoffset = 0x208000 but RAM > >> starts at 0x0. Does "minimum of RAM start" mean 0x0 or 0x200000? > > The basic requirement for zImage's is no less than the start of RAM > > plus 32K. Or let me put it another way - start of writable memory > > plus 32K. > > > > Whether you need an offset of 0x200000 or not is not for the > > decompressor to know. If you're having to avoid the first 0x200000 > > bytes of memory for some reason (eg, secure firmware or DSP needs > > it left free) then there's no way for the decompressor to know that, > > so it's irrelevant. > > > > So, lets say that your platform has a DSP which needs the first 0x200000 > > bytes left free. So the boot loader _already_ needs to know to load > > the image not at zero, but above 0x200000. The additional 32K > > requirement is really nothing new and so should be treated in just the > > same way. > > > > Leave at least 32K of usable memory below the zImage at all times. > > Understood. On my device writeable RAM actually starts at 0x0 but I have > compiled in support for devices which don't have writeable memory at > 0x0, instead they have writeable memory starting at 0x200000. Because I > have a kernel supporting more than one device with differing memory > layouts I run into this problem. The same problem will occur to any > devices in the multi-platform kernel when a device with unwriteable > memory near the bottom (such as MSM8960) joins the multi-platform defconfig. > > Let me try to word it in your example. I have compiled in support for a > platform that has a DSP which needs the first 0x200000 bytes left free. > I have also compiled in support for a platform that doesn't have this > requirement. I plan to run the zImage on the second platform (the one > without the DSP requirement). The bootloader I'm running this zImage on > has no idea that I've compiled in support for the other platform with > the DSP requirement so it assumes it can load the zImage at the start of > RAM (0x0) plus 32K. This is bad because then the page tables get written > into my compressed data and it fails to decompress. I've looked at the code and I think that #1 in your initial options is probably best here. I agree with Russell about #2 being way too complex for only this case. So, right before calling into cache_on, you could test if r4 - 16K >= pc and r4 < pc + (_end - .) then skip cache_on. Something like this untested patch: diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 9a94f344df..9e0dbbccdd 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S @@ -182,7 +182,16 @@ not_angel: ldr r4, =zreladdr #endif - bl cache_on + /* Set up a page table only if we don't overwrite ourself */ + ldr r0, 1f + add r0, r0, pc + cmp r4, r0 + mov r0, pc + cmpcc r0, r4 + blcs cache_on + b restart + .align 2 +1: .word _end - . + 0x4000 restart: adr r0, LC0 ldmia r0, {r1, r2, r3, r6, r10, r11, r12} -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html