Skip to contentSkip to conversation

cmd: booti: fix the image runtime location

PATCH New Peng Fan 2 participants 5 messages Sep 12, 2016 – Sep 13, 2016

lore
Share & tools
lore

Peng Fan

author
#0 lore raw

PATCH 1/1 cmd: booti: fix the image runtime location

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.

---
 cmd/booti.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
cmd/booti.c +3 -1
index 6c1c998..afc87e3 100644
@@ -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);
 
Signature · 1 line
2.6.2
author
#1 lore raw

PATCH 1/1 cmd: booti: fix the image runtime location

Quoted 5 lines · Peng Fan

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.

Quoted 25 lines

---
cmd/booti.c | 4 +++-

1 file changed, 3 insertions(+), 1 deletion(-)
cmd/booti.c +3 -1
index 6c1c998..afc87e3 100644
@@ -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);
 
Signature · 1 line
2.6.2
#2 lore raw

PATCH 1/1 cmd: booti: fix the image runtime location

Quoted 15 lines · Peng Fan
Quoted 5 lines · Peng Fan

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. "

Quoted 6 lines

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.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160912/1a5ff6e4/attachment.sig>
author
#3 lore raw

PATCH 1/1 cmd: booti: fix the image runtime location

Hi Tom,

Quoted 32 lines · Tom Rini
Quoted 15 lines · Peng Fan
Quoted 5 lines · Peng Fan

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. "

Quoted 6 lines

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.

Quoted 2 lines

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

How about the following patch?
If it is ok, I'll send out a formal one.

cmd/booti.c +7 -2
index 6c1c998..efa8bc8 100644
@@ -20,7 +20,7 @@ struct Image_header {
 	uint32_t	code1;		/* Executable code */
 	uint64_t	text_offset;	/* Image load offset, LE */
 	uint64_t	image_size;	/* Effective Image size, LE */
-	uint64_t	res1;		/* reserved */
+	uint64_t	flags;		/* Information flags, LE */
 	uint64_t	res2;		/* reserved */
 	uint64_t	res3;		/* reserved */
 	uint64_t	res4;		/* reserved */
@@ -29,6 +29,7 @@ struct Image_header {
 };
 
 #define LINUX_ARM64_IMAGE_MAGIC	0x644d5241
+#define LINUX_PHYSICAL_PLACEMENT (0x1 << 3)
 
 static int booti_setup(bootm_headers_t *images)
 {
@@ -54,7 +55,11 @@ static int booti_setup(bootm_headers_t *images)
 	 * If we are not@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 = gd->bd->bi_dram[0].start;
+	if (le64_to_cpu(ih->flags) & LINUX_PHYSICAL_PLACEMENT)
+		dst = round_up(images->ep, SZ_2M);
+
+	dst += le64_to_cpu(ih->text_offset);
 
 	unmap_sysmem(ih);
 

Thanks,
Peng.

Quoted 3 lines
Signature · 2 lines
-- 
Tom
#4 lore raw

PATCH 1/1 cmd: booti: fix the image runtime location

Quoted 35 lines · Peng Fan

Hi Tom,

Quoted 32 lines · Tom Rini
Quoted 15 lines · Peng Fan
Quoted 5 lines · Peng Fan

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. "

Quoted 6 lines

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.

Quoted 6 lines
Quoted 2 lines

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

How about the following patch?
If it is ok, I'll send out a formal one.

Pretty close:

Quoted 15 lines
cmd/booti.c +1 -1
index 6c1c998..efa8bc8 100644
@@ -20,7 +20,7 @@ struct Image_header {
 	uint32_t	code1;		/* Executable code */
 	uint64_t	text_offset;	/* Image load offset, LE */
 	uint64_t	image_size;	/* Effective Image size, LE */
-	uint64_t	res1;		/* reserved */
+	uint64_t	flags;		/* Information flags, LE */
 	uint64_t	res2;		/* reserved */
 	uint64_t	res3;		/* reserved */
 	uint64_t	res4;		/* reserved */

cmd/booti.c struct Image_header { · line 32

Quoted 4 lines
cmd/booti.c +1 -0
@@ -29,6 +29,7 @@ struct Image_header {
 };
 
 #define LINUX_ARM64_IMAGE_MAGIC	0x644d5241
+#define LINUX_PHYSICAL_PLACEMENT (0x1 << 3)

Just '1' not '0x1'

cmd/booti.c static int booti_setup(bootm_headers_t *images) · line 60

Quoted 11 lines
cmd/booti.c +3 -1
 static int booti_setup(bootm_headers_t *images)
 {
@@ -54,7 +55,11 @@ 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 = gd->bd->bi_dram[0].start;
+	if (le64_to_cpu(ih->flags) & LINUX_PHYSICAL_PLACEMENT)
+		dst = round_up(images->ep, SZ_2M);

Can you do this as if/else and expand the comment so that it explains that earlier it was recommended to be as close to the start of memory as possible but later a flag was introduced to allow a more flexible placement? Thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160913/d95dab95/attachment.sig>