Skip to contentSkip to conversation

x86: ifdtool: Support checking region overlap before U-Boot

PATCH New Bin Meng 3 participants 10 messages Aug 27, 2015 – Sep 1, 2015 1 message not in the archive

lore
Share & tools
lore

Bin Meng

author
#0 lore raw

PATCH 1/3 x86: ifdtool: Support checking region overlap before U-Boot

We have the capability to check regions written after U-Boot that do not overlap. Since regions can also be written before U-Boot, add such check for these too.

---

 tools/ifdtool.c | 66 ++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 46 insertions(+), 20 deletions(-)
tools/ifdtool.c +46 -20
index 1f95203..48059c0 100644
@@ -707,10 +707,12 @@ int inject_region(char *image, int size, int region_type, char *region_fname)
  *			8MB ROM the start address is 0xfff80000.
  * @write_fname:	Filename to add to the image
  * @offset_uboot_top:	Offset of the top of U-Boot
+ * @offset_uboot_start:	Offset of the start of U-Boot
  * @return number of bytes written if OK, -ve on error
  */
 static int write_data(char *image, int size, unsigned int addr,
-		      const char *write_fname, int offset_uboot_top)
+		      const char *write_fname, int offset_uboot_top,
+		      int offset_uboot_start)
 {
 	int write_fd, write_size;
 	int offset;
@@ -720,13 +722,25 @@ static int write_data(char *image, int size, unsigned int addr,
 		return write_fd;
 
 	offset = (uint32_t)(addr + size);
-	if (offset_uboot_top && offset_uboot_top >= offset) {
-		fprintf(stderr, "U-Boot image overlaps with region '%s'\n",
-			write_fname);
-		fprintf(stderr,
-			"U-Boot finishes at offset %x, file starts at %x\n",
-			offset_uboot_top, offset);
-		return -EXDEV;
+	if (offset_uboot_top) {
+		if (offset_uboot_start < offset &&
+		    offset_uboot_top >= offset) {
+			fprintf(stderr, "U-Boot image overlaps with region '%s'\n",
+				write_fname);
+			fprintf(stderr,
+				"U-Boot finishes at offset %x, file starts at %x\n",
+				offset_uboot_top, offset);
+			return -EXDEV;
+		}
+		if (offset_uboot_start > offset &&
+		    offset_uboot_start <= offset + write_size) {
+			fprintf(stderr, "U-Boot image overlaps with region '%s'\n",
+				write_fname);
+			fprintf(stderr,
+				"U-Boot starts at offset %x, file finishes@%x\n",
+				offset_uboot_start, offset + write_size);
+			return -EXDEV;
+		}
 	}
 	debug("Writing %s to offset %#x\n", write_fname, offset);
 
@@ -927,27 +941,36 @@ static int write_ucode(char *image, int size, struct input_file *fdt,
  */
 static int write_uboot(char *image, int size, struct input_file *uboot,
 		       struct input_file *fdt, unsigned int ucode_ptr,
-		       int collate_ucode)
+		       int collate_ucode, int *offset_uboot_top,
+		       int *offset_uboot_start)
 {
-	const void *blob;
 	int uboot_size, fdt_size;
+	int uboot_top;
 
-	uboot_size = write_data(image, size, uboot->addr, uboot->fname, 0);
+	uboot_size = write_data(image, size, uboot->addr, uboot->fname, 0, 0);
 	if (uboot_size < 0)
 		return uboot_size;
 	fdt->addr = uboot->addr + uboot_size;
 	debug("U-Boot size %#x, FDT at %#x\n", uboot_size, fdt->addr);
-	fdt_size = write_data(image, size, fdt->addr, fdt->fname, 0);
+	fdt_size = write_data(image, size, fdt->addr, fdt->fname, 0, 0);
 	if (fdt_size < 0)
 		return fdt_size;
-	blob = (void *)image + (uint32_t)(fdt->addr + size);
+
+	uboot_top = (uint32_t)(fdt->addr + size) + fdt_size;
 
 	if (ucode_ptr) {
-		return write_ucode(image, size, fdt, fdt_size, ucode_ptr,
-				   collate_ucode);
+		uboot_top = write_ucode(image, size, fdt, fdt_size, ucode_ptr,
+					collate_ucode);
+		if (uboot_top < 0)
+			return uboot_top;
 	}
 
-	return ((char *)blob + fdt_size) - image;
+	if (offset_uboot_top && offset_uboot_start) {
+		*offset_uboot_top = uboot_top;
+		*offset_uboot_start = (uint32_t)(uboot->addr + size);
+	}
+
+	return 0;
 }
 
 static void print_version(void)
@@ -1268,13 +1291,14 @@ int main(int argc, char *argv[])
 	}
 
 	if (mode_write_descriptor)
-		ret = write_data(image, size, -size, desc_fname, 0);
+		ret = write_data(image, size, -size, desc_fname, 0, 0);
 
 	if (mode_inject)
 		ret = inject_region(image, size, region_type, inject_fname);
 
 	if (mode_write) {
 		int offset_uboot_top = 0;
+		int offset_uboot_start = 0;
 
 		for (wr_idx = 0; wr_idx < wr_num; wr_idx++) {
 			ifile = &input_file[wr_idx];
@@ -1282,11 +1306,13 @@ int main(int argc, char *argv[])
 				continue;
 			} else if (ifile->type == IF_uboot) {
 				ret = write_uboot(image, size, ifile, fdt,
-						  ucode_ptr, collate_ucode);
-				offset_uboot_top = ret;
+						  ucode_ptr, collate_ucode,
+						  &offset_uboot_top,
+						  &offset_uboot_start);
 			} else {
 				ret = write_data(image, size, ifile->addr,
-					 ifile->fname, offset_uboot_top);
+						 ifile->fname, offset_uboot_top,
+						 offset_uboot_start);
 			}
 			if (ret < 0)
 				break;
Signature · 1 line
1.8.2.1
author
#1 lore raw

PATCH 2/3 x86: doc: Change to use CONFIG_VGA_BIOS_ADDR

CONFIG_X86_OPTION_ROM_ADDR has been renamed to CONFIG_VGA_BIOS_ADDR. Update the doc to refer to the new name.

---

 doc/README.x86 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
doc/README.x86 +1 -1
index 3bab5cf..5f9c46f 100644
@@ -189,7 +189,7 @@ Offset   Description         Controlling config
 001000   me.bin              Set by the descriptor
 500000   <spare>
 700000   u-boot-dtb.bin      CONFIG_SYS_TEXT_BASE
-790000   vga.bin             CONFIG_X86_OPTION_ROM_ADDR
+790000   vga.bin             CONFIG_VGA_BIOS_ADDR
 7c0000   fsp.bin             CONFIG_FSP_ADDR
 7f8000   <spare>             (depends on size of fsp.bin)
 7fe000   Environment         CONFIG_ENV_OFFSET
Signature · 1 line
1.8.2.1
#3 lore raw

PATCH 2/3 x86: doc: Change to use CONFIG_VGA_BIOS_ADDR

Quoted 7 lines · Simon Glass
Quoted 6 lines · Bin Meng

CONFIG_X86_OPTION_ROM_ADDR has been renamed to CONFIG_VGA_BIOS_ADDR. Update the doc to refer to the new name.

---

Quoted 6 lines
Quoted 2 lines
 doc/README.x86 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Tested on Minnowmax:

Applied to u-boot-x86, thanks!

author
#4 lore raw

PATCH 3/3 x86: bayleybay: Change default vga bios rom address

In reply to Bin Meng

With multiple microcode blobs included, the generated u-boot-dtb.bin leaves merely several hundred bytes before the vga bios. Change the vga bios rom address to make a bigger room for u-boot-dtb.bin.

---

 configs/bayleybay_defconfig | 1 +
 1 file changed, 1 insertion(+)
configs/bayleybay_defconfig +1 -0
index 13bd282..766576d 100644
@@ -5,6 +5,7 @@ CONFIG_TARGET_BAYLEYBAY=y
 CONFIG_HAVE_INTEL_ME=y
 CONFIG_SMP=y
 CONFIG_HAVE_VGA_BIOS=y
+CONFIG_VGA_BIOS_ADDR=0xfffa0000
 CONFIG_GENERATE_PIRQ_TABLE=y
 CONFIG_GENERATE_MP_TABLE=y
 CONFIG_CMD_CPU=y
Signature · 1 line
1.8.2.1
#5 lore raw

PATCH 3/3 x86: bayleybay: Change default vga bios rom address

Quoted 9 lines · Bin Meng

With multiple microcode blobs included, the generated u-boot-dtb.bin leaves merely several hundred bytes before the vga bios. Change the vga bios rom address to make a bigger room for u-boot-dtb.bin.

---

 configs/bayleybay_defconfig | 1 +
 1 file changed, 1 insertion(+)

Tested on Minnowmax:

#6 lore raw

PATCH 3/3 x86: bayleybay: Change default vga bios rom address

Quoted 8 lines · Simon Glass
Quoted 7 lines · Bin Meng

With multiple microcode blobs included, the generated u-boot-dtb.bin leaves merely several hundred bytes before the vga bios. Change the vga bios rom address to make a bigger room for u-boot-dtb.bin.

---

Quoted 6 lines
Quoted 2 lines
 configs/bayleybay_defconfig | 1 +
 1 file changed, 1 insertion(+)

Tested on Minnowmax:

Applied to u-boot-x86, thanks!

#7 lore raw

PATCH 1/3 x86: ifdtool: Support checking region overlap before U-Boot

In reply to Bin Meng

Bin wrote...

Quoted 6 lines

We have the capability to check regions written after U-Boot that do not overlap. Since regions can also be written before U-Boot, add such check for these too.

---

This fixes the issue I raised this morning with building the .rom file for Galileo with the latest master, so:

Regards,

Andy.

A message that is not in the archive (sent off-list or not yet received): [email protected]

#9 lore raw

PATCH 1/3 x86: ifdtool: Support checking region overlap before U-Boot

Quoted 6 lines · Andy Pont

Bin wrote...

Quoted 4 lines

We have the capability to check regions written after U-Boot that do not overlap. Since regions can also be written before U-Boot, add such check for these too.

Quoted 7 lines
Quoted 2 lines

---

This fixes the issue I raised this morning with building the .rom file for Galileo with the latest master, so:

Tested on Minnowmax:

#10 lore raw

PATCH 1/3 x86: ifdtool: Support checking region overlap before U-Boot

Quoted 10 lines · Simon Glass
Quoted 9 lines · Andy Pont

Bin wrote...

Quoted 6 lines

We have the capability to check regions written after U-Boot that do not overlap. Since regions can also be written before U-Boot, add such check for these too.

---

Quoted 8 lines
Quoted 4 lines

This fixes the issue I raised this morning with building the .rom file for Galileo with the latest master, so:

Tested on Minnowmax:

Applied to u-boot-x86, thanks!