@@ -5,7 +5,7 @@ use num_traits::ops::saturating::Saturating;
5
5
use crate :: util:: slicevec:: SliceVec ;
6
6
use crate :: {
7
7
protocol:: { Command , Packet , ResponseWriter } ,
8
- Connection , Error , HwBreakOp , Target , TargetState , WatchKind ,
8
+ Arch , Connection , Error , HwBreakOp , Registers , Target , TargetState , WatchKind ,
9
9
} ;
10
10
11
11
enum ExecState {
@@ -24,7 +24,7 @@ pub struct GdbStub<'a, T: Target, C: Connection> {
24
24
conn : C ,
25
25
exec_state : ExecState ,
26
26
// TODO?: use BTreeSet if std is enabled for infinite swbreaks?
27
- swbreak : ArrayVec < [ T :: Usize ; MAX_SWBREAK ] > ,
27
+ swbreak : ArrayVec < [ < T :: Arch as Arch > :: Usize ; MAX_SWBREAK ] > ,
28
28
packet_buffer : Option < & ' a mut [ u8 ] > ,
29
29
}
30
30
@@ -67,14 +67,14 @@ impl<'a, T: Target, C: Connection> GdbStub<'a, T, C> {
67
67
// res.write_str("ConditionalBreakpoints+;")?;
68
68
69
69
// probe support for target description xml
70
- if T :: target_description_xml ( ) . is_some ( ) {
70
+ if T :: Arch :: target_description_xml ( ) . is_some ( ) {
71
71
res. write_str ( "qXfer:features:read+;" ) ?;
72
72
}
73
73
}
74
74
Command :: vContQuestionMark( _) => res. write_str ( "vCont;c;s;t" ) ?,
75
75
Command :: qXferFeaturesRead( cmd) => {
76
76
assert_eq ! ( cmd. annex, "target.xml" ) ;
77
- match T :: target_description_xml ( ) {
77
+ match T :: Arch :: target_description_xml ( ) {
78
78
Some ( xml) => {
79
79
let xml = xml. trim ( ) ;
80
80
if cmd. offset >= xml. len ( ) {
@@ -102,28 +102,33 @@ impl<'a, T: Target, C: Connection> GdbStub<'a, T, C> {
102
102
Command :: QuestionMark ( _) => res. write_str ( "S05" ) ?,
103
103
Command :: qAttached( _) => res. write_str ( "1" ) ?,
104
104
Command :: g( _) => {
105
- let mut err = Ok ( ( ) ) ;
105
+ let mut regs : < T :: Arch as Arch > :: Registers = Default :: default ( ) ;
106
106
target
107
- . read_registers ( |reg| {
108
- if let Err ( e) = res. write_hex_buf ( reg) {
109
- err = Err ( e)
110
- }
111
- } )
107
+ . read_registers ( & mut regs)
112
108
. map_err ( Error :: TargetError ) ?;
109
+ let mut err = Ok ( ( ) ) ;
110
+ regs. gdb_serialize ( |val| {
111
+ let res = match val {
112
+ Some ( b) => res. write_hex ( b) ,
113
+ None => res. write_str ( "xx" ) ,
114
+ } ;
115
+ if let Err ( e) = res {
116
+ err = Err ( e) ;
117
+ }
118
+ } ) ;
113
119
err?;
114
120
}
115
- Command :: G ( mut cmd) => {
116
- // TODO: use the length of the slice returned by `target.read_registers` to
117
- // validate that the server sent the correct amount of data
118
- target
119
- . write_registers ( || cmd. vals . next ( ) )
120
- . map_err ( Error :: TargetError ) ?;
121
+ Command :: G ( cmd) => {
122
+ let mut regs: <T :: Arch as Arch >:: Registers = Default :: default ( ) ;
123
+ regs. gdb_deserialize ( cmd. vals )
124
+ . map_err ( |_| Error :: PacketParse ) ?; // FIXME: more granular error?
125
+ target. write_registers ( & regs) . map_err ( Error :: TargetError ) ?;
121
126
res. write_str ( "OK" ) ?;
122
127
}
123
128
Command :: m( cmd) => {
124
129
let mut err = Ok ( ( ) ) ;
125
130
// XXX: get rid of these unwraps ahhh
126
- let start: T :: Usize = num_traits:: NumCast :: from ( cmd. addr ) . unwrap ( ) ;
131
+ let start: < T :: Arch as Arch > :: Usize = num_traits:: NumCast :: from ( cmd. addr ) . unwrap ( ) ;
127
132
// XXX: on overflow, this _should_ wrap around to low addresses (maybe?)
128
133
let end = start. saturating_add ( num_traits:: NumCast :: from ( cmd. len ) . unwrap ( ) ) ;
129
134
@@ -156,7 +161,7 @@ impl<'a, T: Target, C: Connection> GdbStub<'a, T, C> {
156
161
}
157
162
Command :: Z ( cmd) => {
158
163
// XXX: get rid of this unwrap ahhh
159
- let addr: T :: Usize = num_traits:: NumCast :: from ( cmd. addr ) . unwrap ( ) ;
164
+ let addr: < T :: Arch as Arch > :: Usize = num_traits:: NumCast :: from ( cmd. addr ) . unwrap ( ) ;
160
165
161
166
use HwBreakOp :: * ;
162
167
let supported = match cmd. type_ {
@@ -177,7 +182,7 @@ impl<'a, T: Target, C: Connection> GdbStub<'a, T, C> {
177
182
}
178
183
Command :: z( cmd) => {
179
184
// XXX: get rid of this unwrap ahhh
180
- let addr: T :: Usize = num_traits:: NumCast :: from ( cmd. addr ) . unwrap ( ) ;
185
+ let addr: < T :: Arch as Arch > :: Usize = num_traits:: NumCast :: from ( cmd. addr ) . unwrap ( ) ;
181
186
182
187
use HwBreakOp :: * ;
183
188
let supported = match cmd. type_ {
@@ -293,7 +298,7 @@ impl<'a, T: Target, C: Connection> GdbStub<'a, T, C> {
293
298
///
294
299
/// Returns once the GDB client cleanly closes the debugging session (via
295
300
/// the GDB `quit` command).
296
- pub fn run ( & mut self , target : & mut T ) -> Result < TargetState < T :: Usize > , Error < T , C > > {
301
+ pub fn run ( & mut self , target : & mut T ) -> Result < TargetState < T :: Arch > , Error < T , C > > {
297
302
let packet_buffer = self . packet_buffer . take ( ) . unwrap ( ) ;
298
303
299
304
loop {
0 commit comments