xref: /aosp_15_r20/build/soong/fsgen/boot_imgs.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Workerpackage fsgen
2*333d2b36SAndroid Build Coastguard Worker
3*333d2b36SAndroid Build Coastguard Workerimport (
4*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
5*333d2b36SAndroid Build Coastguard Worker	"android/soong/filesystem"
6*333d2b36SAndroid Build Coastguard Worker	"fmt"
7*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
8*333d2b36SAndroid Build Coastguard Worker	"strconv"
9*333d2b36SAndroid Build Coastguard Worker	"strings"
10*333d2b36SAndroid Build Coastguard Worker
11*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
12*333d2b36SAndroid Build Coastguard Worker)
13*333d2b36SAndroid Build Coastguard Worker
14*333d2b36SAndroid Build Coastguard Workerfunc createBootImage(ctx android.LoadHookContext, dtbImg dtbImg) bool {
15*333d2b36SAndroid Build Coastguard Worker	partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Worker	if partitionVariables.TargetKernelPath == "" {
18*333d2b36SAndroid Build Coastguard Worker		// There are potentially code paths that don't set TARGET_KERNEL_PATH
19*333d2b36SAndroid Build Coastguard Worker		return false
20*333d2b36SAndroid Build Coastguard Worker	}
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	kernelDir := filepath.Dir(partitionVariables.TargetKernelPath)
23*333d2b36SAndroid Build Coastguard Worker	kernelBase := filepath.Base(partitionVariables.TargetKernelPath)
24*333d2b36SAndroid Build Coastguard Worker	kernelFilegroupName := generatedModuleName(ctx.Config(), "kernel")
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Worker	ctx.CreateModuleInDirectory(
27*333d2b36SAndroid Build Coastguard Worker		android.FileGroupFactory,
28*333d2b36SAndroid Build Coastguard Worker		kernelDir,
29*333d2b36SAndroid Build Coastguard Worker		&struct {
30*333d2b36SAndroid Build Coastguard Worker			Name       *string
31*333d2b36SAndroid Build Coastguard Worker			Srcs       []string
32*333d2b36SAndroid Build Coastguard Worker			Visibility []string
33*333d2b36SAndroid Build Coastguard Worker		}{
34*333d2b36SAndroid Build Coastguard Worker			Name:       proptools.StringPtr(kernelFilegroupName),
35*333d2b36SAndroid Build Coastguard Worker			Srcs:       []string{kernelBase},
36*333d2b36SAndroid Build Coastguard Worker			Visibility: []string{"//visibility:public"},
37*333d2b36SAndroid Build Coastguard Worker		},
38*333d2b36SAndroid Build Coastguard Worker	)
39*333d2b36SAndroid Build Coastguard Worker
40*333d2b36SAndroid Build Coastguard Worker	var partitionSize *int64
41*333d2b36SAndroid Build Coastguard Worker	if partitionVariables.BoardBootimagePartitionSize != "" {
42*333d2b36SAndroid Build Coastguard Worker		// Base of zero will allow base 10 or base 16 if starting with 0x
43*333d2b36SAndroid Build Coastguard Worker		parsed, err := strconv.ParseInt(partitionVariables.BoardBootimagePartitionSize, 0, 64)
44*333d2b36SAndroid Build Coastguard Worker		if err != nil {
45*333d2b36SAndroid Build Coastguard Worker			panic(fmt.Sprintf("BOARD_BOOTIMAGE_PARTITION_SIZE must be an int, got %s", partitionVariables.BoardBootimagePartitionSize))
46*333d2b36SAndroid Build Coastguard Worker		}
47*333d2b36SAndroid Build Coastguard Worker		partitionSize = &parsed
48*333d2b36SAndroid Build Coastguard Worker	}
49*333d2b36SAndroid Build Coastguard Worker
50*333d2b36SAndroid Build Coastguard Worker	var securityPatch *string
51*333d2b36SAndroid Build Coastguard Worker	if partitionVariables.BootSecurityPatch != "" {
52*333d2b36SAndroid Build Coastguard Worker		securityPatch = &partitionVariables.BootSecurityPatch
53*333d2b36SAndroid Build Coastguard Worker	}
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker	avbInfo := getAvbInfo(ctx.Config(), "boot")
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker	bootImageName := generatedModuleNameForPartition(ctx.Config(), "boot")
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Worker	var dtbPrebuilt *string
60*333d2b36SAndroid Build Coastguard Worker	if dtbImg.include && dtbImg.imgType == "boot" {
61*333d2b36SAndroid Build Coastguard Worker		dtbPrebuilt = proptools.StringPtr(":" + dtbImg.name)
62*333d2b36SAndroid Build Coastguard Worker	}
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Worker	var cmdline []string
65*333d2b36SAndroid Build Coastguard Worker	if !buildingVendorBootImage(partitionVariables) {
66*333d2b36SAndroid Build Coastguard Worker		cmdline = partitionVariables.InternalKernelCmdline
67*333d2b36SAndroid Build Coastguard Worker	}
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Worker	ctx.CreateModule(
70*333d2b36SAndroid Build Coastguard Worker		filesystem.BootimgFactory,
71*333d2b36SAndroid Build Coastguard Worker		&filesystem.BootimgProperties{
72*333d2b36SAndroid Build Coastguard Worker			Kernel_prebuilt:    proptools.StringPtr(":" + kernelFilegroupName),
73*333d2b36SAndroid Build Coastguard Worker			Header_version:     proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
74*333d2b36SAndroid Build Coastguard Worker			Partition_size:     partitionSize,
75*333d2b36SAndroid Build Coastguard Worker			Use_avb:            avbInfo.avbEnable,
76*333d2b36SAndroid Build Coastguard Worker			Avb_mode:           avbInfo.avbMode,
77*333d2b36SAndroid Build Coastguard Worker			Avb_private_key:    avbInfo.avbkeyFilegroup,
78*333d2b36SAndroid Build Coastguard Worker			Avb_rollback_index: avbInfo.avbRollbackIndex,
79*333d2b36SAndroid Build Coastguard Worker			Avb_algorithm:      avbInfo.avbAlgorithm,
80*333d2b36SAndroid Build Coastguard Worker			Security_patch:     securityPatch,
81*333d2b36SAndroid Build Coastguard Worker			Dtb_prebuilt:       dtbPrebuilt,
82*333d2b36SAndroid Build Coastguard Worker			Cmdline:            cmdline,
83*333d2b36SAndroid Build Coastguard Worker		},
84*333d2b36SAndroid Build Coastguard Worker		&struct {
85*333d2b36SAndroid Build Coastguard Worker			Name *string
86*333d2b36SAndroid Build Coastguard Worker		}{
87*333d2b36SAndroid Build Coastguard Worker			Name: proptools.StringPtr(bootImageName),
88*333d2b36SAndroid Build Coastguard Worker		},
89*333d2b36SAndroid Build Coastguard Worker	)
90*333d2b36SAndroid Build Coastguard Worker	return true
91*333d2b36SAndroid Build Coastguard Worker}
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Workerfunc createVendorBootImage(ctx android.LoadHookContext, dtbImg dtbImg) bool {
94*333d2b36SAndroid Build Coastguard Worker	partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Worker	bootImageName := generatedModuleNameForPartition(ctx.Config(), "vendor_boot")
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Worker	avbInfo := getAvbInfo(ctx.Config(), "vendor_boot")
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker	var dtbPrebuilt *string
101*333d2b36SAndroid Build Coastguard Worker	if dtbImg.include && dtbImg.imgType == "vendor_boot" {
102*333d2b36SAndroid Build Coastguard Worker		dtbPrebuilt = proptools.StringPtr(":" + dtbImg.name)
103*333d2b36SAndroid Build Coastguard Worker	}
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Worker	cmdline := partitionVariables.InternalKernelCmdline
106*333d2b36SAndroid Build Coastguard Worker
107*333d2b36SAndroid Build Coastguard Worker	var vendorBootConfigImg *string
108*333d2b36SAndroid Build Coastguard Worker	if name, ok := createVendorBootConfigImg(ctx); ok {
109*333d2b36SAndroid Build Coastguard Worker		vendorBootConfigImg = proptools.StringPtr(":" + name)
110*333d2b36SAndroid Build Coastguard Worker	}
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Worker	ctx.CreateModule(
113*333d2b36SAndroid Build Coastguard Worker		filesystem.BootimgFactory,
114*333d2b36SAndroid Build Coastguard Worker		&filesystem.BootimgProperties{
115*333d2b36SAndroid Build Coastguard Worker			Boot_image_type:    proptools.StringPtr("vendor_boot"),
116*333d2b36SAndroid Build Coastguard Worker			Ramdisk_module:     proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "vendor_ramdisk")),
117*333d2b36SAndroid Build Coastguard Worker			Header_version:     proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
118*333d2b36SAndroid Build Coastguard Worker			Use_avb:            avbInfo.avbEnable,
119*333d2b36SAndroid Build Coastguard Worker			Avb_mode:           avbInfo.avbMode,
120*333d2b36SAndroid Build Coastguard Worker			Avb_private_key:    avbInfo.avbkeyFilegroup,
121*333d2b36SAndroid Build Coastguard Worker			Avb_rollback_index: avbInfo.avbRollbackIndex,
122*333d2b36SAndroid Build Coastguard Worker			Avb_algorithm:      avbInfo.avbAlgorithm,
123*333d2b36SAndroid Build Coastguard Worker			Dtb_prebuilt:       dtbPrebuilt,
124*333d2b36SAndroid Build Coastguard Worker			Cmdline:            cmdline,
125*333d2b36SAndroid Build Coastguard Worker			Bootconfig:         vendorBootConfigImg,
126*333d2b36SAndroid Build Coastguard Worker		},
127*333d2b36SAndroid Build Coastguard Worker		&struct {
128*333d2b36SAndroid Build Coastguard Worker			Name *string
129*333d2b36SAndroid Build Coastguard Worker		}{
130*333d2b36SAndroid Build Coastguard Worker			Name: proptools.StringPtr(bootImageName),
131*333d2b36SAndroid Build Coastguard Worker		},
132*333d2b36SAndroid Build Coastguard Worker	)
133*333d2b36SAndroid Build Coastguard Worker	return true
134*333d2b36SAndroid Build Coastguard Worker}
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Workerfunc createInitBootImage(ctx android.LoadHookContext) bool {
137*333d2b36SAndroid Build Coastguard Worker	partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker	bootImageName := generatedModuleNameForPartition(ctx.Config(), "init_boot")
140*333d2b36SAndroid Build Coastguard Worker
141*333d2b36SAndroid Build Coastguard Worker	var securityPatch *string
142*333d2b36SAndroid Build Coastguard Worker	if partitionVariables.InitBootSecurityPatch != "" {
143*333d2b36SAndroid Build Coastguard Worker		securityPatch = &partitionVariables.InitBootSecurityPatch
144*333d2b36SAndroid Build Coastguard Worker	} else if partitionVariables.BootSecurityPatch != "" {
145*333d2b36SAndroid Build Coastguard Worker		securityPatch = &partitionVariables.BootSecurityPatch
146*333d2b36SAndroid Build Coastguard Worker	}
147*333d2b36SAndroid Build Coastguard Worker
148*333d2b36SAndroid Build Coastguard Worker	var partitionSize *int64
149*333d2b36SAndroid Build Coastguard Worker	if partitionVariables.BoardInitBootimagePartitionSize != "" {
150*333d2b36SAndroid Build Coastguard Worker		// Base of zero will allow base 10 or base 16 if starting with 0x
151*333d2b36SAndroid Build Coastguard Worker		parsed, err := strconv.ParseInt(partitionVariables.BoardInitBootimagePartitionSize, 0, 64)
152*333d2b36SAndroid Build Coastguard Worker		if err != nil {
153*333d2b36SAndroid Build Coastguard Worker			panic(fmt.Sprintf("BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE must be an int, got %s", partitionVariables.BoardInitBootimagePartitionSize))
154*333d2b36SAndroid Build Coastguard Worker		}
155*333d2b36SAndroid Build Coastguard Worker		partitionSize = &parsed
156*333d2b36SAndroid Build Coastguard Worker	}
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Worker	avbInfo := getAvbInfo(ctx.Config(), "init_boot")
159*333d2b36SAndroid Build Coastguard Worker
160*333d2b36SAndroid Build Coastguard Worker	ctx.CreateModule(
161*333d2b36SAndroid Build Coastguard Worker		filesystem.BootimgFactory,
162*333d2b36SAndroid Build Coastguard Worker		&filesystem.BootimgProperties{
163*333d2b36SAndroid Build Coastguard Worker			Boot_image_type:    proptools.StringPtr("init_boot"),
164*333d2b36SAndroid Build Coastguard Worker			Ramdisk_module:     proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "ramdisk")),
165*333d2b36SAndroid Build Coastguard Worker			Header_version:     proptools.StringPtr(partitionVariables.BoardBootHeaderVersion),
166*333d2b36SAndroid Build Coastguard Worker			Security_patch:     securityPatch,
167*333d2b36SAndroid Build Coastguard Worker			Partition_size:     partitionSize,
168*333d2b36SAndroid Build Coastguard Worker			Use_avb:            avbInfo.avbEnable,
169*333d2b36SAndroid Build Coastguard Worker			Avb_mode:           avbInfo.avbMode,
170*333d2b36SAndroid Build Coastguard Worker			Avb_private_key:    avbInfo.avbkeyFilegroup,
171*333d2b36SAndroid Build Coastguard Worker			Avb_rollback_index: avbInfo.avbRollbackIndex,
172*333d2b36SAndroid Build Coastguard Worker			Avb_algorithm:      avbInfo.avbAlgorithm,
173*333d2b36SAndroid Build Coastguard Worker		},
174*333d2b36SAndroid Build Coastguard Worker		&struct {
175*333d2b36SAndroid Build Coastguard Worker			Name *string
176*333d2b36SAndroid Build Coastguard Worker		}{
177*333d2b36SAndroid Build Coastguard Worker			Name: proptools.StringPtr(bootImageName),
178*333d2b36SAndroid Build Coastguard Worker		},
179*333d2b36SAndroid Build Coastguard Worker	)
180*333d2b36SAndroid Build Coastguard Worker	return true
181*333d2b36SAndroid Build Coastguard Worker}
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Worker// Returns the equivalent of the BUILDING_BOOT_IMAGE variable in make. Derived from this logic:
184*333d2b36SAndroid Build Coastguard Worker// https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=458;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
185*333d2b36SAndroid Build Coastguard Workerfunc buildingBootImage(partitionVars android.PartitionVariables) bool {
186*333d2b36SAndroid Build Coastguard Worker	if partitionVars.BoardUsesRecoveryAsBoot {
187*333d2b36SAndroid Build Coastguard Worker		return false
188*333d2b36SAndroid Build Coastguard Worker	}
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Worker	if partitionVars.ProductBuildBootImage {
191*333d2b36SAndroid Build Coastguard Worker		return true
192*333d2b36SAndroid Build Coastguard Worker	}
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Worker	if len(partitionVars.BoardPrebuiltBootimage) > 0 {
195*333d2b36SAndroid Build Coastguard Worker		return false
196*333d2b36SAndroid Build Coastguard Worker	}
197*333d2b36SAndroid Build Coastguard Worker
198*333d2b36SAndroid Build Coastguard Worker	if len(partitionVars.BoardBootimagePartitionSize) > 0 {
199*333d2b36SAndroid Build Coastguard Worker		return true
200*333d2b36SAndroid Build Coastguard Worker	}
201*333d2b36SAndroid Build Coastguard Worker
202*333d2b36SAndroid Build Coastguard Worker	// TODO: return true if BOARD_KERNEL_BINARIES is set and has a *_BOOTIMAGE_PARTITION_SIZE
203*333d2b36SAndroid Build Coastguard Worker	// variable. However, I don't think BOARD_KERNEL_BINARIES is ever set in practice.
204*333d2b36SAndroid Build Coastguard Worker
205*333d2b36SAndroid Build Coastguard Worker	return false
206*333d2b36SAndroid Build Coastguard Worker}
207*333d2b36SAndroid Build Coastguard Worker
208*333d2b36SAndroid Build Coastguard Worker// Returns the equivalent of the BUILDING_VENDOR_BOOT_IMAGE variable in make. Derived from this logic:
209*333d2b36SAndroid Build Coastguard Worker// https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=518;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
210*333d2b36SAndroid Build Coastguard Workerfunc buildingVendorBootImage(partitionVars android.PartitionVariables) bool {
211*333d2b36SAndroid Build Coastguard Worker	if v, exists := boardBootHeaderVersion(partitionVars); exists && v >= 3 {
212*333d2b36SAndroid Build Coastguard Worker		x := partitionVars.ProductBuildVendorBootImage
213*333d2b36SAndroid Build Coastguard Worker		if x == "" || x == "true" {
214*333d2b36SAndroid Build Coastguard Worker			return true
215*333d2b36SAndroid Build Coastguard Worker		}
216*333d2b36SAndroid Build Coastguard Worker	}
217*333d2b36SAndroid Build Coastguard Worker
218*333d2b36SAndroid Build Coastguard Worker	return false
219*333d2b36SAndroid Build Coastguard Worker}
220*333d2b36SAndroid Build Coastguard Worker
221*333d2b36SAndroid Build Coastguard Worker// Derived from: https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/board_config.mk;l=480;drc=5b55f926830963c02ab1d2d91e46442f04ba3af0
222*333d2b36SAndroid Build Coastguard Workerfunc buildingInitBootImage(partitionVars android.PartitionVariables) bool {
223*333d2b36SAndroid Build Coastguard Worker	if !partitionVars.ProductBuildInitBootImage {
224*333d2b36SAndroid Build Coastguard Worker		if partitionVars.BoardUsesRecoveryAsBoot || len(partitionVars.BoardPrebuiltInitBootimage) > 0 {
225*333d2b36SAndroid Build Coastguard Worker			return false
226*333d2b36SAndroid Build Coastguard Worker		} else if len(partitionVars.BoardInitBootimagePartitionSize) > 0 {
227*333d2b36SAndroid Build Coastguard Worker			return true
228*333d2b36SAndroid Build Coastguard Worker		}
229*333d2b36SAndroid Build Coastguard Worker	} else {
230*333d2b36SAndroid Build Coastguard Worker		if partitionVars.BoardUsesRecoveryAsBoot {
231*333d2b36SAndroid Build Coastguard Worker			panic("PRODUCT_BUILD_INIT_BOOT_IMAGE is true, but so is BOARD_USES_RECOVERY_AS_BOOT. Use only one option.")
232*333d2b36SAndroid Build Coastguard Worker		}
233*333d2b36SAndroid Build Coastguard Worker		return true
234*333d2b36SAndroid Build Coastguard Worker	}
235*333d2b36SAndroid Build Coastguard Worker	return false
236*333d2b36SAndroid Build Coastguard Worker}
237*333d2b36SAndroid Build Coastguard Worker
238*333d2b36SAndroid Build Coastguard Workerfunc boardBootHeaderVersion(partitionVars android.PartitionVariables) (int, bool) {
239*333d2b36SAndroid Build Coastguard Worker	if len(partitionVars.BoardBootHeaderVersion) == 0 {
240*333d2b36SAndroid Build Coastguard Worker		return 0, false
241*333d2b36SAndroid Build Coastguard Worker	}
242*333d2b36SAndroid Build Coastguard Worker	v, err := strconv.ParseInt(partitionVars.BoardBootHeaderVersion, 10, 32)
243*333d2b36SAndroid Build Coastguard Worker	if err != nil {
244*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Sprintf("BOARD_BOOT_HEADER_VERSION must be an int, got: %q", partitionVars.BoardBootHeaderVersion))
245*333d2b36SAndroid Build Coastguard Worker	}
246*333d2b36SAndroid Build Coastguard Worker	return int(v), true
247*333d2b36SAndroid Build Coastguard Worker}
248*333d2b36SAndroid Build Coastguard Worker
249*333d2b36SAndroid Build Coastguard Workertype dtbImg struct {
250*333d2b36SAndroid Build Coastguard Worker	// whether to include the dtb image in boot image
251*333d2b36SAndroid Build Coastguard Worker	include bool
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Worker	// name of the generated dtb image filegroup name
254*333d2b36SAndroid Build Coastguard Worker	name string
255*333d2b36SAndroid Build Coastguard Worker
256*333d2b36SAndroid Build Coastguard Worker	// type of the boot image that the dtb image argument should be specified
257*333d2b36SAndroid Build Coastguard Worker	imgType string
258*333d2b36SAndroid Build Coastguard Worker}
259*333d2b36SAndroid Build Coastguard Worker
260*333d2b36SAndroid Build Coastguard Workerfunc createDtbImgFilegroup(ctx android.LoadHookContext) dtbImg {
261*333d2b36SAndroid Build Coastguard Worker	partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
262*333d2b36SAndroid Build Coastguard Worker	if !partitionVars.BoardIncludeDtbInBootimg {
263*333d2b36SAndroid Build Coastguard Worker		return dtbImg{include: false}
264*333d2b36SAndroid Build Coastguard Worker	}
265*333d2b36SAndroid Build Coastguard Worker	for _, copyFilePair := range partitionVars.ProductCopyFiles {
266*333d2b36SAndroid Build Coastguard Worker		srcDestList := strings.Split(copyFilePair, ":")
267*333d2b36SAndroid Build Coastguard Worker		if len(srcDestList) < 2 {
268*333d2b36SAndroid Build Coastguard Worker			ctx.ModuleErrorf("PRODUCT_COPY_FILES must follow the format \"src:dest\", got: %s", copyFilePair)
269*333d2b36SAndroid Build Coastguard Worker		}
270*333d2b36SAndroid Build Coastguard Worker		if srcDestList[1] == "dtb.img" {
271*333d2b36SAndroid Build Coastguard Worker			moduleName := generatedModuleName(ctx.Config(), "dtb_img_filegroup")
272*333d2b36SAndroid Build Coastguard Worker			ctx.CreateModuleInDirectory(
273*333d2b36SAndroid Build Coastguard Worker				android.FileGroupFactory,
274*333d2b36SAndroid Build Coastguard Worker				filepath.Dir(srcDestList[0]),
275*333d2b36SAndroid Build Coastguard Worker				&struct {
276*333d2b36SAndroid Build Coastguard Worker					Name *string
277*333d2b36SAndroid Build Coastguard Worker					Srcs []string
278*333d2b36SAndroid Build Coastguard Worker				}{
279*333d2b36SAndroid Build Coastguard Worker					Name: proptools.StringPtr(moduleName),
280*333d2b36SAndroid Build Coastguard Worker					Srcs: []string{filepath.Base(srcDestList[1])},
281*333d2b36SAndroid Build Coastguard Worker				},
282*333d2b36SAndroid Build Coastguard Worker			)
283*333d2b36SAndroid Build Coastguard Worker			imgType := "vendor_boot"
284*333d2b36SAndroid Build Coastguard Worker			if !buildingVendorBootImage(partitionVars) {
285*333d2b36SAndroid Build Coastguard Worker				imgType = "boot"
286*333d2b36SAndroid Build Coastguard Worker			}
287*333d2b36SAndroid Build Coastguard Worker			return dtbImg{include: true, name: moduleName, imgType: imgType}
288*333d2b36SAndroid Build Coastguard Worker		}
289*333d2b36SAndroid Build Coastguard Worker	}
290*333d2b36SAndroid Build Coastguard Worker	return dtbImg{include: false}
291*333d2b36SAndroid Build Coastguard Worker}
292*333d2b36SAndroid Build Coastguard Worker
293*333d2b36SAndroid Build Coastguard Workerfunc createVendorBootConfigImg(ctx android.LoadHookContext) (string, bool) {
294*333d2b36SAndroid Build Coastguard Worker	partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
295*333d2b36SAndroid Build Coastguard Worker	bootconfig := partitionVars.InternalBootconfig
296*333d2b36SAndroid Build Coastguard Worker	bootconfigFile := partitionVars.InternalBootconfigFile
297*333d2b36SAndroid Build Coastguard Worker	if len(bootconfig) == 0 && len(bootconfigFile) == 0 {
298*333d2b36SAndroid Build Coastguard Worker		return "", false
299*333d2b36SAndroid Build Coastguard Worker	}
300*333d2b36SAndroid Build Coastguard Worker
301*333d2b36SAndroid Build Coastguard Worker	vendorBootconfigImgModuleName := generatedModuleName(ctx.Config(), "vendor_bootconfig_image")
302*333d2b36SAndroid Build Coastguard Worker
303*333d2b36SAndroid Build Coastguard Worker	ctx.CreateModule(
304*333d2b36SAndroid Build Coastguard Worker		filesystem.BootconfigModuleFactory,
305*333d2b36SAndroid Build Coastguard Worker		&struct {
306*333d2b36SAndroid Build Coastguard Worker			Name             *string
307*333d2b36SAndroid Build Coastguard Worker			Boot_config      []string
308*333d2b36SAndroid Build Coastguard Worker			Boot_config_file *string
309*333d2b36SAndroid Build Coastguard Worker		}{
310*333d2b36SAndroid Build Coastguard Worker			Name:             proptools.StringPtr(vendorBootconfigImgModuleName),
311*333d2b36SAndroid Build Coastguard Worker			Boot_config:      bootconfig,
312*333d2b36SAndroid Build Coastguard Worker			Boot_config_file: proptools.StringPtr(bootconfigFile),
313*333d2b36SAndroid Build Coastguard Worker		},
314*333d2b36SAndroid Build Coastguard Worker	)
315*333d2b36SAndroid Build Coastguard Worker
316*333d2b36SAndroid Build Coastguard Worker	return vendorBootconfigImgModuleName, true
317*333d2b36SAndroid Build Coastguard Worker}
318