diff mbox

[U-Boot] cmd: booti: fix the image runtime location

Message ID 1473671278-23831-1-git-send-email-peng.fan@nxp.com
State Changes Requested
Delegated to: Tom Rini
Headers show

Commit Message

Peng Fan Sept. 12, 2016, 9:07 a.m. UTC
We should not use "bi_dram[0].start + text_offset" as the image dst.
The text_offset maybe 0 for some images, such as XEN. Then the dst
is actually bi_dram[0].start, which maybe the location of spin table.

Let's use "images->ep & ~(ih->text_offset)" as the dst address.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Tom Rini <trini@konsulko.com>
---
 cmd/booti.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Peng Fan Sept. 12, 2016, 9:18 a.m. UTC | #1
On Mon, Sep 12, 2016 at 05:07:58PM +0800, Peng Fan wrote:
>We should not use "bi_dram[0].start + text_offset" as the image dst.
>The text_offset maybe 0 for some images, such as XEN. Then the dst
>is actually bi_dram[0].start, which maybe the location of spin table.
>
>Let's use "images->ep & ~(ih->text_offset)" as the dst address.

This patch maybe not that correct according to the doc from Linux kernel.
"
The Image must be placed text_offset bytes from a 2MB aligned base
address anywhere in usable system RAM and called there. The region
between the 2 MB aligned base address and the start of the image has no
special significance to the kernel, and may be used for other purposes.
"

Now I do not have a good idea that we may have a spin table in the start
of DRAM or even a small firmware.

Is it better to change gd->bd->bi_dram[0].start?
For example physical dram starts from 0x80000000, but 4K is reserved at the beginning.
So is it ok to change gd->bd->bi_dram[0].start to 0x80001000?

Thanks,
Peng.

>
>Signed-off-by: Peng Fan <peng.fan@nxp.com>
>Cc: Tom Rini <trini@konsulko.com>
>---
> cmd/booti.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
>diff --git a/cmd/booti.c b/cmd/booti.c
>index 6c1c998..afc87e3 100644
>--- a/cmd/booti.c
>+++ b/cmd/booti.c
>@@ -54,7 +54,9 @@ static int booti_setup(bootm_headers_t *images)
> 	 * If we are not at the correct run-time location, set the new
> 	 * correct location and then move the image there.
> 	 */
>-	dst = gd->bd->bi_dram[0].start + le64_to_cpu(ih->text_offset);
>+	dst = images->ep & ~(ih->text_offset);
>+	if (dst < gd->bd->bi_dram[0].start)
>+		dst = gd->bd->bi_dram[0].start + le64_to_cpu(ih->text_offset);
> 
> 	unmap_sysmem(ih);
> 
>-- 
>2.6.2
>
Tom Rini Sept. 12, 2016, 12:04 p.m. UTC | #2
On Mon, Sep 12, 2016 at 05:18:53PM +0800, Peng Fan wrote:
> On Mon, Sep 12, 2016 at 05:07:58PM +0800, Peng Fan wrote:
> >We should not use "bi_dram[0].start + text_offset" as the image dst.
> >The text_offset maybe 0 for some images, such as XEN. Then the dst
> >is actually bi_dram[0].start, which maybe the location of spin table.
> >
> >Let's use "images->ep & ~(ih->text_offset)" as the dst address.
> 
> This patch maybe not that correct according to the doc from Linux kernel.
> "
> The Image must be placed text_offset bytes from a 2MB aligned base
> address anywhere in usable system RAM and called there. The region
> between the 2 MB aligned base address and the start of the image has no
> special significance to the kernel, and may be used for other purposes.
> "
> 
> Now I do not have a good idea that we may have a spin table in the start
> of DRAM or even a small firmware.
> 
> Is it better to change gd->bd->bi_dram[0].start?
> For example physical dram starts from 0x80000000, but 4K is reserved at the beginning.
> So is it ok to change gd->bd->bi_dram[0].start to 0x80001000?

So, to be more precise, with v4.5 the memory location restrictions were
relaxed.  So we first need to update cmd/booti.c to know that res1 is
now 'flags' and that we must check bit3 to determine where / how to
align the image.  In the case of bit3 == 0 we must continue to do what
we do today.  In the case of bit3 == 1, we have to decide what exactly
to do.  My first thought is to see if images->ep is 2MB aligned and if
so move to images->ep + ih->text_offset.  If not 2MB aligned, align that
and then add ih->text_offset.

Then any areas that need to be reserved in memory, wherever they are,
can still be marked off as reserved in the DT.
diff mbox

Patch

diff --git a/cmd/booti.c b/cmd/booti.c
index 6c1c998..afc87e3 100644
--- a/cmd/booti.c
+++ b/cmd/booti.c
@@ -54,7 +54,9 @@  static int booti_setup(bootm_headers_t *images)
 	 * If we are not at the correct run-time location, set the new
 	 * correct location and then move the image there.
 	 */
-	dst = gd->bd->bi_dram[0].start + le64_to_cpu(ih->text_offset);
+	dst = images->ep & ~(ih->text_offset);
+	if (dst < gd->bd->bi_dram[0].start)
+		dst = gd->bd->bi_dram[0].start + le64_to_cpu(ih->text_offset);
 
 	unmap_sysmem(ih);