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