summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-11-19 23:59:07 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2024-11-19 23:59:07 +0000
commitebf7c1f33fe280d032c6aeb281b51e23dddb2383 (patch)
treea1277c4daabfb67090fdc2c28940ee3b4198d025
parent517c6f81fde092448f27feb13355e5f6f8f6661b (diff)
parent26bdac55ebda7e358c915aeb0711280066de2c7c (diff)
Merge "Add partition size check to boot partitions" into main
-rw-r--r--filesystem/bootimg.go8
-rw-r--r--filesystem/filesystem.go23
-rw-r--r--fsgen/boot_imgs.go10
3 files changed, 41 insertions, 0 deletions
diff --git a/filesystem/bootimg.go b/filesystem/bootimg.go
index 13c6a46fe..22495064d 100644
--- a/filesystem/bootimg.go
+++ b/filesystem/bootimg.go
@@ -73,6 +73,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
@@ -260,6 +264,10 @@ func (b *bootimg) buildBootImage(ctx android.ModuleContext) android.Path {
}
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)
+}
diff --git a/fsgen/boot_imgs.go b/fsgen/boot_imgs.go
index 8b7b94cc5..630aaff00 100644
--- a/fsgen/boot_imgs.go
+++ b/fsgen/boot_imgs.go
@@ -36,6 +36,15 @@ func createBootImage(ctx android.LoadHookContext) bool {
},
)
+ var partitionSize *int64
+ if partitionVariables.BoardBootimagePartitionSize != "" {
+ parsed, err := strconv.ParseInt(partitionVariables.BoardBootimagePartitionSize, 10, 64)
+ if err != nil {
+ panic(fmt.Sprintf("BOARD_BOOTIMAGE_PARTITION_SIZE must be an int, got %s", partitionVariables.BoardBootimagePartitionSize))
+ }
+ partitionSize = &parsed
+ }
+
bootImageName := generatedModuleNameForPartition(ctx.Config(), "boot")
ctx.CreateModule(
@@ -43,6 +52,7 @@ func createBootImage(ctx android.LoadHookContext) bool {
&filesystem.BootimgProperties{
Kernel_prebuilt: proptools.StringPtr(":" + kernelFilegroupName),
Header_version: proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
+ Partition_size: partitionSize,
},
&struct {
Name *string