[coreboot] What does ALIGN mean in "cbfstool locate"
Bao, Zheng
Zheng.Bao at amd.com
Wed Feb 23 09:45:13 CET 2011
In src/arch/x86/Makefile.bootblock.inc:
#######################################################################
75 # Build the romstage
76 $(obj)/coreboot.romstage: $(obj)/coreboot.pre1 $$(romstage-objs)
$(obj)/romstage/ldscript.ld
77 @printf " LINK $(subst $(obj)/,,$(@))\n"
78 printf "CONFIG_ROMBASE = 0x0;\nAUTO_XIP_ROM_BASE = 0x0;\n" >
$(obj)/location.ld
79 $(CC) -nostdlib -nostartfiles -static -o $(obj)/romstage.elf
-L$(obj) -T $(obj)/romstage/ldscript.ld $(romstage-objs)
80 $(OBJCOPY) -O binary $(obj)/romstage.elf $(obj)/romstage.bin
81 printf "CONFIG_ROMBASE = 0x" > $(obj)/location.ld
82 $(CBFSTOOL) $(obj)/coreboot.pre1 locate $(obj)/romstage.bin
$(CONFIG_CBFS_PREFIX)/romstage $(CONFIG_XIP_ROM_SIZE) >
$(obj)/location.txt
83 cat $(obj)/location.txt >> $(obj)/location.ld
84 printf ';\nAUTO_XIP_ROM_BASE = CONFIG_ROMBASE &
~(CONFIG_XIP_ROM_SIZE - 1);\n' >> $(obj)/location.ld
85 $(CC) -nostdlib -nostartfiles -static -o $(obj)/romstage.elf
-L$(obj) -T $(obj)/romstage/ldscript.ld $(romstage-objs)
86 $(NM) -n $(obj)/romstage.elf | sort > $(obj)/romstage.map
87 $(OBJCOPY) --only-keep-debug $(obj)/romstage.elf
$(obj)/romstage.debug
88 $(OBJCOPY) --strip-debug $(obj)/romstage.elf
89 $(OBJCOPY) --add-gnu-debuglink=$(obj)/romstage.debug
$(obj)/romstage.elf
90 $(OBJCOPY) -O binary $(obj)/romstage.elf $@
We can see how the romstage is built.
At the line 82, the cbfstool locates a space in the image, using
$(CONFIG_XIP_ROM_SIZE) as parameter ALIGN. In my building, the
$(CONFIG_XIP_ROM_SIZE)
is 0x80000. So the romstage should align at 0x80000, correct?
But my final image is:
Name offset Type size
cmos_layout.bin 0x0 unknown 1775
pci1002,9615.rom 0x740 optionrom 60416
fallback/romstage 0xf380 stage 99192
fallback/coreboot_ram 0x27740 stage 57274
fallback/payload 0x35740 payload 38442
(empty) 0x3edc0 null 789990
Obviously the romstage is not aligned to 0x80000.
So I take a look at the file
Util/cbfstool/common.c
uint32_t cbfs_find_location(const char *romfile, uint32_t filesize,
440 const char *filename, uint32_t
alignment)
441 {
442 void *rom = loadrom(romfile);
443 int filename_size = strlen(filename);
444
445 int headersize =
446 sizeof(struct cbfs_file) + ALIGN(filename_size + 1,
447 16) + sizeof(struct
cbfs_stage);
448 int totalsize = headersize + filesize;
449
450 uint32_t current = phys_start;
451 while (current < phys_end) {
452 if (!cbfs_file_header(current)) {
453 current += align;
454 continue;
455 }
456 struct cbfs_file *thisfile =
457 (struct cbfs_file *)phys_to_virt(current);
458
459 uint32_t top =
460 current + ntohl(thisfile->len) +
ntohl(thisfile->offset);
461 if (((ntohl(thisfile->type) == 0x0)
462 || (ntohl(thisfile->type) == 0xffffffff))
463 && (ntohl(thisfile->len) +
ntohl(thisfile->offset) >=
464 totalsize)) {
465 if (in_segment
466 (current + headersize, filesize,
alignment))
467 return current + headersize;
468 if ((ALIGN(current, alignment) + filesize <
top)
469 && (ALIGN(current, alignment) -
headersize >
470 current)
471 && in_segment(ALIGN(current, alignment),
filesize,
472 alignment))
473 return ALIGN(current, alignment);
474 if ((ALIGN(current, alignment) + alignment +
filesize <
475 top)
476 && (ALIGN(current, alignment) +
alignment -
477 headersize > current)
478 && in_segment(ALIGN(current, alignment)
+ alignment,
479 filesize, alignment))
480 return ALIGN(current, alignment) +
alignment;
481 }
482 current =
483 ALIGN(current + ntohl(thisfile->len) +
484 ntohl(thisfile->offset), align);
485 }
486 return 0;
487 }
The code between 465 and 467 is confusing. Why doesn't it align to
alignment? What if we delete these 3 lines?
Where am I wrong in the whole analysis?
Zheng
More information about the coreboot
mailing list