android: support dttable for dtb in boot/vendor_boot
Bug: 405201147
Change-Id: I240beb9902e760683783840239c62e3f6ea92e37
Signed-off-by: Dmitrii Merkurev <dimorinny@google.com>
diff --git a/gbl/libgbl/src/android_boot/mod.rs b/gbl/libgbl/src/android_boot/mod.rs
index 132ab5d..f5b9932 100644
--- a/gbl/libgbl/src/android_boot/mod.rs
+++ b/gbl/libgbl/src/android_boot/mod.rs
@@ -29,7 +29,7 @@
use core::{array::from_fn, ffi::CStr};
use dttable::DtTableImage;
use fastboot::local_session::LocalSession;
-use fdt::Fdt;
+use fdt::{Fdt, FdtHeader};
use gbl_async::block_on;
use liberror::Error;
use libutils::{aligned_offset, aligned_subslice};
@@ -84,8 +84,26 @@
if images.dtb.len() > 0 {
gbl_println!(ops, "Handling device tree from boot/vendor_boot");
- remains =
- components.append(ops, DeviceTreeComponentSource::Boot, images.dtb, remains)?;
+ remains = if FdtHeader::from_bytes_ref(images.dtb).is_ok() {
+ gbl_println!(ops, "Device tree found in boot/vendor_boot");
+ components.append(ops, DeviceTreeComponentSource::Boot, images.dtb, remains)?
+ } else if let Ok(table) = DtTableImage::from_bytes(images.dtb) {
+ gbl_println!(
+ ops,
+ "Dttable with {} entries found in boot/vendor_boot",
+ table.entries_count()
+ );
+ components.append_from_dttable(
+ DeviceTreeComponentSource::Boot,
+ &table,
+ remains,
+ )?
+ } else {
+ return Err(Error::Other(Some(
+ "Invalid or unrecognized device tree format in boot/vendor_boot",
+ ))
+ .into());
+ }
}
if images.dtb_part.len() > 0 {
@@ -795,6 +813,46 @@
test_android_load_verify_fixup_v3_or_v4_no_init_boot(4, 4, 'b', config, parts, fdt_prop);
}
+ /// Helper for testing `android_load_verify_fixup` with dttable vendor_boot
+ fn test_android_load_verify_fixup_v4_vendor_boot_dttable(
+ slot: char,
+ expected_vendor_bootconfig: &str,
+ additional_parts: &[(CString, String)],
+ additional_expected_fdt_properties: &[(&str, &CStr, Option<&[u8]>)],
+ ) {
+ let vbmeta = format!("vbmeta_v4_dttable_{slot}.img");
+ let mut parts: Vec<(CString, String)> = vec![
+ (CString::new(format!("boot_{slot}")).unwrap(), format!("boot_v4_{slot}.img")),
+ (
+ CString::new(format!("vendor_boot_{slot}")).unwrap(),
+ format!("vendor_boot_v4_dttable_{slot}.img"),
+ ),
+ (CString::new(format!("vbmeta_{slot}")).unwrap(), vbmeta.clone()),
+ ];
+ parts.extend_from_slice(additional_parts);
+ test_android_load_verify_fixup_v3_or_v4(
+ slot,
+ &parts,
+ &vbmeta,
+ expected_vendor_bootconfig,
+ additional_expected_fdt_properties,
+ );
+ }
+
+ #[test]
+ fn test_android_load_verify_fixup_v4_v4_no_init_boot_slot_dttable_vendor_boot_a() {
+ let fdt_prop: &[(&str, &CStr, Option<&[u8]>)] = &[("/chosen", c"builtin", Some(&[1]))];
+ let config = TEST_VENDOR_BOOTCONFIG;
+ test_android_load_verify_fixup_v4_vendor_boot_dttable('a', config, &[], fdt_prop);
+ }
+
+ #[test]
+ fn test_android_load_verify_fixup_v4_v4_no_init_boot_slot_dttable_vendor_boot_b() {
+ let fdt_prop: &[(&str, &CStr, Option<&[u8]>)] = &[("/chosen", c"builtin", Some(&[1]))];
+ let config = TEST_VENDOR_BOOTCONFIG;
+ test_android_load_verify_fixup_v4_vendor_boot_dttable('b', config, &[], fdt_prop);
+ }
+
/// Helper for testing `android_load_verify_fixup` for v3/v4 boot image with init_boot.
fn test_android_load_verify_fixup_v3_or_v4_init_boot(
boot_ver: u32,
diff --git a/gbl/libgbl/testdata/android/dtb.img b/gbl/libgbl/testdata/android/dtb.img
new file mode 100644
index 0000000..1ea26fa
--- /dev/null
+++ b/gbl/libgbl/testdata/android/dtb.img
Binary files differ
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.boot.digest.txt b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.boot.digest.txt
new file mode 100644
index 0000000..8cc8826
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.boot.digest.txt
@@ -0,0 +1 @@
+fe6845837f27613699770d58a19b2405c4b23c203fe1edb0133b30e3d496945c
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.digest.txt b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.digest.txt
new file mode 100644
index 0000000..c09919d
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.digest.txt
@@ -0,0 +1 @@
+450823eddf5bf1600790b612b24b32552d9454a1420188cdf7a279844431a3a2a82ecc367125d265c724066427993ffe2adc303782fb93850fef1cc10866b215
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.dtb.digest.txt b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.dtb.digest.txt
new file mode 100644
index 0000000..8460aa7
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.dtb.digest.txt
@@ -0,0 +1 @@
+74024f7c9577215434dba9b695c3501eb626f66b97c810ff5307912c7fac7938
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.dtbo.digest.txt b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.dtbo.digest.txt
new file mode 100644
index 0000000..0013aed
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.dtbo.digest.txt
@@ -0,0 +1 @@
+18964fe84fd9214ae7d61c7f0d7d951412b6ce7f1c3e49a8f896a40da2ddde3f
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.img b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.img
new file mode 100644
index 0000000..12f0ac8
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.img
Binary files differ
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.vendor_boot.digest.txt b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.vendor_boot.digest.txt
new file mode 100644
index 0000000..8c33e8a
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_a.vendor_boot.digest.txt
@@ -0,0 +1 @@
+f9cad72ad63c87e97ca0ef89e00d5297b4731145a7916cf34cdcd6c03d68a0ca
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.boot.digest.txt b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.boot.digest.txt
new file mode 100644
index 0000000..c7fb6e2
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.boot.digest.txt
@@ -0,0 +1 @@
+54c83f6d25648f1628b9049978f05eaac878523e2ad9da50e80e4591f709e8db
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.digest.txt b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.digest.txt
new file mode 100644
index 0000000..0ee67db
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.digest.txt
@@ -0,0 +1 @@
+7062df4c2e595c354a31e07ae33a627a0fdaae0bfd80b35ba569df0978165f7b4761184226f62efc479cff8fe85d032e2f5f9e7bced536dd5761ef054a0d8548
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.dtb.digest.txt b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.dtb.digest.txt
new file mode 100644
index 0000000..22afb3f
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.dtb.digest.txt
@@ -0,0 +1 @@
+6227f3fbf15d3049f03c9829016372e1387cd07eb1b23bc8ae640545c0b3a398
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.dtbo.digest.txt b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.dtbo.digest.txt
new file mode 100644
index 0000000..74ca578
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.dtbo.digest.txt
@@ -0,0 +1 @@
+8e3d69eba96fb6723bb4f29a1fa4dd3737bc352d1b3c05a7946778e685307fe4
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.img b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.img
new file mode 100644
index 0000000..79c8c21
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.img
Binary files differ
diff --git a/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.vendor_boot.digest.txt b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.vendor_boot.digest.txt
new file mode 100644
index 0000000..a2af6a3
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vbmeta_v4_dttable_b.vendor_boot.digest.txt
@@ -0,0 +1 @@
+1686ca796de1300d09238cbe1828d59405224b7e5dc913a653071734af6f01da
diff --git a/gbl/libgbl/testdata/android/vendor_boot_v4_dttable_a.img b/gbl/libgbl/testdata/android/vendor_boot_v4_dttable_a.img
new file mode 100644
index 0000000..2ea1bfa
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vendor_boot_v4_dttable_a.img
Binary files differ
diff --git a/gbl/libgbl/testdata/android/vendor_boot_v4_dttable_b.img b/gbl/libgbl/testdata/android/vendor_boot_v4_dttable_b.img
new file mode 100644
index 0000000..941024f
--- /dev/null
+++ b/gbl/libgbl/testdata/android/vendor_boot_v4_dttable_b.img
Binary files differ
diff --git a/gbl/libgbl/testdata/gen_test_data.py b/gbl/libgbl/testdata/gen_test_data.py
index 8c55a19..1c37d29 100755
--- a/gbl/libgbl/testdata/gen_test_data.py
+++ b/gbl/libgbl/testdata/gen_test_data.py
@@ -176,6 +176,19 @@
gen_dtb(
out_dir / "device_tree_custom.dts", out_dir / "device_tree_custom.dtb"
)
+ # Generates dtb to be used inside boot/vendor_boot
+ subprocess.run(
+ [
+ MKDTBOIMG_TOOL,
+ "create",
+ out_dir / "dtb.img",
+ "--id=0x1",
+ "--rev=0x0",
+ out_dir / "device_tree.dtb",
+ ],
+ stderr=subprocess.STDOUT,
+ check=True,
+ )
# Generates dtb_a/dtb_b
gen_dtb(out_dir / "device_tree_a.dts", out_dir / "device_tree_a.dtb")
@@ -439,6 +452,8 @@
subprocess.run(
common
+ [
+ "--dtb",
+ out_dir / "device_tree.dtb",
"--vendor_boot",
out_dir / f"vendor_boot_v3_{slot}.img",
"--header_version",
@@ -451,6 +466,8 @@
subprocess.run(
common
+ [
+ "--dtb",
+ out_dir / "device_tree.dtb",
"--vendor_boot",
out_dir / f"vendor_boot_v4_{slot}.img",
"--vendor_bootconfig",
@@ -461,6 +478,22 @@
stderr=subprocess.STDOUT,
check=True,
)
+ # Generates vendor_boot v4 with dttable structure
+ subprocess.run(
+ common
+ + [
+ "--dtb",
+ out_dir / "dtb.img",
+ "--vendor_boot",
+ out_dir / f"vendor_boot_v4_dttable_{slot}.img",
+ "--vendor_bootconfig",
+ vendor_bootconfig,
+ "--header_version",
+ "4",
+ ],
+ stderr=subprocess.STDOUT,
+ check=True,
+ )
# Generates a vbmeta data for v0 - v2 setup
for i in [0, 1, 2]:
@@ -508,6 +541,19 @@
gen_android_test_vbmeta(parts, out_dir / vbmeta_out)
+ # Generate v4 vbmeta image for vendor_boot with dttable structure
+ vbmeta_out = out_dir / \
+ f"vbmeta_v4_dttable_{slot}.img"
+ parts = [
+ (f"boot", out_dir /
+ f"boot_v4_{slot}.img"),
+ (f"vendor_boot", out_dir /
+ f"vendor_boot_v4_dttable_{slot}.img"),
+ ("dtbo", out_dir / f"dtbo_{slot}.img"),
+ ("dtb", out_dir / f"dtb_{slot}.img"),
+ ]
+ gen_android_test_vbmeta(parts, vbmeta_out)
+
# Generate v4 vbmeta images for both gzip and lz4 kernel compression.
if slot == "a":
for compression in ["gz", "lz4"]: