@@ -29,8 +29,9 @@ use Constraint::{Fill, Length, Max, Min};
29
29
30
30
mod mi;
31
31
use mi:: {
32
- data_disassemble, data_read_memory_bytes, parse_asm_insns_values, parse_key_value_pairs,
33
- parse_register_values, register_x86_64, Asm , MIResponse , Register ,
32
+ data_disassemble, data_read_memory_bytes, join_registers, parse_asm_insns_values,
33
+ parse_key_value_pairs, parse_register_names_values, parse_register_values, Asm , MIResponse ,
34
+ Register , REGISTER_COUNT_MAX ,
34
35
} ;
35
36
36
37
enum InputMode {
@@ -100,6 +101,7 @@ struct App {
100
101
current_pc : Arc < Mutex < u64 > > , // TODO: replace with AtomicU64?
101
102
parsed_responses : Arc < Mutex < LimitedBuffer < MIResponse > > > ,
102
103
gdb_stdin : Arc < Mutex < dyn Write + Send > > ,
104
+ register_names : Arc < Mutex < Vec < String > > > ,
103
105
registers : Arc < Mutex < Vec < ( String , Register ) > > > ,
104
106
stack : Arc < Mutex < HashMap < u64 , u64 > > > ,
105
107
asm : Arc < Mutex < Vec < Asm > > > ,
@@ -151,6 +153,7 @@ impl App {
151
153
messages : LimitedBuffer :: new ( 10 ) ,
152
154
current_pc : Arc :: new ( Mutex :: new ( 0 ) ) ,
153
155
parsed_responses : Arc :: new ( Mutex :: new ( LimitedBuffer :: new ( 30 ) ) ) ,
156
+ register_names : Arc :: new ( Mutex :: new ( vec ! [ ] ) ) ,
154
157
gdb_stdin,
155
158
registers : Arc :: new ( Mutex :: new ( vec ! [ ] ) ) ,
156
159
stack : Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ,
@@ -190,6 +193,7 @@ fn main() -> Result<(), Box<dyn Error>> {
190
193
let gdb_stdin_arc = Arc :: clone ( & app. gdb_stdin ) ;
191
194
let current_pc_arc = Arc :: clone ( & app. current_pc ) ;
192
195
let parsed_reponses_arc = Arc :: clone ( & app. parsed_responses ) ;
196
+ let register_names_arc = Arc :: clone ( & app. register_names ) ;
193
197
let registers_arc = Arc :: clone ( & app. registers ) ;
194
198
let stack_arc = Arc :: clone ( & app. stack ) ;
195
199
let asm_arc = Arc :: clone ( & app. asm ) ;
@@ -198,6 +202,7 @@ fn main() -> Result<(), Box<dyn Error>> {
198
202
thread:: spawn ( move || {
199
203
gdb_interact (
200
204
gdb_stdout,
205
+ register_names_arc,
201
206
registers_arc,
202
207
current_pc_arc,
203
208
stack_arc,
@@ -228,6 +233,7 @@ fn main() -> Result<(), Box<dyn Error>> {
228
233
229
234
fn gdb_interact (
230
235
gdb_stdout : BufReader < Box < dyn Read + Send > > ,
236
+ register_names_arc : Arc < Mutex < Vec < String > > > ,
231
237
registers_arc : Arc < Mutex < Vec < ( String , Register ) > > > ,
232
238
current_pc_arc : Arc < Mutex < u64 > > ,
233
239
stack_arc : Arc < Mutex < HashMap < u64 , u64 > > > ,
@@ -249,15 +255,21 @@ fn gdb_interact(
249
255
debug ! ( "{arch}" ) ;
250
256
}
251
257
// When a breakpoint is hit, query for register values
258
+ next_write. push ( "-data-list-register-names" . to_string ( ) ) ;
252
259
next_write. push ( "-data-list-register-values x" . to_string ( ) ) ;
253
260
}
254
261
}
255
262
MIResponse :: ExecResult ( _, kv) => {
256
- if let Some ( register_values) = kv. get ( "register-values" ) {
263
+ if let Some ( register_names) = kv. get ( "register-names" ) {
264
+ let register_names = parse_register_names_values ( register_names) ;
265
+ let mut regs_names = register_names_arc. lock ( ) . unwrap ( ) ;
266
+ * regs_names = register_names;
267
+ } else if let Some ( register_values) = kv. get ( "register-values" ) {
257
268
let registers = parse_register_values ( register_values) ;
258
269
// Check if response is register data
259
270
let mut regs = registers_arc. lock ( ) . unwrap ( ) ;
260
- let registers = register_x86_64 ( & registers) ;
271
+ let mut regs_names = register_names_arc. lock ( ) . unwrap ( ) ;
272
+ let registers = join_registers ( & regs_names, & registers) ;
261
273
for s in registers. iter ( ) {
262
274
if s. 0 == "rsp" {
263
275
let start_addr = s. 1 . value . as_ref ( ) . unwrap ( ) ;
@@ -441,7 +453,7 @@ fn update_from_previous_input(app: &mut App) {
441
453
442
454
fn ui ( f : & mut Frame , app : & App ) {
443
455
// TODO: register size should depend on arch
444
- let register_size = Length ( 26 ) ;
456
+ let register_size = Length ( REGISTER_COUNT_MAX as u16 + 1 ) ;
445
457
let stack_size = Min ( 10 ) ;
446
458
let asm_size = Min ( 10 ) ;
447
459
let info_size = Length ( 5 ) ;
0 commit comments