1*55039e04SAndroid Build Coastguard Worker /*
2*55039e04SAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project
3*55039e04SAndroid Build Coastguard Worker *
4*55039e04SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*55039e04SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*55039e04SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*55039e04SAndroid Build Coastguard Worker *
8*55039e04SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*55039e04SAndroid Build Coastguard Worker *
10*55039e04SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*55039e04SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*55039e04SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*55039e04SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*55039e04SAndroid Build Coastguard Worker * limitations under the License.
15*55039e04SAndroid Build Coastguard Worker */
16*55039e04SAndroid Build Coastguard Worker
17*55039e04SAndroid Build Coastguard Worker //! BPF loader for system and vendor applications
18*55039e04SAndroid Build Coastguard Worker
19*55039e04SAndroid Build Coastguard Worker // Enable dead_code until feature flag is removed.
20*55039e04SAndroid Build Coastguard Worker #![cfg_attr(not(enable_libbpf), allow(dead_code))]
21*55039e04SAndroid Build Coastguard Worker
22*55039e04SAndroid Build Coastguard Worker use android_ids::{AID_ROOT, AID_SYSTEM};
23*55039e04SAndroid Build Coastguard Worker use android_logger::AndroidLogger;
24*55039e04SAndroid Build Coastguard Worker use anyhow::{anyhow, ensure};
25*55039e04SAndroid Build Coastguard Worker use libbpf_rs::{MapCore, ObjectBuilder};
26*55039e04SAndroid Build Coastguard Worker use libc::{mode_t, S_IRGRP, S_IRUSR, S_IWGRP, S_IWUSR};
27*55039e04SAndroid Build Coastguard Worker use log::{debug, error, info, Level, LevelFilter, Log, Metadata, Record, SetLoggerError};
28*55039e04SAndroid Build Coastguard Worker use std::{
29*55039e04SAndroid Build Coastguard Worker cmp::max,
30*55039e04SAndroid Build Coastguard Worker env, fs,
31*55039e04SAndroid Build Coastguard Worker fs::{File, Permissions},
32*55039e04SAndroid Build Coastguard Worker io::{LineWriter, Write},
33*55039e04SAndroid Build Coastguard Worker os::fd::FromRawFd,
34*55039e04SAndroid Build Coastguard Worker os::unix::fs::{chown, PermissionsExt},
35*55039e04SAndroid Build Coastguard Worker panic,
36*55039e04SAndroid Build Coastguard Worker path::Path,
37*55039e04SAndroid Build Coastguard Worker sync::{Arc, Mutex},
38*55039e04SAndroid Build Coastguard Worker };
39*55039e04SAndroid Build Coastguard Worker
40*55039e04SAndroid Build Coastguard Worker enum KernelLevel {
41*55039e04SAndroid Build Coastguard Worker // Commented out unused due to rust complaining...
42*55039e04SAndroid Build Coastguard Worker // EMERG = 0,
43*55039e04SAndroid Build Coastguard Worker // ALERT = 1,
44*55039e04SAndroid Build Coastguard Worker // CRIT = 2,
45*55039e04SAndroid Build Coastguard Worker ERR = 3,
46*55039e04SAndroid Build Coastguard Worker WARNING = 4,
47*55039e04SAndroid Build Coastguard Worker // NOTICE = 5,
48*55039e04SAndroid Build Coastguard Worker INFO = 6,
49*55039e04SAndroid Build Coastguard Worker DEBUG = 7,
50*55039e04SAndroid Build Coastguard Worker }
51*55039e04SAndroid Build Coastguard Worker
level_to_kern_level(level: &Level) -> u852*55039e04SAndroid Build Coastguard Worker fn level_to_kern_level(level: &Level) -> u8 {
53*55039e04SAndroid Build Coastguard Worker let result = match level {
54*55039e04SAndroid Build Coastguard Worker Level::Error => KernelLevel::ERR,
55*55039e04SAndroid Build Coastguard Worker Level::Warn => KernelLevel::WARNING,
56*55039e04SAndroid Build Coastguard Worker Level::Info => KernelLevel::INFO,
57*55039e04SAndroid Build Coastguard Worker Level::Debug => KernelLevel::DEBUG,
58*55039e04SAndroid Build Coastguard Worker Level::Trace => KernelLevel::DEBUG,
59*55039e04SAndroid Build Coastguard Worker };
60*55039e04SAndroid Build Coastguard Worker result as u8
61*55039e04SAndroid Build Coastguard Worker }
62*55039e04SAndroid Build Coastguard Worker
63*55039e04SAndroid Build Coastguard Worker /// A logger implementation to enable bpfloader to write to kmsg on error as
64*55039e04SAndroid Build Coastguard Worker /// bpfloader runs at early init prior to the availability of standard Android
65*55039e04SAndroid Build Coastguard Worker /// logging. If a crash were to occur, we can disrupt boot, and therefore we
66*55039e04SAndroid Build Coastguard Worker /// need the ability to access the logs on the serial port.
67*55039e04SAndroid Build Coastguard Worker pub struct BpfKmsgLogger {
68*55039e04SAndroid Build Coastguard Worker log_level: LevelFilter,
69*55039e04SAndroid Build Coastguard Worker tag: String,
70*55039e04SAndroid Build Coastguard Worker kmsg_writer: Arc<Mutex<Box<dyn Write + Send>>>,
71*55039e04SAndroid Build Coastguard Worker a_logger: AndroidLogger,
72*55039e04SAndroid Build Coastguard Worker }
73*55039e04SAndroid Build Coastguard Worker
74*55039e04SAndroid Build Coastguard Worker impl Log for BpfKmsgLogger {
enabled(&self, metadata: &Metadata) -> bool75*55039e04SAndroid Build Coastguard Worker fn enabled(&self, metadata: &Metadata) -> bool {
76*55039e04SAndroid Build Coastguard Worker metadata.level() <= self.log_level || self.a_logger.enabled(metadata)
77*55039e04SAndroid Build Coastguard Worker }
78*55039e04SAndroid Build Coastguard Worker
log(&self, record: &Record)79*55039e04SAndroid Build Coastguard Worker fn log(&self, record: &Record) {
80*55039e04SAndroid Build Coastguard Worker if !self.enabled(record.metadata()) {
81*55039e04SAndroid Build Coastguard Worker return;
82*55039e04SAndroid Build Coastguard Worker }
83*55039e04SAndroid Build Coastguard Worker
84*55039e04SAndroid Build Coastguard Worker if record.metadata().level() <= self.log_level {
85*55039e04SAndroid Build Coastguard Worker let mut writer = self.kmsg_writer.lock().unwrap();
86*55039e04SAndroid Build Coastguard Worker write!(
87*55039e04SAndroid Build Coastguard Worker writer,
88*55039e04SAndroid Build Coastguard Worker "<{}>{}: {}",
89*55039e04SAndroid Build Coastguard Worker level_to_kern_level(&record.level()),
90*55039e04SAndroid Build Coastguard Worker self.tag,
91*55039e04SAndroid Build Coastguard Worker record.args()
92*55039e04SAndroid Build Coastguard Worker )
93*55039e04SAndroid Build Coastguard Worker .unwrap();
94*55039e04SAndroid Build Coastguard Worker let _ = writer.flush();
95*55039e04SAndroid Build Coastguard Worker }
96*55039e04SAndroid Build Coastguard Worker self.a_logger.log(record);
97*55039e04SAndroid Build Coastguard Worker }
98*55039e04SAndroid Build Coastguard Worker
flush(&self)99*55039e04SAndroid Build Coastguard Worker fn flush(&self) {}
100*55039e04SAndroid Build Coastguard Worker }
101*55039e04SAndroid Build Coastguard Worker
102*55039e04SAndroid Build Coastguard Worker impl BpfKmsgLogger {
103*55039e04SAndroid Build Coastguard Worker /// Initialize the logger
init(kmsg_file: File) -> Result<(), SetLoggerError>104*55039e04SAndroid Build Coastguard Worker pub fn init(kmsg_file: File) -> Result<(), SetLoggerError> {
105*55039e04SAndroid Build Coastguard Worker let alog_level = LevelFilter::Info;
106*55039e04SAndroid Build Coastguard Worker let kmsg_level = LevelFilter::Error;
107*55039e04SAndroid Build Coastguard Worker
108*55039e04SAndroid Build Coastguard Worker let log_config = android_logger::Config::default()
109*55039e04SAndroid Build Coastguard Worker .with_tag("BpfLoader-rs")
110*55039e04SAndroid Build Coastguard Worker .with_max_level(alog_level)
111*55039e04SAndroid Build Coastguard Worker .with_log_buffer(android_logger::LogId::Main)
112*55039e04SAndroid Build Coastguard Worker .format(|buf, record| writeln!(buf, "{}", record.args()));
113*55039e04SAndroid Build Coastguard Worker
114*55039e04SAndroid Build Coastguard Worker let writer = Box::new(LineWriter::new(kmsg_file)) as Box<dyn Write + Send>;
115*55039e04SAndroid Build Coastguard Worker log::set_max_level(max(alog_level, kmsg_level));
116*55039e04SAndroid Build Coastguard Worker log::set_boxed_logger(Box::new(BpfKmsgLogger {
117*55039e04SAndroid Build Coastguard Worker log_level: kmsg_level,
118*55039e04SAndroid Build Coastguard Worker tag: "BpfLoader-rs".to_string(),
119*55039e04SAndroid Build Coastguard Worker kmsg_writer: Arc::new(Mutex::new(writer)),
120*55039e04SAndroid Build Coastguard Worker a_logger: AndroidLogger::new(log_config),
121*55039e04SAndroid Build Coastguard Worker }))
122*55039e04SAndroid Build Coastguard Worker }
123*55039e04SAndroid Build Coastguard Worker }
124*55039e04SAndroid Build Coastguard Worker
125*55039e04SAndroid Build Coastguard Worker struct MapDesc {
126*55039e04SAndroid Build Coastguard Worker name: &'static str,
127*55039e04SAndroid Build Coastguard Worker perms: mode_t,
128*55039e04SAndroid Build Coastguard Worker }
129*55039e04SAndroid Build Coastguard Worker
130*55039e04SAndroid Build Coastguard Worker struct ProgDesc {
131*55039e04SAndroid Build Coastguard Worker name: &'static str,
132*55039e04SAndroid Build Coastguard Worker }
133*55039e04SAndroid Build Coastguard Worker
134*55039e04SAndroid Build Coastguard Worker struct BpfFileDesc {
135*55039e04SAndroid Build Coastguard Worker filename: &'static str,
136*55039e04SAndroid Build Coastguard Worker // Warning: setting this to 'true' will cause the system to boot loop if there are any issues
137*55039e04SAndroid Build Coastguard Worker // loading the bpf program.
138*55039e04SAndroid Build Coastguard Worker critical: bool,
139*55039e04SAndroid Build Coastguard Worker owner: u32,
140*55039e04SAndroid Build Coastguard Worker group: u32,
141*55039e04SAndroid Build Coastguard Worker maps: &'static [MapDesc],
142*55039e04SAndroid Build Coastguard Worker progs: &'static [ProgDesc],
143*55039e04SAndroid Build Coastguard Worker }
144*55039e04SAndroid Build Coastguard Worker
145*55039e04SAndroid Build Coastguard Worker const PERM_GRW: mode_t = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
146*55039e04SAndroid Build Coastguard Worker const PERM_GRO: mode_t = S_IRUSR | S_IWUSR | S_IRGRP;
147*55039e04SAndroid Build Coastguard Worker const PERM_GWO: mode_t = S_IRUSR | S_IWUSR | S_IWGRP;
148*55039e04SAndroid Build Coastguard Worker const PERM_UGR: mode_t = S_IRUSR | S_IRGRP;
149*55039e04SAndroid Build Coastguard Worker
150*55039e04SAndroid Build Coastguard Worker const FILE_ARR: &[BpfFileDesc] = &[BpfFileDesc {
151*55039e04SAndroid Build Coastguard Worker filename: "timeInState.bpf",
152*55039e04SAndroid Build Coastguard Worker critical: false,
153*55039e04SAndroid Build Coastguard Worker owner: AID_ROOT,
154*55039e04SAndroid Build Coastguard Worker group: AID_SYSTEM,
155*55039e04SAndroid Build Coastguard Worker maps: &[
156*55039e04SAndroid Build Coastguard Worker MapDesc { name: "cpu_last_pid_map", perms: PERM_GWO },
157*55039e04SAndroid Build Coastguard Worker MapDesc { name: "cpu_last_update_map", perms: PERM_GWO },
158*55039e04SAndroid Build Coastguard Worker MapDesc { name: "cpu_policy_map", perms: PERM_GWO },
159*55039e04SAndroid Build Coastguard Worker MapDesc { name: "freq_to_idx_map", perms: PERM_GWO },
160*55039e04SAndroid Build Coastguard Worker MapDesc { name: "nr_active_map", perms: PERM_GWO },
161*55039e04SAndroid Build Coastguard Worker MapDesc { name: "pid_task_aggregation_map", perms: PERM_GWO },
162*55039e04SAndroid Build Coastguard Worker MapDesc { name: "pid_time_in_state_map", perms: PERM_GRO },
163*55039e04SAndroid Build Coastguard Worker MapDesc { name: "pid_tracked_hash_map", perms: PERM_GWO },
164*55039e04SAndroid Build Coastguard Worker MapDesc { name: "pid_tracked_map", perms: PERM_GWO },
165*55039e04SAndroid Build Coastguard Worker MapDesc { name: "policy_freq_idx_map", perms: PERM_GWO },
166*55039e04SAndroid Build Coastguard Worker MapDesc { name: "policy_nr_active_map", perms: PERM_GWO },
167*55039e04SAndroid Build Coastguard Worker MapDesc { name: "total_time_in_state_map", perms: PERM_GRW },
168*55039e04SAndroid Build Coastguard Worker MapDesc { name: "uid_concurrent_times_map", perms: PERM_GRW },
169*55039e04SAndroid Build Coastguard Worker MapDesc { name: "uid_last_update_map", perms: PERM_GRW },
170*55039e04SAndroid Build Coastguard Worker MapDesc { name: "uid_time_in_state_map", perms: PERM_GRW },
171*55039e04SAndroid Build Coastguard Worker ],
172*55039e04SAndroid Build Coastguard Worker progs: &[
173*55039e04SAndroid Build Coastguard Worker ProgDesc { name: "tracepoint_power_cpu_frequency" },
174*55039e04SAndroid Build Coastguard Worker ProgDesc { name: "tracepoint_sched_sched_process_free" },
175*55039e04SAndroid Build Coastguard Worker ProgDesc { name: "tracepoint_sched_sched_switch" },
176*55039e04SAndroid Build Coastguard Worker ],
177*55039e04SAndroid Build Coastguard Worker }];
178*55039e04SAndroid Build Coastguard Worker
libbpf_worker(file_desc: &BpfFileDesc) -> Result<(), anyhow::Error>179*55039e04SAndroid Build Coastguard Worker fn libbpf_worker(file_desc: &BpfFileDesc) -> Result<(), anyhow::Error> {
180*55039e04SAndroid Build Coastguard Worker info!("Loading {}", file_desc.filename);
181*55039e04SAndroid Build Coastguard Worker let filepath = Path::new("/etc/bpf/").join(file_desc.filename);
182*55039e04SAndroid Build Coastguard Worker ensure!(filepath.exists(), "File not found {}", filepath.display());
183*55039e04SAndroid Build Coastguard Worker let filename =
184*55039e04SAndroid Build Coastguard Worker filepath.file_stem().ok_or_else(|| anyhow!("Failed to parse stem from filename"))?;
185*55039e04SAndroid Build Coastguard Worker let filename = filename.to_str().ok_or_else(|| anyhow!("Failed to parse filename"))?;
186*55039e04SAndroid Build Coastguard Worker
187*55039e04SAndroid Build Coastguard Worker let mut ob = ObjectBuilder::default();
188*55039e04SAndroid Build Coastguard Worker let open_file = ob.open_file(&filepath)?;
189*55039e04SAndroid Build Coastguard Worker let mut loaded_file = open_file.load()?;
190*55039e04SAndroid Build Coastguard Worker
191*55039e04SAndroid Build Coastguard Worker let bpffs_path = "/sys/fs/bpf/".to_owned();
192*55039e04SAndroid Build Coastguard Worker
193*55039e04SAndroid Build Coastguard Worker for mut map in loaded_file.maps_mut() {
194*55039e04SAndroid Build Coastguard Worker let mut desc_found = false;
195*55039e04SAndroid Build Coastguard Worker let name =
196*55039e04SAndroid Build Coastguard Worker map.name().to_str().ok_or_else(|| anyhow!("Failed to parse map name into UTF-8"))?;
197*55039e04SAndroid Build Coastguard Worker let name = String::from(name);
198*55039e04SAndroid Build Coastguard Worker for map_desc in file_desc.maps {
199*55039e04SAndroid Build Coastguard Worker if map_desc.name == name {
200*55039e04SAndroid Build Coastguard Worker desc_found = true;
201*55039e04SAndroid Build Coastguard Worker let pinpath_str = bpffs_path.clone() + "map_" + filename + "_" + &name;
202*55039e04SAndroid Build Coastguard Worker let pinpath = Path::new(&pinpath_str);
203*55039e04SAndroid Build Coastguard Worker debug!("Pinning: {}", pinpath.display());
204*55039e04SAndroid Build Coastguard Worker map.pin(pinpath).map_err(|e| anyhow!("Failed to pin map {name}: {e}"))?;
205*55039e04SAndroid Build Coastguard Worker fs::set_permissions(pinpath, Permissions::from_mode(map_desc.perms as _)).map_err(
206*55039e04SAndroid Build Coastguard Worker |e| {
207*55039e04SAndroid Build Coastguard Worker anyhow!(
208*55039e04SAndroid Build Coastguard Worker "Failed to set permissions: {} on pinned map {}: {e}",
209*55039e04SAndroid Build Coastguard Worker map_desc.perms,
210*55039e04SAndroid Build Coastguard Worker pinpath.display()
211*55039e04SAndroid Build Coastguard Worker )
212*55039e04SAndroid Build Coastguard Worker },
213*55039e04SAndroid Build Coastguard Worker )?;
214*55039e04SAndroid Build Coastguard Worker chown(pinpath, Some(file_desc.owner), Some(file_desc.group)).map_err(|e| {
215*55039e04SAndroid Build Coastguard Worker anyhow!(
216*55039e04SAndroid Build Coastguard Worker "Failed to chown {} with owner: {} group: {} err: {e}",
217*55039e04SAndroid Build Coastguard Worker pinpath.display(),
218*55039e04SAndroid Build Coastguard Worker file_desc.owner,
219*55039e04SAndroid Build Coastguard Worker file_desc.group
220*55039e04SAndroid Build Coastguard Worker )
221*55039e04SAndroid Build Coastguard Worker })?;
222*55039e04SAndroid Build Coastguard Worker break;
223*55039e04SAndroid Build Coastguard Worker }
224*55039e04SAndroid Build Coastguard Worker }
225*55039e04SAndroid Build Coastguard Worker ensure!(desc_found, "Descriptor for {name} not found!");
226*55039e04SAndroid Build Coastguard Worker }
227*55039e04SAndroid Build Coastguard Worker
228*55039e04SAndroid Build Coastguard Worker for mut prog in loaded_file.progs_mut() {
229*55039e04SAndroid Build Coastguard Worker let mut desc_found = false;
230*55039e04SAndroid Build Coastguard Worker let name =
231*55039e04SAndroid Build Coastguard Worker prog.name().to_str().ok_or_else(|| anyhow!("Failed to parse prog name into UTF-8"))?;
232*55039e04SAndroid Build Coastguard Worker let name = String::from(name);
233*55039e04SAndroid Build Coastguard Worker for prog_desc in file_desc.progs {
234*55039e04SAndroid Build Coastguard Worker if prog_desc.name == name {
235*55039e04SAndroid Build Coastguard Worker desc_found = true;
236*55039e04SAndroid Build Coastguard Worker let pinpath_str = bpffs_path.clone() + "prog_" + filename + "_" + &name;
237*55039e04SAndroid Build Coastguard Worker let pinpath = Path::new(&pinpath_str);
238*55039e04SAndroid Build Coastguard Worker debug!("Pinning: {}", pinpath.display());
239*55039e04SAndroid Build Coastguard Worker prog.pin(pinpath).map_err(|e| anyhow!("Failed to pin prog {name}: {e}"))?;
240*55039e04SAndroid Build Coastguard Worker fs::set_permissions(pinpath, Permissions::from_mode(PERM_UGR as _)).map_err(
241*55039e04SAndroid Build Coastguard Worker |e| {
242*55039e04SAndroid Build Coastguard Worker anyhow!(
243*55039e04SAndroid Build Coastguard Worker "Failed to set permissions on pinned prog {}: {e}",
244*55039e04SAndroid Build Coastguard Worker pinpath.display()
245*55039e04SAndroid Build Coastguard Worker )
246*55039e04SAndroid Build Coastguard Worker },
247*55039e04SAndroid Build Coastguard Worker )?;
248*55039e04SAndroid Build Coastguard Worker chown(pinpath, Some(file_desc.owner), Some(file_desc.group)).map_err(|e| {
249*55039e04SAndroid Build Coastguard Worker anyhow!(
250*55039e04SAndroid Build Coastguard Worker "Failed to chown {} with owner: {} group: {} err: {e}",
251*55039e04SAndroid Build Coastguard Worker pinpath.display(),
252*55039e04SAndroid Build Coastguard Worker file_desc.owner,
253*55039e04SAndroid Build Coastguard Worker file_desc.group
254*55039e04SAndroid Build Coastguard Worker )
255*55039e04SAndroid Build Coastguard Worker })?;
256*55039e04SAndroid Build Coastguard Worker break;
257*55039e04SAndroid Build Coastguard Worker }
258*55039e04SAndroid Build Coastguard Worker }
259*55039e04SAndroid Build Coastguard Worker ensure!(desc_found, "Descriptor for {name} not found!");
260*55039e04SAndroid Build Coastguard Worker }
261*55039e04SAndroid Build Coastguard Worker Ok(())
262*55039e04SAndroid Build Coastguard Worker }
263*55039e04SAndroid Build Coastguard Worker
264*55039e04SAndroid Build Coastguard Worker #[cfg(enable_libbpf)]
load_libbpf_progs()265*55039e04SAndroid Build Coastguard Worker fn load_libbpf_progs() {
266*55039e04SAndroid Build Coastguard Worker info!("Loading libbpf programs");
267*55039e04SAndroid Build Coastguard Worker for file_desc in FILE_ARR {
268*55039e04SAndroid Build Coastguard Worker if let Err(e) = libbpf_worker(file_desc) {
269*55039e04SAndroid Build Coastguard Worker if file_desc.critical {
270*55039e04SAndroid Build Coastguard Worker panic!("Error when loading {0}: {e}", file_desc.filename);
271*55039e04SAndroid Build Coastguard Worker } else {
272*55039e04SAndroid Build Coastguard Worker error!("Error when loading {0}: {e}", file_desc.filename);
273*55039e04SAndroid Build Coastguard Worker }
274*55039e04SAndroid Build Coastguard Worker };
275*55039e04SAndroid Build Coastguard Worker }
276*55039e04SAndroid Build Coastguard Worker }
277*55039e04SAndroid Build Coastguard Worker
278*55039e04SAndroid Build Coastguard Worker #[cfg(not(enable_libbpf))]
load_libbpf_progs()279*55039e04SAndroid Build Coastguard Worker fn load_libbpf_progs() {
280*55039e04SAndroid Build Coastguard Worker // Empty stub for feature flag disabled case
281*55039e04SAndroid Build Coastguard Worker info!("Loading libbpf programs DISABLED");
282*55039e04SAndroid Build Coastguard Worker }
283*55039e04SAndroid Build Coastguard Worker
main()284*55039e04SAndroid Build Coastguard Worker fn main() {
285*55039e04SAndroid Build Coastguard Worker let kmsg_fd = env::var("ANDROID_FILE__dev_kmsg").unwrap().parse::<i32>().unwrap();
286*55039e04SAndroid Build Coastguard Worker // SAFETY: The init script opens this file for us
287*55039e04SAndroid Build Coastguard Worker let kmsg_file = unsafe { File::from_raw_fd(kmsg_fd) };
288*55039e04SAndroid Build Coastguard Worker
289*55039e04SAndroid Build Coastguard Worker if let Err(logger) = BpfKmsgLogger::init(kmsg_file) {
290*55039e04SAndroid Build Coastguard Worker error!("BpfLoader-rs: log::setlogger failed: {}", logger);
291*55039e04SAndroid Build Coastguard Worker }
292*55039e04SAndroid Build Coastguard Worker
293*55039e04SAndroid Build Coastguard Worker // Redirect panic messages to both logcat and serial port
294*55039e04SAndroid Build Coastguard Worker panic::set_hook(Box::new(|panic_info| {
295*55039e04SAndroid Build Coastguard Worker error!("{}", panic_info);
296*55039e04SAndroid Build Coastguard Worker }));
297*55039e04SAndroid Build Coastguard Worker
298*55039e04SAndroid Build Coastguard Worker load_libbpf_progs();
299*55039e04SAndroid Build Coastguard Worker info!("Loading legacy BPF progs");
300*55039e04SAndroid Build Coastguard Worker
301*55039e04SAndroid Build Coastguard Worker // SAFETY: Linking in the existing legacy bpfloader functionality.
302*55039e04SAndroid Build Coastguard Worker // Any of the four following bindgen functions can abort() or exit()
303*55039e04SAndroid Build Coastguard Worker // on failure and execNetBpfLoadDone() execve()'s.
304*55039e04SAndroid Build Coastguard Worker unsafe {
305*55039e04SAndroid Build Coastguard Worker bpf_android_bindgen::initLogging();
306*55039e04SAndroid Build Coastguard Worker bpf_android_bindgen::createBpfFsSubDirectories();
307*55039e04SAndroid Build Coastguard Worker bpf_android_bindgen::legacyBpfLoader();
308*55039e04SAndroid Build Coastguard Worker bpf_android_bindgen::execNetBpfLoadDone();
309*55039e04SAndroid Build Coastguard Worker }
310*55039e04SAndroid Build Coastguard Worker }
311