From 26bdac55ebda7e358c915aeb0711280066de2c7c Mon Sep 17 00:00:00 2001 From: Cole Faust Date: Tue, 19 Nov 2024 13:37:53 -0800 Subject: Add partition size check to boot partitions Since android devices are partitioned at the factory and the partitions can't be resized aftwards, make allows you to specify that partition size and asserts that the contents don't exceed it. Soong also needed this check. Bug: 377562951 Test: Manually modified BOARD_BOOTIMAGE_PARTITION_SIZE to test the warning and error Change-Id: I2368b350fb99c4055b14baa84b4964012f4934ef --- filesystem/bootimg.go | 8 ++++++++ filesystem/filesystem.go | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+) (limited to 'filesystem') diff --git a/filesystem/bootimg.go b/filesystem/bootimg.go index ab91eb4fa..5aa60d2ae 100644 --- a/filesystem/bootimg.go +++ b/filesystem/bootimg.go @@ -67,6 +67,10 @@ type BootimgProperties struct { // and `header_version` is greater than or equal to 4. Bootconfig *string `android:"arch_variant,path"` + // The size of the partition on the device. It will be a build error if this built partition + // image exceeds this size. + Partition_size *int64 + // When set to true, sign the image with avbtool. Default is false. Use_avb *bool @@ -216,6 +220,10 @@ func (b *bootimg) buildBootImage(ctx android.ModuleContext, vendor bool) android } cmd.FlagWithOutput(flag, output) + if b.properties.Partition_size != nil { + assertMaxImageSize(builder, output, *b.properties.Partition_size, proptools.Bool(b.properties.Use_avb)) + } + builder.Build("build_bootimg", fmt.Sprintf("Creating %s", b.BaseModuleName())) return output } diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index 28cec2715..dadacae3d 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -926,3 +926,26 @@ func (f *filesystem) getLibsForLinkerConfig(ctx android.ModuleContext) ([]androi return provideModules, requireModules } + +// Checks that the given file doesn't exceed the given size, and will also print a warning +// if it's nearing the maximum size. Equivalent to assert-max-image-size in make: +// https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/definitions.mk;l=3455;drc=993c4de29a02a6accd60ceaaee153307e1a18d10 +func assertMaxImageSize(builder *android.RuleBuilder, image android.Path, maxSize int64, addAvbLater bool) { + if addAvbLater { + // The value 69632 is derived from MAX_VBMETA_SIZE + MAX_FOOTER_SIZE in avbtool. + // Logic copied from make: + // https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/Makefile;l=228;drc=a6a0007ef24e16c0b79f439beac4a118416717e6 + maxSize -= 69632 + } + cmd := builder.Command() + cmd.Textf(`file="%s"; maxsize="%d";`+ + `total=$(stat -c "%%s" "$file" | tr -d '\n');`+ + `if [ "$total" -gt "$maxsize" ]; then `+ + ` echo "error: $file too large ($total > $maxsize)";`+ + ` false;`+ + `elif [ "$total" -gt $((maxsize - 32768)) ]; then `+ + ` echo "WARNING: $file approaching size limit ($total now; limit $maxsize)";`+ + `fi`, + image, maxSize) + cmd.Implicit(image) +} -- cgit v1.2.3-59-g8ed1b