1 use super::prelude::*; 2 use crate::target::ext::tracepoints::Tracepoint; 3 use crate::target::ext::tracepoints::TracepointSourceType; 4 5 pub struct QTDPsrc<'a> { 6 pub number: Tracepoint, 7 pub addr: &'a [u8], 8 pub kind: TracepointSourceType, 9 pub start: u32, 10 pub slen: u32, 11 pub bytes: &'a mut [u8], 12 } 13 14 impl<'a> ParseCommand<'a> for QTDPsrc<'a> { 15 #[inline(always)] from_packet(buf: PacketBuf<'a>) -> Option<Self>16 fn from_packet(buf: PacketBuf<'a>) -> Option<Self> { 17 let body = buf.into_body(); 18 match body { 19 [b':', info @ ..] => { 20 let mut params = info.splitn_mut(7, |b| *b == b':'); 21 let number = Tracepoint(decode_hex(params.next()?).ok()?); 22 let addr = decode_hex_buf(params.next()?).ok()?; 23 // Clippy incorrect thinks this as_ref isn't needed, but it is. 24 #[allow(clippy::useless_asref)] 25 let kind = match params.next()?.as_ref() { 26 b"at" => Some(TracepointSourceType::At), 27 b"cond" => Some(TracepointSourceType::Cond), 28 b"cmd" => Some(TracepointSourceType::Cmd), 29 _ => None, 30 }?; 31 let start = decode_hex(params.next()?).ok()?; 32 let slen = decode_hex(params.next()?).ok()?; 33 let bytes = decode_hex_buf(params.next()?).ok()?; 34 Some(QTDPsrc { 35 number, 36 addr, 37 kind, 38 start, 39 slen, 40 bytes, 41 }) 42 } 43 _ => None, 44 } 45 } 46 } 47