blob: 914d35beb786f5d5feec802bf4bf88eb0aff2cd4 [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"
Jihoon Kang70c1c682024-11-20 23:58:38 +00009 "strings"
Cole Faustf2a6e8b2024-11-14 10:54:48 -080010
11 "github.com/google/blueprint/proptools"
12)
13
Jihoon Kang70c1c682024-11-20 23:58:38 +000014func createBootImage(ctx android.LoadHookContext, dtbImg dtbImg) bool {
Cole Faustf2a6e8b2024-11-14 10:54:48 -080015 partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
16
17 if partitionVariables.TargetKernelPath == "" {
18 // There are potentially code paths that don't set TARGET_KERNEL_PATH
19 return false
20 }
21
22 kernelDir := filepath.Dir(partitionVariables.TargetKernelPath)
23 kernelBase := filepath.Base(partitionVariables.TargetKernelPath)
24 kernelFilegroupName := generatedModuleName(ctx.Config(), "kernel")
25
26 ctx.CreateModuleInDirectory(
27 android.FileGroupFactory,
28 kernelDir,
29 &struct {
30 Name *string
31 Srcs []string
32 Visibility []string
33 }{
34 Name: proptools.StringPtr(kernelFilegroupName),
35 Srcs: []string{kernelBase},
36 Visibility: []string{"//visibility:public"},
37 },
38 )
39
Cole Faust26bdac52024-11-19 13:37:53 -080040 var partitionSize *int64
41 if partitionVariables.BoardBootimagePartitionSize != "" {
Cole Faust0c4b4152024-11-20 16:42:53 -080042 // Base of zero will allow base 10 or base 16 if starting with 0x
43 parsed, err := strconv.ParseInt(partitionVariables.BoardBootimagePartitionSize, 0, 64)
Cole Faust26bdac52024-11-19 13:37:53 -080044 if err != nil {
45 panic(fmt.Sprintf("BOARD_BOOTIMAGE_PARTITION_SIZE must be an int, got %s", partitionVariables.BoardBootimagePartitionSize))
46 }
47 partitionSize = &parsed
48 }
49
Cole Faust336b3ba2024-11-19 16:34:29 -080050 var securityPatch *string
51 if partitionVariables.BootSecurityPatch != "" {
52 securityPatch = &partitionVariables.BootSecurityPatch
53 }
54
Cole Faust0c4b4152024-11-20 16:42:53 -080055 avbInfo := getAvbInfo(ctx.Config(), "boot")
56
Cole Faustf2a6e8b2024-11-14 10:54:48 -080057 bootImageName := generatedModuleNameForPartition(ctx.Config(), "boot")
58
Jihoon Kang70c1c682024-11-20 23:58:38 +000059 var dtbPrebuilt *string
60 if dtbImg.include && dtbImg.imgType == "boot" {
61 dtbPrebuilt = proptools.StringPtr(":" + dtbImg.name)
62 }
63
Jihoon Kang1821b5e2024-11-21 20:49:55 +000064 var cmdline []string
65 if !buildingVendorBootImage(partitionVariables) {
66 cmdline = partitionVariables.InternalKernelCmdline
67 }
68
Cole Faustf2a6e8b2024-11-14 10:54:48 -080069 ctx.CreateModule(
70 filesystem.BootimgFactory,
71 &filesystem.BootimgProperties{
Cole Faust0c4b4152024-11-20 16:42:53 -080072 Kernel_prebuilt: proptools.StringPtr(":" + kernelFilegroupName),
73 Header_version: proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
74 Partition_size: partitionSize,
75 Use_avb: avbInfo.avbEnable,
76 Avb_mode: avbInfo.avbMode,
77 Avb_private_key: avbInfo.avbkeyFilegroup,
78 Avb_rollback_index: avbInfo.avbRollbackIndex,
79 Avb_algorithm: avbInfo.avbAlgorithm,
80 Security_patch: securityPatch,
Jihoon Kang70c1c682024-11-20 23:58:38 +000081 Dtb_prebuilt: dtbPrebuilt,
Jihoon Kang1821b5e2024-11-21 20:49:55 +000082 Cmdline: cmdline,
Cole Faustf2a6e8b2024-11-14 10:54:48 -080083 },
84 &struct {
85 Name *string
86 }{
87 Name: proptools.StringPtr(bootImageName),
88 },
89 )
90 return true
91}
92
Jihoon Kang70c1c682024-11-20 23:58:38 +000093func createVendorBootImage(ctx android.LoadHookContext, dtbImg dtbImg) bool {
Cole Faust24938e22024-11-18 14:01:58 -080094 partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
95
96 bootImageName := generatedModuleNameForPartition(ctx.Config(), "vendor_boot")
97
Cole Faust0c4b4152024-11-20 16:42:53 -080098 avbInfo := getAvbInfo(ctx.Config(), "vendor_boot")
99
Jihoon Kang70c1c682024-11-20 23:58:38 +0000100 var dtbPrebuilt *string
101 if dtbImg.include && dtbImg.imgType == "vendor_boot" {
102 dtbPrebuilt = proptools.StringPtr(":" + dtbImg.name)
103 }
104
Jihoon Kang1821b5e2024-11-21 20:49:55 +0000105 cmdline := partitionVariables.InternalKernelCmdline
106
Jihoon Kang4004cc62024-11-21 23:57:19 +0000107 var vendorBootConfigImg *string
108 if name, ok := createVendorBootConfigImg(ctx); ok {
109 vendorBootConfigImg = proptools.StringPtr(":" + name)
110 }
111
Jihoon Kang5cf36422025-01-02 19:33:43 +0000112 var partitionSize *int64
113 if partitionVariables.BoardVendorBootimagePartitionSize != "" {
114 // Base of zero will allow base 10 or base 16 if starting with 0x
115 parsed, err := strconv.ParseInt(partitionVariables.BoardVendorBootimagePartitionSize, 0, 64)
116 if err != nil {
117 ctx.ModuleErrorf("BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE must be an int, got %s", partitionVariables.BoardVendorBootimagePartitionSize)
118 }
119 partitionSize = &parsed
120 }
121
Cole Faust24938e22024-11-18 14:01:58 -0800122 ctx.CreateModule(
123 filesystem.BootimgFactory,
124 &filesystem.BootimgProperties{
Cole Faust0c4b4152024-11-20 16:42:53 -0800125 Boot_image_type: proptools.StringPtr("vendor_boot"),
126 Ramdisk_module: proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "vendor_ramdisk")),
127 Header_version: proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
Jihoon Kang5cf36422025-01-02 19:33:43 +0000128 Partition_size: partitionSize,
Cole Faust0c4b4152024-11-20 16:42:53 -0800129 Use_avb: avbInfo.avbEnable,
130 Avb_mode: avbInfo.avbMode,
131 Avb_private_key: avbInfo.avbkeyFilegroup,
132 Avb_rollback_index: avbInfo.avbRollbackIndex,
Jihoon Kang70c1c682024-11-20 23:58:38 +0000133 Dtb_prebuilt: dtbPrebuilt,
Jihoon Kang1821b5e2024-11-21 20:49:55 +0000134 Cmdline: cmdline,
Jihoon Kang4004cc62024-11-21 23:57:19 +0000135 Bootconfig: vendorBootConfigImg,
Cole Faust24938e22024-11-18 14:01:58 -0800136 },
137 &struct {
138 Name *string
139 }{
140 Name: proptools.StringPtr(bootImageName),
141 },
142 )
143 return true
144}
145
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000146func createInitBootImage(ctx android.LoadHookContext) bool {
147 partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
148
149 bootImageName := generatedModuleNameForPartition(ctx.Config(), "init_boot")
150
Cole Faust336b3ba2024-11-19 16:34:29 -0800151 var securityPatch *string
152 if partitionVariables.InitBootSecurityPatch != "" {
153 securityPatch = &partitionVariables.InitBootSecurityPatch
154 } else if partitionVariables.BootSecurityPatch != "" {
155 securityPatch = &partitionVariables.BootSecurityPatch
156 }
157
Cole Faust0c4b4152024-11-20 16:42:53 -0800158 var partitionSize *int64
159 if partitionVariables.BoardInitBootimagePartitionSize != "" {
160 // Base of zero will allow base 10 or base 16 if starting with 0x
161 parsed, err := strconv.ParseInt(partitionVariables.BoardInitBootimagePartitionSize, 0, 64)
162 if err != nil {
163 panic(fmt.Sprintf("BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE must be an int, got %s", partitionVariables.BoardInitBootimagePartitionSize))
164 }
165 partitionSize = &parsed
166 }
167
168 avbInfo := getAvbInfo(ctx.Config(), "init_boot")
169
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000170 ctx.CreateModule(
171 filesystem.BootimgFactory,
172 &filesystem.BootimgProperties{
Cole Faust0c4b4152024-11-20 16:42:53 -0800173 Boot_image_type: proptools.StringPtr("init_boot"),
174 Ramdisk_module: proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "ramdisk")),
175 Header_version: proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
176 Security_patch: securityPatch,
177 Partition_size: partitionSize,
178 Use_avb: avbInfo.avbEnable,
179 Avb_mode: avbInfo.avbMode,
180 Avb_private_key: avbInfo.avbkeyFilegroup,
181 Avb_rollback_index: avbInfo.avbRollbackIndex,
182 Avb_algorithm: avbInfo.avbAlgorithm,
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000183 },
184 &struct {
185 Name *string
186 }{
187 Name: proptools.StringPtr(bootImageName),
188 },
189 )
190 return true
191}
192
Cole Faustf2a6e8b2024-11-14 10:54:48 -0800193// Returns the equivalent of the BUILDING_BOOT_IMAGE variable in make. Derived from this logic:
194// https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=458;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
195func buildingBootImage(partitionVars android.PartitionVariables) bool {
196 if partitionVars.BoardUsesRecoveryAsBoot {
197 return false
198 }
199
200 if partitionVars.ProductBuildBootImage {
201 return true
202 }
203
204 if len(partitionVars.BoardPrebuiltBootimage) > 0 {
205 return false
206 }
207
208 if len(partitionVars.BoardBootimagePartitionSize) > 0 {
209 return true
210 }
211
212 // TODO: return true if BOARD_KERNEL_BINARIES is set and has a *_BOOTIMAGE_PARTITION_SIZE
213 // variable. However, I don't think BOARD_KERNEL_BINARIES is ever set in practice.
214
215 return false
216}
Cole Faust24938e22024-11-18 14:01:58 -0800217
218// Returns the equivalent of the BUILDING_VENDOR_BOOT_IMAGE variable in make. Derived from this logic:
219// https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=518;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
220func buildingVendorBootImage(partitionVars android.PartitionVariables) bool {
221 if v, exists := boardBootHeaderVersion(partitionVars); exists && v >= 3 {
222 x := partitionVars.ProductBuildVendorBootImage
223 if x == "" || x == "true" {
224 return true
225 }
226 }
227
228 return false
229}
230
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000231// Derived from: https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=480;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
232func buildingInitBootImage(partitionVars android.PartitionVariables) bool {
233 if !partitionVars.ProductBuildInitBootImage {
234 if partitionVars.BoardUsesRecoveryAsBoot || len(partitionVars.BoardPrebuiltInitBootimage) > 0 {
235 return false
236 } else if len(partitionVars.BoardInitBootimagePartitionSize) > 0 {
237 return true
238 }
239 } else {
240 if partitionVars.BoardUsesRecoveryAsBoot {
241 panic("PRODUCT_BUILD_INIT_BOOT_IMAGE is true, but so is BOARD_USES_RECOVERY_AS_BOOT. Use only one option.")
242 }
243 return true
244 }
245 return false
246}
247
Cole Faust24938e22024-11-18 14:01:58 -0800248func boardBootHeaderVersion(partitionVars android.PartitionVariables) (int, bool) {
249 if len(partitionVars.BoardBootHeaderVersion) == 0 {
250 return 0, false
251 }
252 v, err := strconv.ParseInt(partitionVars.BoardBootHeaderVersion, 10, 32)
253 if err != nil {
254 panic(fmt.Sprintf("BOARD_BOOT_HEADER_VERSION must be an int, got: %q", partitionVars.BoardBootHeaderVersion))
255 }
256 return int(v), true
257}
Jihoon Kang70c1c682024-11-20 23:58:38 +0000258
259type dtbImg struct {
260 // whether to include the dtb image in boot image
261 include bool
262
263 // name of the generated dtb image filegroup name
264 name string
265
266 // type of the boot image that the dtb image argument should be specified
267 imgType string
268}
269
270func createDtbImgFilegroup(ctx android.LoadHookContext) dtbImg {
271 partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
272 if !partitionVars.BoardIncludeDtbInBootimg {
273 return dtbImg{include: false}
274 }
275 for _, copyFilePair := range partitionVars.ProductCopyFiles {
276 srcDestList := strings.Split(copyFilePair, ":")
277 if len(srcDestList) < 2 {
278 ctx.ModuleErrorf("PRODUCT_COPY_FILES must follow the format \"src:dest\", got: %s", copyFilePair)
279 }
280 if srcDestList[1] == "dtb.img" {
281 moduleName := generatedModuleName(ctx.Config(), "dtb_img_filegroup")
282 ctx.CreateModuleInDirectory(
283 android.FileGroupFactory,
284 filepath.Dir(srcDestList[0]),
285 &struct {
286 Name *string
287 Srcs []string
288 }{
289 Name: proptools.StringPtr(moduleName),
290 Srcs: []string{filepath.Base(srcDestList[1])},
291 },
292 )
293 imgType := "vendor_boot"
294 if !buildingVendorBootImage(partitionVars) {
295 imgType = "boot"
296 }
297 return dtbImg{include: true, name: moduleName, imgType: imgType}
298 }
299 }
300 return dtbImg{include: false}
301}
Jihoon Kang4004cc62024-11-21 23:57:19 +0000302
303func createVendorBootConfigImg(ctx android.LoadHookContext) (string, bool) {
304 partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
305 bootconfig := partitionVars.InternalBootconfig
306 bootconfigFile := partitionVars.InternalBootconfigFile
307 if len(bootconfig) == 0 && len(bootconfigFile) == 0 {
308 return "", false
309 }
310
311 vendorBootconfigImgModuleName := generatedModuleName(ctx.Config(), "vendor_bootconfig_image")
312
313 ctx.CreateModule(
314 filesystem.BootconfigModuleFactory,
315 &struct {
316 Name *string
317 Boot_config []string
318 Boot_config_file *string
319 }{
320 Name: proptools.StringPtr(vendorBootconfigImgModuleName),
321 Boot_config: bootconfig,
322 Boot_config_file: proptools.StringPtr(bootconfigFile),
323 },
324 )
325
326 return vendorBootconfigImgModuleName, true
327}