blob: 889a4c271e95b6234f79d277a22f072a211479f6 [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,
Spandan Das0036fa32025-01-10 23:40:45 +000083 Stem: proptools.StringPtr("boot.img"),
Cole Faustf2a6e8b2024-11-14 10:54:48 -080084 },
85 &struct {
86 Name *string
87 }{
88 Name: proptools.StringPtr(bootImageName),
89 },
90 )
91 return true
92}
93
Jihoon Kang70c1c682024-11-20 23:58:38 +000094func createVendorBootImage(ctx android.LoadHookContext, dtbImg dtbImg) bool {
Cole Faust24938e22024-11-18 14:01:58 -080095 partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
96
97 bootImageName := generatedModuleNameForPartition(ctx.Config(), "vendor_boot")
98
Cole Faust0c4b4152024-11-20 16:42:53 -080099 avbInfo := getAvbInfo(ctx.Config(), "vendor_boot")
100
Jihoon Kang70c1c682024-11-20 23:58:38 +0000101 var dtbPrebuilt *string
102 if dtbImg.include && dtbImg.imgType == "vendor_boot" {
103 dtbPrebuilt = proptools.StringPtr(":" + dtbImg.name)
104 }
105
Jihoon Kang1821b5e2024-11-21 20:49:55 +0000106 cmdline := partitionVariables.InternalKernelCmdline
107
Jihoon Kang4004cc62024-11-21 23:57:19 +0000108 var vendorBootConfigImg *string
109 if name, ok := createVendorBootConfigImg(ctx); ok {
110 vendorBootConfigImg = proptools.StringPtr(":" + name)
111 }
112
Jihoon Kang5cf36422025-01-02 19:33:43 +0000113 var partitionSize *int64
114 if partitionVariables.BoardVendorBootimagePartitionSize != "" {
115 // Base of zero will allow base 10 or base 16 if starting with 0x
116 parsed, err := strconv.ParseInt(partitionVariables.BoardVendorBootimagePartitionSize, 0, 64)
117 if err != nil {
118 ctx.ModuleErrorf("BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE must be an int, got %s", partitionVariables.BoardVendorBootimagePartitionSize)
119 }
120 partitionSize = &parsed
121 }
122
Cole Faust24938e22024-11-18 14:01:58 -0800123 ctx.CreateModule(
124 filesystem.BootimgFactory,
125 &filesystem.BootimgProperties{
Cole Faust0c4b4152024-11-20 16:42:53 -0800126 Boot_image_type: proptools.StringPtr("vendor_boot"),
127 Ramdisk_module: proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "vendor_ramdisk")),
128 Header_version: proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
Jihoon Kang5cf36422025-01-02 19:33:43 +0000129 Partition_size: partitionSize,
Cole Faust0c4b4152024-11-20 16:42:53 -0800130 Use_avb: avbInfo.avbEnable,
131 Avb_mode: avbInfo.avbMode,
132 Avb_private_key: avbInfo.avbkeyFilegroup,
133 Avb_rollback_index: avbInfo.avbRollbackIndex,
Jihoon Kang70c1c682024-11-20 23:58:38 +0000134 Dtb_prebuilt: dtbPrebuilt,
Jihoon Kang1821b5e2024-11-21 20:49:55 +0000135 Cmdline: cmdline,
Jihoon Kang4004cc62024-11-21 23:57:19 +0000136 Bootconfig: vendorBootConfigImg,
Spandan Das0036fa32025-01-10 23:40:45 +0000137 Stem: proptools.StringPtr("vendor_boot.img"),
Cole Faust24938e22024-11-18 14:01:58 -0800138 },
139 &struct {
140 Name *string
141 }{
142 Name: proptools.StringPtr(bootImageName),
143 },
144 )
145 return true
146}
147
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000148func createInitBootImage(ctx android.LoadHookContext) bool {
149 partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
150
151 bootImageName := generatedModuleNameForPartition(ctx.Config(), "init_boot")
152
Cole Faust336b3ba2024-11-19 16:34:29 -0800153 var securityPatch *string
154 if partitionVariables.InitBootSecurityPatch != "" {
155 securityPatch = &partitionVariables.InitBootSecurityPatch
156 } else if partitionVariables.BootSecurityPatch != "" {
157 securityPatch = &partitionVariables.BootSecurityPatch
158 }
159
Cole Faust0c4b4152024-11-20 16:42:53 -0800160 var partitionSize *int64
161 if partitionVariables.BoardInitBootimagePartitionSize != "" {
162 // Base of zero will allow base 10 or base 16 if starting with 0x
163 parsed, err := strconv.ParseInt(partitionVariables.BoardInitBootimagePartitionSize, 0, 64)
164 if err != nil {
165 panic(fmt.Sprintf("BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE must be an int, got %s", partitionVariables.BoardInitBootimagePartitionSize))
166 }
167 partitionSize = &parsed
168 }
169
170 avbInfo := getAvbInfo(ctx.Config(), "init_boot")
171
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000172 ctx.CreateModule(
173 filesystem.BootimgFactory,
174 &filesystem.BootimgProperties{
Cole Faust0c4b4152024-11-20 16:42:53 -0800175 Boot_image_type: proptools.StringPtr("init_boot"),
176 Ramdisk_module: proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "ramdisk")),
177 Header_version: proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
178 Security_patch: securityPatch,
179 Partition_size: partitionSize,
180 Use_avb: avbInfo.avbEnable,
181 Avb_mode: avbInfo.avbMode,
182 Avb_private_key: avbInfo.avbkeyFilegroup,
183 Avb_rollback_index: avbInfo.avbRollbackIndex,
184 Avb_algorithm: avbInfo.avbAlgorithm,
Spandan Das0036fa32025-01-10 23:40:45 +0000185 Stem: proptools.StringPtr("init_boot.img"),
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000186 },
187 &struct {
188 Name *string
189 }{
190 Name: proptools.StringPtr(bootImageName),
191 },
192 )
193 return true
194}
195
Cole Faustf2a6e8b2024-11-14 10:54:48 -0800196// Returns the equivalent of the BUILDING_BOOT_IMAGE variable in make. Derived from this logic:
197// https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=458;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
198func buildingBootImage(partitionVars android.PartitionVariables) bool {
199 if partitionVars.BoardUsesRecoveryAsBoot {
200 return false
201 }
202
203 if partitionVars.ProductBuildBootImage {
204 return true
205 }
206
207 if len(partitionVars.BoardPrebuiltBootimage) > 0 {
208 return false
209 }
210
211 if len(partitionVars.BoardBootimagePartitionSize) > 0 {
212 return true
213 }
214
215 // TODO: return true if BOARD_KERNEL_BINARIES is set and has a *_BOOTIMAGE_PARTITION_SIZE
216 // variable. However, I don't think BOARD_KERNEL_BINARIES is ever set in practice.
217
218 return false
219}
Cole Faust24938e22024-11-18 14:01:58 -0800220
221// Returns the equivalent of the BUILDING_VENDOR_BOOT_IMAGE variable in make. Derived from this logic:
222// https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=518;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
223func buildingVendorBootImage(partitionVars android.PartitionVariables) bool {
224 if v, exists := boardBootHeaderVersion(partitionVars); exists && v >= 3 {
225 x := partitionVars.ProductBuildVendorBootImage
226 if x == "" || x == "true" {
227 return true
228 }
229 }
230
231 return false
232}
233
Jihoon Kang95eb1da2024-11-19 20:55:20 +0000234// Derived from: https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=480;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
235func buildingInitBootImage(partitionVars android.PartitionVariables) bool {
236 if !partitionVars.ProductBuildInitBootImage {
237 if partitionVars.BoardUsesRecoveryAsBoot || len(partitionVars.BoardPrebuiltInitBootimage) > 0 {
238 return false
239 } else if len(partitionVars.BoardInitBootimagePartitionSize) > 0 {
240 return true
241 }
242 } else {
243 if partitionVars.BoardUsesRecoveryAsBoot {
244 panic("PRODUCT_BUILD_INIT_BOOT_IMAGE is true, but so is BOARD_USES_RECOVERY_AS_BOOT. Use only one option.")
245 }
246 return true
247 }
248 return false
249}
250
Cole Faust24938e22024-11-18 14:01:58 -0800251func boardBootHeaderVersion(partitionVars android.PartitionVariables) (int, bool) {
252 if len(partitionVars.BoardBootHeaderVersion) == 0 {
253 return 0, false
254 }
255 v, err := strconv.ParseInt(partitionVars.BoardBootHeaderVersion, 10, 32)
256 if err != nil {
257 panic(fmt.Sprintf("BOARD_BOOT_HEADER_VERSION must be an int, got: %q", partitionVars.BoardBootHeaderVersion))
258 }
259 return int(v), true
260}
Jihoon Kang70c1c682024-11-20 23:58:38 +0000261
262type dtbImg struct {
263 // whether to include the dtb image in boot image
264 include bool
265
266 // name of the generated dtb image filegroup name
267 name string
268
269 // type of the boot image that the dtb image argument should be specified
270 imgType string
271}
272
273func createDtbImgFilegroup(ctx android.LoadHookContext) dtbImg {
274 partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
275 if !partitionVars.BoardIncludeDtbInBootimg {
276 return dtbImg{include: false}
277 }
278 for _, copyFilePair := range partitionVars.ProductCopyFiles {
279 srcDestList := strings.Split(copyFilePair, ":")
280 if len(srcDestList) < 2 {
281 ctx.ModuleErrorf("PRODUCT_COPY_FILES must follow the format \"src:dest\", got: %s", copyFilePair)
282 }
283 if srcDestList[1] == "dtb.img" {
284 moduleName := generatedModuleName(ctx.Config(), "dtb_img_filegroup")
285 ctx.CreateModuleInDirectory(
286 android.FileGroupFactory,
287 filepath.Dir(srcDestList[0]),
288 &struct {
289 Name *string
290 Srcs []string
291 }{
292 Name: proptools.StringPtr(moduleName),
293 Srcs: []string{filepath.Base(srcDestList[1])},
294 },
295 )
296 imgType := "vendor_boot"
297 if !buildingVendorBootImage(partitionVars) {
298 imgType = "boot"
299 }
300 return dtbImg{include: true, name: moduleName, imgType: imgType}
301 }
302 }
303 return dtbImg{include: false}
304}
Jihoon Kang4004cc62024-11-21 23:57:19 +0000305
306func createVendorBootConfigImg(ctx android.LoadHookContext) (string, bool) {
307 partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
308 bootconfig := partitionVars.InternalBootconfig
309 bootconfigFile := partitionVars.InternalBootconfigFile
310 if len(bootconfig) == 0 && len(bootconfigFile) == 0 {
311 return "", false
312 }
313
314 vendorBootconfigImgModuleName := generatedModuleName(ctx.Config(), "vendor_bootconfig_image")
315
316 ctx.CreateModule(
317 filesystem.BootconfigModuleFactory,
318 &struct {
319 Name *string
320 Boot_config []string
321 Boot_config_file *string
322 }{
323 Name: proptools.StringPtr(vendorBootconfigImgModuleName),
324 Boot_config: bootconfig,
325 Boot_config_file: proptools.StringPtr(bootconfigFile),
326 },
327 )
328
329 return vendorBootconfigImgModuleName, true
330}