aboutsummaryrefslogtreecommitdiff
path: root/src/stub/core_impl/x_upcase_packet.rs
blob: 9d865e5eae3d91429197b408f9b296477009305b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use super::prelude::*;
use crate::protocol::commands::ext::XUpcasePacket;

use crate::arch::Arch;
use crate::target::ext::base::BaseOps;

impl<T: Target, C: Connection> GdbStubImpl<T, C> {
    pub(crate) fn handle_x_upcase_packet(
        &mut self,
        _res: &mut ResponseWriter<'_, C>,
        target: &mut T,
        command: XUpcasePacket<'_>,
    ) -> Result<HandlerStatus, Error<T::Error, C::Error>> {
        if !target.use_x_upcase_packet() {
            return Ok(HandlerStatus::Handled);
        }

        crate::__dead_code_marker!("x_upcase_packet", "impl");

        let handler_status = match command {
            XUpcasePacket::X(cmd) => {
                let addr = <T::Arch as Arch>::Usize::from_be_bytes(cmd.addr)
                    .ok_or(Error::TargetMismatch)?;

                match target.base_ops() {
                    BaseOps::SingleThread(ops) => ops.write_addrs(addr, cmd.val),
                    BaseOps::MultiThread(ops) => {
                        ops.write_addrs(addr, cmd.val, self.current_mem_tid)
                    }
                }
                .handle_error()?;

                HandlerStatus::NeedsOk
            }
        };
        Ok(handler_status)
    }
}