Martin Roth (martin.roth@se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/2628
-gerrit
commit fbf6dec9b1ef73fa6d113cc87415e4fd0ac3844b Author: Martin Roth martin.roth@se-eng.com Date: Mon Mar 11 13:17:27 2013 -0600
AMD hudson & SB800 - Fix issues with mawk
When calculating the offsets of the various binary blobs within the coreboot.rom file, we noticed that using mawk as the awk tool instead of using gawk led to build issues. This was finally traced to the maximum value of the unsigned long variables within mawk - 0x7fff_ffff. Because we were doing calculations on values up in the 0xfffcxxxx range, these numbers would either be turned into floating point values and printed using scientific notation, or truncated at 0x7fff_ffff.
I see two solutions to this issue - we can either check for mawk and warn the user that it's not supported in a fashion similar to what is already being done for the solaris awk and suggest that everyone use gawk instead, or we can work around the issue. I tried to work around it by getting rid of the top 0xF000_0000 when doing the calculations in awk, then adding it back when the final values are loaded into the final variables for the make.
The downside to this approach is that we could run into this error again in the future for anyone who uses mawk.
Change-Id: I7b6b821c8ab13ad11f72e674ac726a98e8678710 Signed-off-by: Martin Roth martin.roth@se-eng.com --- src/southbridge/amd/agesa/hudson/Makefile.inc | 21 +++++++++++++++------ src/southbridge/amd/cimx/sb800/Makefile.inc | 9 +++++++-- 2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/src/southbridge/amd/agesa/hudson/Makefile.inc b/src/southbridge/amd/agesa/hudson/Makefile.inc index 18a0ffb..fb45b90 100644 --- a/src/southbridge/amd/agesa/hudson/Makefile.inc +++ b/src/southbridge/amd/agesa/hudson/Makefile.inc @@ -22,10 +22,17 @@ ramstage-$(CONFIG_HAVE_ACPI_RESUME) += spi.c # EC ROM should be 64K aligned. HUDSON_FWM_POSITION=$(shell printf %u $(CONFIG_HUDSON_FWM_POSITION))
+#MAWK's limit for unsigned long is 0x7FFF_FFFF. To work around this, remove +#the top 0xF000_0000 (4026531840) from the calculation and add it back later +#in in the print statements when assigning the positions. +HUDSON_FWM_POS__TRUNC=$(shell echo $(CONFIG_HUDSON_FWM_POSITION) \ + | awk '{print $$1 - 4026531840}') + #assume the cbfs header is less than 128 bytes. ROMSIG_SIZE=16 ifeq ($(CONFIG_HUDSON_XHCI_FWM), y) -HUDSON_XHCI_POSITION=$(shell echo $(HUDSON_FWM_POSITION) $(ROMSIG_SIZE) 128 | awk '{print $$1 + $$2 + $$3}') +HUDSON_XHCI_POSITION=$(shell echo $(HUDSON_FWM_POS__TRUNC) $(ROMSIG_SIZE) 128 \ + | awk '{printf("0xF%X", $$1 + $$2 + $$3)}') XHCI_FWM_SIZE=$(word 5,$(shell ls -l $(CONFIG_HUDSON_XHCI_FWM_FILE))) else HUDSON_XHCI_POSITION=0 @@ -33,8 +40,9 @@ XHCI_FWM_SIZE=0 endif
ifeq ($(CONFIG_HUDSON_GEC_FWM), y) -HUDSON_GEC_POSITION=$(shell echo $(HUDSON_FWM_POSITION) $(ROMSIG_SIZE) 128 \ - $(XHCI_FWM_SIZE) 128 | awk '{print $$1 + $$2 + $$3 + $$4 + $$5}') +HUDSON_GEC_POSITION=$(shell echo $(HUDSON_FWM_POS__TRUNC) $(ROMSIG_SIZE) 128 \ + $(XHCI_FWM_SIZE) 128 | \ + awk '{printf("0xF%X", $$1 + $$2 + $$3 + $$4 + $$5)}') GEC_FWM_SIZE=$(word 5,$(shell ls -l $(CONFIG_HUDSON_GEC_FWM_FILE))) else HUDSON_GEC_POSITION=0 @@ -42,10 +50,11 @@ GEC_FWM_SIZE=0 endif
ifeq ($(CONFIG_HUDSON_IMC_FWM), y) -HUDSON_IMC_POSITION_UNALIGN=$(shell echo $(HUDSON_FWM_POSITION) $(ROMSIG_SIZE) 128 \ - $(XHCI_FWM_SIZE) 128 \ +HUDSON_IMC_POSITION_UNALIGN=$(shell echo $(HUDSON_FWM_POS__TRUNC) \ + $(ROMSIG_SIZE) 128 $(XHCI_FWM_SIZE) 128 \ $(GEC_FWM_SIZE) 128 65535 | awk '{print $$1 + $$2 + $$3 + $$4 + $$5 + $$6 + $$7 + $$8}') -HUDSON_IMC_POSITION=$(shell echo $(HUDSON_IMC_POSITION_UNALIGN) | awk '{print $$1 - $$1 % 65536}') +HUDSON_IMC_POSITION=$(shell echo $(HUDSON_IMC_POSITION_UNALIGN) \ + | awk '{printf("0xF%X", $$1 - $$1 % 65536)}') else HUDSON_IMC_POSITION=0 endif diff --git a/src/southbridge/amd/cimx/sb800/Makefile.inc b/src/southbridge/amd/cimx/sb800/Makefile.inc index 4041b22..6e6da21 100644 --- a/src/southbridge/amd/cimx/sb800/Makefile.inc +++ b/src/southbridge/amd/cimx/sb800/Makefile.inc @@ -70,8 +70,13 @@ SB800_FWM_POSITION=$(shell printf %u $(CONFIG_SB800_FWM_POSITION)) #assume the cbfs header is less than 128 bytes. ROMSIG_SIZE=16
-SB800_IMC_POSITION_UNALIGN=$(shell echo $(SB800_FWM_POSITION) $(ROMSIG_SIZE) 128 65535 | awk '{print $$1 + $$2 + $$3 + $$4}') -SB800_IMC_POSITION=$(shell echo $(SB800_IMC_POSITION_UNALIGN) | awk '{print $$1 - $$1 % 65536}') +#MAWK's limit for unsigned long is 0x7FFF_FFFF. To work around this, remove +#the top 0xF000_0000 (4026531840) from the calculation and add it back in the +#printf later. +SB800_IMC_POSITION_UNALIGN=$(shell echo $(SB800_FWM_POSITION) $(ROMSIG_SIZE) \ + 128 65535 | awk '{print $$1 - 4026531840 + $$2 + $$3 + $$4}') +SB800_IMC_POSITION=$(shell echo $(SB800_IMC_POSITION_UNALIGN) \ + | awk '{printf ("0xF%X", $$1 - $$1 % 65536)}')
$(obj)/coreboot_SB800_romsig.bin: \ $(call strip_quotes, $(CONFIG_SB800_IMC_FWM_FILE)) \