msm_kernel_lagvm.bzl 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. load("//build/bazel_common_rules/dist:dist.bzl", "copy_to_dist_dir")
  2. load("//build/kernel/kleaf:constants.bzl", "aarch64_outs")
  3. load(
  4. "//build/kernel/kleaf:kernel.bzl",
  5. "kernel_build",
  6. "kernel_build_config",
  7. "kernel_compile_commands",
  8. "kernel_images",
  9. "kernel_modules_install",
  10. "kernel_uapi_headers_cc_library",
  11. "merged_kernel_uapi_headers",
  12. "super_image",
  13. "unsparsed_image",
  14. )
  15. load(
  16. "//build:msm_kernel_extensions.bzl",
  17. "define_extras",
  18. "get_build_config_fragments",
  19. "get_dtb_list",
  20. "get_dtbo_list",
  21. "get_dtstree",
  22. "get_gki_ramdisk_prebuilt_binary",
  23. "get_vendor_ramdisk_binaries",
  24. )
  25. load("@bazel_skylib//rules:write_file.bzl", "write_file")
  26. load(":msm_common.bzl", "define_top_level_config", "gen_config_without_source_lines", "get_out_dir")
  27. load(":msm_dtc.bzl", "define_dtc_dist")
  28. load(":msm_abl.bzl", "define_abl_dist")
  29. load(":avb_boot_img.bzl", "avb_sign_boot_image")
  30. load(":image_opts.bzl", "boot_image_opts")
  31. load(":target_variants.bzl", "lxc_variants")
  32. load(":modules.bzl", "get_gki_modules_list")
  33. def _define_build_config(
  34. msm_target,
  35. target,
  36. variant,
  37. boot_image_opts = boot_image_opts(),
  38. build_config_fragments = []):
  39. """Creates a kernel_build_config for an MSM target
  40. Creates a `kernel_build_config` for input to a `kernel_build` rule.
  41. Args:
  42. msm_target: name of target platform (e.g. "kalama")
  43. variant: variant of kernel to build (e.g. "gki")
  44. """
  45. # keep earlycon addr in earlycon cmdline param only when provided explicitly in target's bazel file
  46. # otherwise, rely on stdout-path
  47. earlycon_param = "={}".format(boot_image_opts.earlycon_addr) if boot_image_opts.earlycon_addr != None else ""
  48. earlycon_param = '[ "$KERNEL_CMDLINE_CONSOLE_AUTO" != "0" ] && KERNEL_VENDOR_CMDLINE+=\' earlycon{} \''.format(earlycon_param)
  49. write_file(
  50. name = "{}_build_config_bazel".format(target),
  51. out = "build.config.msm.{}.generated".format(target),
  52. content = [
  53. 'KERNEL_DIR="msm-kernel"',
  54. "VARIANTS=({})".format(" ".join([v.replace("-", "_") for v in lxc_variants])),
  55. "MSM_ARCH={}".format(msm_target.replace("-", "_")),
  56. "VARIANT={}".format(variant.replace("-", "_")),
  57. "ABL_SRC=bootable/bootloader/edk2",
  58. "BOOT_IMAGE_HEADER_VERSION={}".format(boot_image_opts.boot_image_header_version),
  59. "BASE_ADDRESS=0x%X" % boot_image_opts.base_address,
  60. "PAGE_SIZE={}".format(boot_image_opts.page_size),
  61. "BUILD_VENDOR_DLKM=1",
  62. "PREPARE_SYSTEM_DLKM=1",
  63. "SUPER_IMAGE_SIZE=0x%X" % boot_image_opts.super_image_size,
  64. "TRIM_UNUSED_MODULES=1",
  65. "BUILD_INIT_BOOT_IMG=1",
  66. "LZ4_RAMDISK={}".format(int(boot_image_opts.lz4_ramdisk)),
  67. '[ -z "$DT_OVERLAY_SUPPORT" ] && DT_OVERLAY_SUPPORT=1',
  68. earlycon_param,
  69. "KERNEL_VENDOR_CMDLINE+=' {} '".format(" ".join(boot_image_opts.kernel_vendor_cmdline_extras)),
  70. "VENDOR_BOOTCONFIG+='androidboot.first_stage_console=1 androidboot.hardware=qcom_kp'",
  71. "", # Needed for newline at end of file
  72. ],
  73. )
  74. top_level_config = define_top_level_config(target)
  75. common_config = gen_config_without_source_lines("build.config.common", target)
  76. # Concatenate build config fragments to form the final config
  77. kernel_build_config(
  78. name = "{}_build_config".format(target),
  79. srcs = [
  80. # do not sort
  81. top_level_config,
  82. "build.config.constants",
  83. common_config,
  84. "build.config.aarch64",
  85. ":{}_build_config_bazel".format(target),
  86. ] + [fragment for fragment in build_config_fragments] + [
  87. "build.config.msm.common",
  88. "build.config.msm.autoghgvm",
  89. ],
  90. )
  91. board_cmdline_extras = " ".join(boot_image_opts.board_kernel_cmdline_extras)
  92. if board_cmdline_extras:
  93. write_file(
  94. name = "{}_extra_cmdline".format(target),
  95. out = "board_extra_cmdline_{}".format(target),
  96. content = [board_cmdline_extras, ""],
  97. )
  98. board_bc_extras = " ".join(boot_image_opts.board_bootconfig_extras)
  99. if board_bc_extras:
  100. write_file(
  101. name = "{}_extra_bootconfig".format(target),
  102. out = "board_extra_bootconfig_{}".format(target),
  103. content = [board_bc_extras, ""],
  104. )
  105. def _define_kernel_build(
  106. target,
  107. in_tree_module_list,
  108. dtb_list,
  109. dtbo_list,
  110. dtstree):
  111. """Creates a `kernel_build` and other associated definitions
  112. This is where the main kernel build target is created (e.g. `//msm-kernel:kalama_gki`).
  113. Many other rules will take this `kernel_build` as an input.
  114. Args:
  115. target: name of main Bazel target (e.g. `kalama_gki`)
  116. in_tree_module_list: list of in-tree modules
  117. dtb_list: device tree blobs expected to be built
  118. dtbo_list: device tree overlay blobs expected to be built
  119. """
  120. out_list = [".config", "Module.symvers"]
  121. if dtb_list:
  122. out_list += dtb_list
  123. if dtbo_list:
  124. out_list += dtbo_list
  125. # Add basic kernel outputs
  126. out_list += aarch64_outs
  127. # Remove unused compressed formats
  128. out_list.remove("Image.lz4")
  129. out_list.remove("Image.gz")
  130. kernel_build(
  131. name = target,
  132. module_outs = in_tree_module_list,
  133. module_implicit_outs = get_gki_modules_list("arm64"),
  134. outs = out_list,
  135. build_config = ":{}_build_config".format(target),
  136. dtstree = dtstree,
  137. kmi_symbol_list = None,
  138. additional_kmi_symbol_lists = None,
  139. abi_definition = None,
  140. visibility = ["//visibility:public"],
  141. )
  142. kernel_modules_install(
  143. name = "{}_modules_install".format(target),
  144. kernel_build = ":{}".format(target),
  145. )
  146. merged_kernel_uapi_headers(
  147. name = "{}_merged_kernel_uapi_headers".format(target),
  148. kernel_build = ":{}".format(target),
  149. )
  150. kernel_compile_commands(
  151. name = "{}_compile_commands".format(target),
  152. kernel_build = ":{}".format(target),
  153. )
  154. def _define_image_build(
  155. target,
  156. msm_target,
  157. base_kernel,
  158. build_boot = True,
  159. build_dtbo = False,
  160. build_initramfs = False,
  161. boot_image_opts = boot_image_opts(),
  162. boot_image_outs = None,
  163. dtbo_list = [],
  164. vendor_ramdisk_binaries = None,
  165. gki_ramdisk_prebuilt_binary = None,
  166. in_tree_module_list = []):
  167. """Creates a `kernel_images` target which will generate bootable device images
  168. Args:
  169. target: name of main Bazel target (e.g. `kalama_gki`)
  170. msm_target: name of target platform (e.g. "kalama")
  171. base_kernel: kernel_build base kernel
  172. build_boot: whether to build a boot image
  173. build_dtbo: whether to build a dtbo image
  174. build_initramfs: whether to build an initramfs image
  175. boot_image_outs: boot image outputs,
  176. dtbo_list: list of device tree overlay blobs to be built into `dtbo.img`
  177. vendor_ramdisk_binaries: ramdisk binaries (cpio archives)
  178. """
  179. # Generate the vendor_dlkm list
  180. native.genrule(
  181. name = "{}_vendor_dlkm_modules_list_generated".format(target),
  182. srcs = [],
  183. outs = ["modules.list.vendor_dlkm.{}".format(target)],
  184. cmd_bash = """
  185. touch "$@"
  186. for module in {mod_list}; do
  187. basename "$$module" >> "$@"
  188. done
  189. """.format(mod_list = " ".join(in_tree_module_list)),
  190. )
  191. kernel_images(
  192. name = "{}_images".format(target),
  193. kernel_modules_install = ":{}_modules_install".format(target),
  194. kernel_build = ":{}".format(target),
  195. base_kernel_images = "{}_images".format(base_kernel),
  196. build_boot = build_boot,
  197. build_dtbo = build_dtbo,
  198. build_initramfs = build_initramfs,
  199. build_vendor_boot = False,
  200. build_vendor_kernel_boot = False,
  201. build_vendor_dlkm = False,
  202. build_system_dlkm = False,
  203. modules_list = "modules.list.msm.{}".format(msm_target),
  204. system_dlkm_modules_list = "android/gki_system_dlkm_modules",
  205. vendor_dlkm_modules_list = ":{}_vendor_dlkm_modules_list_generated".format(target),
  206. system_dlkm_modules_blocklist = "modules.systemdlkm_blocklist.msm.{}".format(msm_target),
  207. vendor_dlkm_modules_blocklist = "modules.vendor_blocklist.msm.{}".format(msm_target),
  208. dtbo_srcs = [":{}/".format(target) + d for d in dtbo_list] if dtbo_list else None,
  209. vendor_ramdisk_binaries = vendor_ramdisk_binaries,
  210. gki_ramdisk_prebuilt_binary = gki_ramdisk_prebuilt_binary,
  211. boot_image_outs = boot_image_outs,
  212. deps = [
  213. "modules.list.msm.{}".format(msm_target),
  214. "modules.vendor_blocklist.msm.{}".format(msm_target),
  215. "modules.systemdlkm_blocklist.msm.{}".format(msm_target),
  216. "android/gki_system_dlkm_modules",
  217. ],
  218. )
  219. if build_boot:
  220. artifacts = "{}_images".format(target)
  221. else:
  222. artifacts = "{}_gki_artifacts".format(base_kernel)
  223. avb_sign_boot_image(
  224. name = "{}_avb_sign_boot_image".format(target),
  225. artifacts = artifacts,
  226. avbtool = "//prebuilts/kernel-build-tools:linux-x86/bin/avbtool",
  227. key = "//tools/mkbootimg:gki/testdata/testkey_rsa4096.pem",
  228. props = [
  229. "com.android.build.boot.os_version:13",
  230. "com.android.build.boot.security_patch:2023-05-05",
  231. ],
  232. boot_partition_size = int(boot_image_opts.boot_partition_size),
  233. )
  234. native.filegroup(
  235. name = "{}_system_dlkm_image_file".format(target),
  236. srcs = ["{}_images".format(base_kernel)],
  237. output_group = "system_dlkm.img",
  238. )
  239. native.filegroup(
  240. name = "{}_vendor_dlkm_image_file".format(target),
  241. srcs = [":{}_images".format(target)],
  242. output_group = "vendor_dlkm.img",
  243. )
  244. super_image(
  245. name = "{}_super_image".format(target),
  246. system_dlkm_image = ":{}_system_dlkm_image_file".format(target),
  247. vendor_dlkm_image = ":{}_vendor_dlkm_image_file".format(target),
  248. )
  249. unsparsed_image(
  250. name = "{}_unsparsed_image".format(target),
  251. src = "{}_super_image".format(target),
  252. out = "super_unsparsed.img",
  253. )
  254. def _define_kernel_dist(
  255. target,
  256. msm_target,
  257. variant,
  258. boot_image_opts = boot_image_opts()):
  259. """Creates distribution targets for kernel builds
  260. When Bazel builds everything, the outputs end up buried in `bazel-bin`.
  261. These rules are used to copy the build artifacts to `out/msm-kernel-<target>/dist/`
  262. with proper permissions, etc.
  263. Args:
  264. target: name of main Bazel target (e.g. `kalama_gki`)
  265. msm_target: name of just the platform target (e.g. `kalama`)
  266. variant: name of just the variant (e.g. `gki`)
  267. """
  268. dist_dir = get_out_dir(msm_target, variant) + "/dist"
  269. msm_dist_targets = [
  270. # do not sort
  271. ":{}".format(target),
  272. ":{}_images".format(target),
  273. ":{}_merged_kernel_uapi_headers".format(target),
  274. ":{}_build_config".format(target),
  275. ]
  276. copy_to_dist_dir(
  277. name = "{}_dist".format(target),
  278. data = msm_dist_targets,
  279. dist_dir = dist_dir,
  280. flat = True,
  281. wipe_dist_dir = True,
  282. allow_duplicate_filenames = True,
  283. mode_overrides = {
  284. # do not sort
  285. "**/*.elf": "755",
  286. "**/vmlinux": "755",
  287. "**/Image": "755",
  288. "**/*.dtb*": "755",
  289. "**/LinuxLoader*": "755",
  290. "**/*": "644",
  291. },
  292. log = "info",
  293. )
  294. def _define_uapi_library(target):
  295. """Define a cc_library for userspace programs to use
  296. Args:
  297. target: kernel_build target name (e.g. "kalama_gki")
  298. """
  299. kernel_uapi_headers_cc_library(
  300. name = "{}_uapi_header_library".format(target),
  301. kernel_build = ":{}".format(target),
  302. )
  303. def define_msm_lagvm(
  304. msm_target,
  305. variant,
  306. in_tree_module_list,
  307. boot_image_opts = boot_image_opts()):
  308. """Top-level kernel build definition macro for an MSM platform
  309. Args:
  310. msm_target: name of target platform (e.g. "kalama")
  311. variant: variant of kernel to build (e.g. "gki")
  312. in_tree_module_list: list of in-tree modules
  313. boot_image_header_version: boot image header version (for `boot.img`)
  314. base_address: edk2 base address
  315. page_size: kernel page size
  316. super_image_size: size of super image partition
  317. lz4_ramdisk: whether to use an lz4-compressed ramdisk
  318. """
  319. if not variant in lxc_variants:
  320. fail("{} not defined in target_variants.bzl lxc_variants!".format(variant))
  321. # Enforce format of "//msm-kernel:target-foo_variant-bar" (underscore is the delimeter
  322. # between target and variant)
  323. target = msm_target.replace("_", "-") + "_" + variant.replace("_", "-")
  324. # Always set base_kernel to kernel_aarch64
  325. base_kernel = "//common:kernel_aarch64"
  326. lxc_target = msm_target.split("-")[0]
  327. dtb_list = get_dtb_list(lxc_target)
  328. dtbo_list = get_dtbo_list(lxc_target)
  329. dtstree = get_dtstree(lxc_target)
  330. vendor_ramdisk_binaries = get_vendor_ramdisk_binaries(target)
  331. gki_ramdisk_prebuilt_binary = get_gki_ramdisk_prebuilt_binary()
  332. build_config_fragments = get_build_config_fragments(lxc_target)
  333. _define_build_config(
  334. lxc_target,
  335. target,
  336. variant,
  337. boot_image_opts = boot_image_opts,
  338. build_config_fragments = build_config_fragments,
  339. )
  340. _define_kernel_build(
  341. target,
  342. in_tree_module_list,
  343. dtb_list,
  344. dtbo_list,
  345. dtstree,
  346. )
  347. _define_image_build(
  348. target,
  349. msm_target,
  350. base_kernel,
  351. # When building a GKI target, we take the kernel and boot.img directly from
  352. # common, so no need to build here.
  353. build_boot = True,
  354. build_dtbo = True,
  355. build_initramfs = True,
  356. dtbo_list = dtbo_list,
  357. vendor_ramdisk_binaries = vendor_ramdisk_binaries,
  358. boot_image_opts = boot_image_opts,
  359. boot_image_outs = None if dtb_list else ["boot.img", "init_boot.img"],
  360. in_tree_module_list = in_tree_module_list,
  361. )
  362. _define_kernel_dist(
  363. target,
  364. msm_target,
  365. variant,
  366. boot_image_opts = boot_image_opts,
  367. )
  368. _define_uapi_library(target)
  369. define_abl_dist(target, msm_target, variant)
  370. define_dtc_dist(target, msm_target, variant)
  371. define_extras(target)