xref: /aosp_15_r20/external/crosvm/arch/src/android.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2019 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use std::fs::File;
6*bb4ee6a4SAndroid Build Coastguard Worker use std::io::BufRead;
7*bb4ee6a4SAndroid Build Coastguard Worker use std::io::BufReader;
8*bb4ee6a4SAndroid Build Coastguard Worker 
9*bb4ee6a4SAndroid Build Coastguard Worker use cros_fdt::Error;
10*bb4ee6a4SAndroid Build Coastguard Worker use cros_fdt::Fdt;
11*bb4ee6a4SAndroid Build Coastguard Worker use cros_fdt::Result;
12*bb4ee6a4SAndroid Build Coastguard Worker 
parse_fstab_line(line: &str) -> Result<Vec<String>>13*bb4ee6a4SAndroid Build Coastguard Worker fn parse_fstab_line(line: &str) -> Result<Vec<String>> {
14*bb4ee6a4SAndroid Build Coastguard Worker     let vec: Vec<&str> = line.split_whitespace().collect();
15*bb4ee6a4SAndroid Build Coastguard Worker     if vec.len() != 5 {
16*bb4ee6a4SAndroid Build Coastguard Worker         return Err(Error::FdtParseError("invalid fstab format".into()));
17*bb4ee6a4SAndroid Build Coastguard Worker     }
18*bb4ee6a4SAndroid Build Coastguard Worker     Ok(vec.iter().map(|s| s.to_string()).collect())
19*bb4ee6a4SAndroid Build Coastguard Worker }
20*bb4ee6a4SAndroid Build Coastguard Worker 
21*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a flattened device tree containing all of the parameters used
22*bb4ee6a4SAndroid Build Coastguard Worker /// by Android.
23*bb4ee6a4SAndroid Build Coastguard Worker ///
24*bb4ee6a4SAndroid Build Coastguard Worker /// # Arguments
25*bb4ee6a4SAndroid Build Coastguard Worker ///
26*bb4ee6a4SAndroid Build Coastguard Worker /// * `fdt` - The DTB to modify. The root node will be modified.
27*bb4ee6a4SAndroid Build Coastguard Worker /// * `android-fstab` - A text file of Android fstab entries to add to the DTB
create_android_fdt(fdt: &mut Fdt, fstab: File) -> Result<()>28*bb4ee6a4SAndroid Build Coastguard Worker pub fn create_android_fdt(fdt: &mut Fdt, fstab: File) -> Result<()> {
29*bb4ee6a4SAndroid Build Coastguard Worker     let vecs = BufReader::new(fstab)
30*bb4ee6a4SAndroid Build Coastguard Worker         .lines()
31*bb4ee6a4SAndroid Build Coastguard Worker         .map(|l| parse_fstab_line(l?.as_str()))
32*bb4ee6a4SAndroid Build Coastguard Worker         .collect::<Result<Vec<Vec<String>>>>()?;
33*bb4ee6a4SAndroid Build Coastguard Worker     let firmware_node = fdt.root_mut().subnode_mut("firmware")?;
34*bb4ee6a4SAndroid Build Coastguard Worker     let android_node = firmware_node.subnode_mut("android")?;
35*bb4ee6a4SAndroid Build Coastguard Worker     android_node.set_prop("compatible", "android,firmware")?;
36*bb4ee6a4SAndroid Build Coastguard Worker 
37*bb4ee6a4SAndroid Build Coastguard Worker     let (dtprop, fstab): (_, Vec<_>) = vecs.into_iter().partition(|x| x[0] == "#dt-vendor");
38*bb4ee6a4SAndroid Build Coastguard Worker     let vendor_node = android_node.subnode_mut("vendor")?;
39*bb4ee6a4SAndroid Build Coastguard Worker     for vec in dtprop {
40*bb4ee6a4SAndroid Build Coastguard Worker         let content = std::fs::read_to_string(&vec[2])?;
41*bb4ee6a4SAndroid Build Coastguard Worker         vendor_node.set_prop(&vec[1], content)?;
42*bb4ee6a4SAndroid Build Coastguard Worker     }
43*bb4ee6a4SAndroid Build Coastguard Worker     let fstab_node = android_node.subnode_mut("fstab")?;
44*bb4ee6a4SAndroid Build Coastguard Worker     fstab_node.set_prop("compatible", "android,fstab")?;
45*bb4ee6a4SAndroid Build Coastguard Worker     for vec in fstab {
46*bb4ee6a4SAndroid Build Coastguard Worker         let partition = &vec[1][1..];
47*bb4ee6a4SAndroid Build Coastguard Worker         let partition_node = fstab_node.subnode_mut(partition)?;
48*bb4ee6a4SAndroid Build Coastguard Worker         partition_node.set_prop("compatible", "android,".to_owned() + partition)?;
49*bb4ee6a4SAndroid Build Coastguard Worker         partition_node.set_prop("dev", vec[0].as_str())?;
50*bb4ee6a4SAndroid Build Coastguard Worker         partition_node.set_prop("type", vec[2].as_str())?;
51*bb4ee6a4SAndroid Build Coastguard Worker         partition_node.set_prop("mnt_flags", vec[3].as_str())?;
52*bb4ee6a4SAndroid Build Coastguard Worker         partition_node.set_prop("fsmgr_flags", vec[4].as_str())?;
53*bb4ee6a4SAndroid Build Coastguard Worker     }
54*bb4ee6a4SAndroid Build Coastguard Worker     Ok(())
55*bb4ee6a4SAndroid Build Coastguard Worker }
56