1 use super::prelude::*; 2 use crate::protocol::commands::ext::ExtendedMode; 3 4 impl<T: Target, C: Connection> GdbStubImpl<T, C> { handle_extended_mode( &mut self, res: &mut ResponseWriter<'_, C>, target: &mut T, command: ExtendedMode<'_>, ) -> Result<HandlerStatus, Error<T::Error, C::Error>>5 pub(crate) fn handle_extended_mode( 6 &mut self, 7 res: &mut ResponseWriter<'_, C>, 8 target: &mut T, 9 command: ExtendedMode<'_>, 10 ) -> Result<HandlerStatus, Error<T::Error, C::Error>> { 11 let ops = match target.support_extended_mode() { 12 Some(ops) => ops, 13 None => return Ok(HandlerStatus::Handled), 14 }; 15 16 crate::__dead_code_marker!("extended_mode", "impl"); 17 18 let handler_status = match command { 19 ExtendedMode::ExclamationMark(_cmd) => { 20 ops.on_start().map_err(Error::TargetError)?; 21 HandlerStatus::NeedsOk 22 } 23 ExtendedMode::R(_cmd) => { 24 ops.restart().map_err(Error::TargetError)?; 25 HandlerStatus::Handled 26 } 27 ExtendedMode::vAttach(cmd) => { 28 ops.attach(cmd.pid).handle_error()?; 29 30 // TODO: sends OK when running in Non-Stop mode 31 HandlerStatus::Handled 32 } 33 ExtendedMode::vRun(cmd) => { 34 use crate::target::ext::extended_mode::Args; 35 36 let _pid = ops 37 .run(cmd.filename, Args::new(&mut cmd.args.into_iter())) 38 .handle_error()?; 39 40 // This is a reasonable response, as the `run` handler must 41 // spawn the process in a stopped state. 42 res.write_str("S05")?; 43 HandlerStatus::Handled 44 } 45 // --------- ASLR --------- // 46 ExtendedMode::QDisableRandomization(cmd) if ops.support_configure_aslr().is_some() => { 47 let ops = ops.support_configure_aslr().unwrap(); 48 ops.cfg_aslr(cmd.value).handle_error()?; 49 HandlerStatus::NeedsOk 50 } 51 // --------- Environment --------- // 52 ExtendedMode::QEnvironmentHexEncoded(cmd) if ops.support_configure_env().is_some() => { 53 let ops = ops.support_configure_env().unwrap(); 54 ops.set_env(cmd.key, cmd.value).handle_error()?; 55 HandlerStatus::NeedsOk 56 } 57 ExtendedMode::QEnvironmentUnset(cmd) if ops.support_configure_env().is_some() => { 58 let ops = ops.support_configure_env().unwrap(); 59 ops.remove_env(cmd.key).handle_error()?; 60 HandlerStatus::NeedsOk 61 } 62 ExtendedMode::QEnvironmentReset(_cmd) if ops.support_configure_env().is_some() => { 63 let ops = ops.support_configure_env().unwrap(); 64 ops.reset_env().handle_error()?; 65 HandlerStatus::NeedsOk 66 } 67 // --------- Working Dir --------- // 68 ExtendedMode::QSetWorkingDir(cmd) if ops.support_configure_working_dir().is_some() => { 69 let ops = ops.support_configure_working_dir().unwrap(); 70 ops.cfg_working_dir(cmd.dir).handle_error()?; 71 HandlerStatus::NeedsOk 72 } 73 // --------- Startup Shell --------- // 74 ExtendedMode::QStartupWithShell(cmd) 75 if ops.support_configure_startup_shell().is_some() => 76 { 77 let ops = ops.support_configure_startup_shell().unwrap(); 78 ops.cfg_startup_with_shell(cmd.value).handle_error()?; 79 HandlerStatus::NeedsOk 80 } 81 _ => HandlerStatus::Handled, 82 }; 83 84 Ok(handler_status) 85 } 86 } 87