@@ -11,7 +11,7 @@ use std::{
1111 mem:: { self , size_of_val} ,
1212} ;
1313
14- use anyhow:: { Result , bail} ;
14+ use anyhow:: { Result , anyhow , bail} ;
1515
1616use bincode:: serialize;
1717use serde:: { self , Deserialize , Serialize } ;
@@ -217,10 +217,6 @@ pub struct RamdumpTable64 {
217217 filename : [ u8 ; 20 ] ,
218218}
219219
220- fn get_u32 ( buf : & [ u8 ] ) -> u32 {
221- u32:: from_le_bytes ( buf. try_into ( ) . unwrap ( ) )
222- }
223-
224220pub fn sahara_send_img_to_device < T : Read + Write > (
225221 channel : & mut T ,
226222 img_arr : & mut [ Vec < u8 > ] ,
@@ -492,7 +488,7 @@ pub fn sahara_run<T: QdlChan>(
492488
493489 loop {
494490 let bytes_read = channel. read ( & mut buf[ ..] ) ?;
495- let pkt = sahara_parse_packet ( & buf[ ..bytes_read] , verbose) ;
491+ let pkt = sahara_parse_packet ( & buf[ ..bytes_read] , verbose) ? ;
496492 let pktsize = size_of_val ( & pkt. cmd ) + size_of_val ( & pkt. len ) ;
497493
498494 match pkt. cmd {
@@ -599,54 +595,65 @@ pub fn sahara_run<T: QdlChan>(
599595 }
600596}
601597
602- fn sahara_parse_packet ( buf : & [ u8 ] , verbose : bool ) -> SaharaPacket {
603- let cmd = bincode:: deserialize :: < SaharaCmd > ( & buf[ 0 ..4 ] )
604- . unwrap_or_else ( |_| panic ! ( "Got unknown command {}" , get_u32( & buf[ 0 ..4 ] ) ) ) ;
598+ fn sahara_parse_packet ( buf : & [ u8 ] , verbose : bool ) -> Result < SaharaPacket > {
599+ let ( cmd, rest) = buf
600+ . split_first_chunk :: < 4 > ( )
601+ . ok_or_else ( || anyhow ! ( "Malformed packet, too short: {buf:?}" ) ) ?;
602+ let ( len, args) = rest
603+ . split_first_chunk :: < 4 > ( )
604+ . ok_or_else ( || anyhow ! ( "Malformed packet, too short: {buf:?}" ) ) ?;
605+
606+ let cmd = bincode:: deserialize :: < SaharaCmd > ( cmd)
607+ . unwrap_or_else ( |_| panic ! ( "Got unknown command {}" , u32 :: from_le_bytes( * cmd) ) ) ;
605608
606609 let ret = SaharaPacket {
607610 cmd,
608- len : get_u32 ( & buf [ 4 .. 8 ] ) ,
611+ len : u32 :: from_le_bytes ( * len ) ,
609612 body : match cmd {
610613 SaharaCmd :: SaharaHello => {
611- SaharaPacketBody :: HelloReq ( bincode:: deserialize :: < HelloReq > ( & buf [ 8 .. ] ) . unwrap ( ) )
614+ SaharaPacketBody :: HelloReq ( bincode:: deserialize :: < HelloReq > ( args ) . unwrap ( ) )
612615 }
613616 SaharaCmd :: SaharaHelloResp => {
614- SaharaPacketBody :: HelloResp ( bincode:: deserialize :: < HelloResp > ( & buf [ 8 .. ] ) . unwrap ( ) )
617+ SaharaPacketBody :: HelloResp ( bincode:: deserialize :: < HelloResp > ( args ) . unwrap ( ) )
615618 }
616619 SaharaCmd :: SaharaReadData => {
617- SaharaPacketBody :: ReadReq ( bincode:: deserialize :: < ReadReq > ( & buf [ 8 .. ] ) . unwrap ( ) )
620+ SaharaPacketBody :: ReadReq ( bincode:: deserialize :: < ReadReq > ( args ) . unwrap ( ) )
618621 }
619622 SaharaCmd :: SaharaEndOfImage => {
620- SaharaPacketBody :: Eoi ( bincode:: deserialize :: < Eoi > ( & buf [ 8 .. ] ) . unwrap ( ) )
623+ SaharaPacketBody :: Eoi ( bincode:: deserialize :: < Eoi > ( args ) . unwrap ( ) )
621624 }
622625 SaharaCmd :: SaharaDone => SaharaPacketBody :: DoneReq ( DoneReq { } ) ,
623626 SaharaCmd :: SaharaDoneResp => {
624- SaharaPacketBody :: DoneResp ( bincode:: deserialize :: < DoneResp > ( & buf [ 8 .. ] ) . unwrap ( ) )
627+ SaharaPacketBody :: DoneResp ( bincode:: deserialize :: < DoneResp > ( args ) . unwrap ( ) )
625628 }
626629 SaharaCmd :: SaharaResetResp => SaharaPacketBody :: ResetResp ( ResetResp { } ) ,
627630 SaharaCmd :: SaharaCommandReady => SaharaPacketBody :: CommandReady ( CommandReady { } ) ,
628631 SaharaCmd :: SaharaExecuteResp => {
629- SaharaPacketBody :: ExecResp ( bincode:: deserialize :: < ExecResp > ( & buf[ 8 ..] ) . unwrap ( ) )
632+ SaharaPacketBody :: ExecResp ( bincode:: deserialize :: < ExecResp > ( args) . unwrap ( ) )
633+ }
634+ SaharaCmd :: SaharaExecuteData => {
635+ SaharaPacketBody :: Command ( bincode:: deserialize :: < SaharaCmdModeCmd > ( args) . unwrap ( ) )
630636 }
631- SaharaCmd :: SaharaExecuteData => SaharaPacketBody :: Command (
632- bincode:: deserialize :: < SaharaCmdModeCmd > ( & buf[ 8 ..] ) . unwrap ( ) ,
633- ) ,
634637 SaharaCmd :: SaharaMemDebug64 => {
635- SaharaPacketBody :: Debug64Req ( bincode:: deserialize :: < Debug64Req > ( & buf[ 8 ..] ) . unwrap ( ) )
638+ SaharaPacketBody :: Debug64Req ( bincode:: deserialize :: < Debug64Req > ( args) . unwrap ( ) )
639+ }
640+ SaharaCmd :: SaharaMemRead64 => {
641+ SaharaPacketBody :: ReadMem64Req ( bincode:: deserialize :: < ReadMem64Req > ( args) . unwrap ( ) )
636642 }
637- SaharaCmd :: SaharaMemRead64 => SaharaPacketBody :: ReadMem64Req (
638- bincode:: deserialize :: < ReadMem64Req > ( & buf[ 8 ..] ) . unwrap ( ) ,
639- ) ,
640643 SaharaCmd :: SaharaReadData64 => SaharaPacketBody :: ReadData64Req (
641- bincode:: deserialize :: < ReadData64Req > ( & buf[ 8 ..] ) . unwrap ( ) ,
644+ bincode:: deserialize :: < ReadData64Req > ( args) . unwrap ( ) ,
645+ ) ,
646+ SaharaCmd :: SaharaXML => bail ! (
647+ "Got Firehose command while expecting Sahara command: {:?}" ,
648+ String :: from_utf8_lossy( buf)
642649 ) ,
643- _ => todo ! ( "Got unknown command: {:?}" , buf) ,
650+ _ => bail ! ( "Got unimplemented command: {:?}" , buf) ,
644651 } ,
645652 } ;
646653
647654 if verbose {
648655 println ! ( "{:?}" , ret) ;
649656 }
650657
651- ret
658+ Ok ( ret)
652659}
0 commit comments