blob: 6647a9a4d63dc4ad165e1f6b535296729f8adc91 [file] [log] [blame]
Cole Faustf2a6e8b2024-11-14 10:54:48 -08001package fsgen
2
3import (
4 "android/soong/android"
5 "android/soong/filesystem"
Cole Faust24938e22024-11-18 14:01:58 -08006 "fmt"
Cole Faustf2a6e8b2024-11-14 10:54:48 -08007 "path/filepath"
Cole Faust24938e22024-11-18 14:01:58 -08008 "strconv"
Cole Faustf2a6e8b2024-11-14 10:54:48 -08009
10 "github.com/google/blueprint/proptools"
11)
12
13func createBootImage(ctx android.LoadHookContext) bool {
14 partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
15
16 if partitionVariables.TargetKernelPath == "" {
17 // There are potentially code paths that don't set TARGET_KERNEL_PATH
18 return false
19 }
20
21 kernelDir := filepath.Dir(partitionVariables.TargetKernelPath)
22 kernelBase := filepath.Base(partitionVariables.TargetKernelPath)
23 kernelFilegroupName := generatedModuleName(ctx.Config(), "kernel")
24
25 ctx.CreateModuleInDirectory(
26 android.FileGroupFactory,
27 kernelDir,
28 &struct {
29 Name *string
30 Srcs []string
31 Visibility []string
32 }{
33 Name: proptools.StringPtr(kernelFilegroupName),
34 Srcs: []string{kernelBase},
35 Visibility: []string{"//visibility:public"},
36 },
37 )
38
Cole Faust26bdac52024-11-19 13:37:53 -080039 var partitionSize *int64
40 if partitionVariables.BoardBootimagePartitionSize != "" {
Cole Faust0c4b4152024-11-20 16:42:53 -080041 // Base of zero will allow base 10 or base 16 if starting with 0x
42 parsed, err := strconv.ParseInt(partitionVariables.BoardBootimagePartitionSize, 0, 64)
Cole Faust26bdac52024-11-19 13:37:53 -080043 if err != nil {
44 panic(fmt.Sprintf("BOARD_BOOTIMAGE_PARTITION_SIZE must be an int, got %s", partitionVariables.BoardBootimagePartitionSize))
45 }
46 partitionSize = &parsed
47 }
48
Cole Faust336b3ba2024-11-19 16:34:29 -080049 var securityPatch *string
50 if partitionVariables.BootSecurityPatch != "" {
51 securityPatch = &partitionVariables.BootSecurityPatch
52 }
53
Cole Faust0c4b4152024-11-20 16:42:53 -080054 avbInfo := getAvbInfo(ctx.Config(), "boot")
55
Cole Faustf2a6e8b2024-11-14 10:54:48 -080056 bootImageName := generatedModuleNameForPartition(ctx.Config(), "boot")
57
58 ctx.CreateModule(
59 filesystem.BootimgFactory,
60 &filesystem.BootimgProperties{
Cole Faust0c4b4152024-11-20 16:42:53 -080061 Kernel_prebuilt: proptools.StringPtr(":" + kernelFilegroupName),
62 Header_version: proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
63 Partition_size: partitionSize,
64 Use_avb: avbInfo.avbEnable,
65 Avb_mode: avbInfo.avbMode,
66 Avb_private_key: avbInfo.avbkeyFilegroup,
67 Avb_rollback_index: avbInfo.avbRollbackIndex,
68 Avb_algorithm: avbInfo.avbAlgorithm,
69 Security_patch: securityPatch,
Cole Faustf2a6e8b2024-11-14 10:54:48 -080070 },
71 &struct {
72 Name *string
73 }{
74 Name: proptools.StringPtr(bootImageName),
75 },
76 )
77 return true
78}
79
Cole Faust24938e22024-11-18 14:01:58 -080080func createVendorBootImage(ctx android.LoadHookContext) bool {
81 partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
82
83 bootImageName := generatedModuleNameForPartition(ctx.Config(), "vendor_boot")
84
Cole Faust0c4b4152024-11-20 16:42:53 -080085 avbInfo := getAvbInfo(ctx.Config(), "vendor_boot")
86
Cole Faust24938e22024-11-18 14:01:58 -080087 ctx.CreateModule(
88 filesystem.BootimgFactory,
89 &filesystem.BootimgProperties{
Cole Faust0c4b4152024-11-20 16:42:53 -080090 Boot_image_type: proptools.StringPtr("vendor_boot"),
91 Ramdisk_module: proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "vendor_ramdisk")),
92 Header_version: proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
93 Use_avb: avbInfo.avbEnable,
94 Avb_mode: avbInfo.avbMode,
95 Avb_private_key: avbInfo.avbkeyFilegroup,
96 Avb_rollback_index: avbInfo.avbRollbackIndex,
97 Avb_algorithm: avbInfo.avbAlgorithm,
Cole Faust24938e22024-11-18 14:01:58 -080098 },
99 &struct {
100 Name *string
101 }{
102 Name: proptools.StringPtr(bootImageName),
103 },
104 )
105 return true
106}
107
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000108func createInitBootImage(ctx android.LoadHookContext) bool {
109 partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
110
111 bootImageName := generatedModuleNameForPartition(ctx.Config(), "init_boot")
112
Cole Faust336b3ba2024-11-19 16:34:29 -0800113 var securityPatch *string
114 if partitionVariables.InitBootSecurityPatch != "" {
115 securityPatch = &partitionVariables.InitBootSecurityPatch
116 } else if partitionVariables.BootSecurityPatch != "" {
117 securityPatch = &partitionVariables.BootSecurityPatch
118 }
119
Cole Faust0c4b4152024-11-20 16:42:53 -0800120 var partitionSize *int64
121 if partitionVariables.BoardInitBootimagePartitionSize != "" {
122 // Base of zero will allow base 10 or base 16 if starting with 0x
123 parsed, err := strconv.ParseInt(partitionVariables.BoardInitBootimagePartitionSize, 0, 64)
124 if err != nil {
125 panic(fmt.Sprintf("BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE must be an int, got %s", partitionVariables.BoardInitBootimagePartitionSize))
126 }
127 partitionSize = &parsed
128 }
129
130 avbInfo := getAvbInfo(ctx.Config(), "init_boot")
131
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000132 ctx.CreateModule(
133 filesystem.BootimgFactory,
134 &filesystem.BootimgProperties{
Cole Faust0c4b4152024-11-20 16:42:53 -0800135 Boot_image_type: proptools.StringPtr("init_boot"),
136 Ramdisk_module: proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "ramdisk")),
137 Header_version: proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
138 Security_patch: securityPatch,
139 Partition_size: partitionSize,
140 Use_avb: avbInfo.avbEnable,
141 Avb_mode: avbInfo.avbMode,
142 Avb_private_key: avbInfo.avbkeyFilegroup,
143 Avb_rollback_index: avbInfo.avbRollbackIndex,
144 Avb_algorithm: avbInfo.avbAlgorithm,
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000145 },
146 &struct {
147 Name *string
148 }{
149 Name: proptools.StringPtr(bootImageName),
150 },
151 )
152 return true
153}
154
Cole Faustf2a6e8b2024-11-14 10:54:48 -0800155// Returns the equivalent of the BUILDING_BOOT_IMAGE variable in make. Derived from this logic:
156// https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=458;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
157func buildingBootImage(partitionVars android.PartitionVariables) bool {
158 if partitionVars.BoardUsesRecoveryAsBoot {
159 return false
160 }
161
162 if partitionVars.ProductBuildBootImage {
163 return true
164 }
165
166 if len(partitionVars.BoardPrebuiltBootimage) > 0 {
167 return false
168 }
169
170 if len(partitionVars.BoardBootimagePartitionSize) > 0 {
171 return true
172 }
173
174 // TODO: return true if BOARD_KERNEL_BINARIES is set and has a *_BOOTIMAGE_PARTITION_SIZE
175 // variable. However, I don't think BOARD_KERNEL_BINARIES is ever set in practice.
176
177 return false
178}
Cole Faust24938e22024-11-18 14:01:58 -0800179
180// Returns the equivalent of the BUILDING_VENDOR_BOOT_IMAGE variable in make. Derived from this logic:
181// https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=518;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
182func buildingVendorBootImage(partitionVars android.PartitionVariables) bool {
183 if v, exists := boardBootHeaderVersion(partitionVars); exists && v >= 3 {
184 x := partitionVars.ProductBuildVendorBootImage
185 if x == "" || x == "true" {
186 return true
187 }
188 }
189
190 return false
191}
192
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000193// Derived from: https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=480;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
194func buildingInitBootImage(partitionVars android.PartitionVariables) bool {
195 if !partitionVars.ProductBuildInitBootImage {
196 if partitionVars.BoardUsesRecoveryAsBoot || len(partitionVars.BoardPrebuiltInitBootimage) > 0 {
197 return false
198 } else if len(partitionVars.BoardInitBootimagePartitionSize) > 0 {
199 return true
200 }
201 } else {
202 if partitionVars.BoardUsesRecoveryAsBoot {
203 panic("PRODUCT_BUILD_INIT_BOOT_IMAGE is true, but so is BOARD_USES_RECOVERY_AS_BOOT. Use only one option.")
204 }
205 return true
206 }
207 return false
208}
209
Cole Faust24938e22024-11-18 14:01:58 -0800210func boardBootHeaderVersion(partitionVars android.PartitionVariables) (int, bool) {
211 if len(partitionVars.BoardBootHeaderVersion) == 0 {
212 return 0, false
213 }
214 v, err := strconv.ParseInt(partitionVars.BoardBootHeaderVersion, 10, 32)
215 if err != nil {
216 panic(fmt.Sprintf("BOARD_BOOT_HEADER_VERSION must be an int, got: %q", partitionVars.BoardBootHeaderVersion))
217 }
218 return int(v), true
219}