OpenCores
URL https://opencores.org/ocsvn/openmsp430/openmsp430/trunk

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [tools/] [openmsp430-gdbproxy/] [commands.tcl] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 olivier.gi
#!/usr/bin/wish
2
#------------------------------------------------------------------------------
3
# Copyright (C) 2001 Authors
4
#
5
# This source file may be used and distributed without restriction provided
6
# that this copyright statement is not removed from the file and that any
7
# derivative work contains the original copyright notice and the associated
8
# disclaimer.
9
#
10
# This source file is free software; you can redistribute it and/or modify
11
# it under the terms of the GNU Lesser General Public License as published
12
# by the Free Software Foundation; either version 2.1 of the License, or
13
# (at your option) any later version.
14
#
15
# This source is distributed in the hope that it will be useful, but WITHOUT
16
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
18
# License for more details.
19
#
20
# You should have received a copy of the GNU Lesser General Public License
21
# along with this source; if not, write to the Free Software Foundation,
22
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
23
#
24
#------------------------------------------------------------------------------
25
# 
26
# File Name: commands.tcl
27
# 
28
#------------------------------------------------------------------------------
29
 
30
global mem_breakpoint
31
 
32
###############################################################################
33
#                                                                             #
34
#                              RSP COMMAND PARSER                             #
35
#                                                                             #
36
###############################################################################
37
 
38
proc rspParse {sock rsp_cmd} {
39
 
40
    set rsp_answer ""
41
    set cmd_tail [string range $rsp_cmd 1 [string length $rsp_cmd]]
42
 
43
    switch -exact -- [string index $rsp_cmd 0] {
44
        "!"     {set rsp_answer "OK"}
45
        "?"     {set rsp_answer [rsp_stop_reply $sock "?"]}
46
        "A"     {}
47
        "b"     {}
48
        "c"     {set rsp_answer [rsp_c $sock $cmd_tail]}
49
        "C"     {set rsp_answer [rsp_c $sock $cmd_tail]}
50
        "D"     {}
51
        "F"     {}
52
        "g"     {set rsp_answer [rsp_g]}
53
        "G"     {set rsp_answer [rsp_G $cmd_tail]}
54
        "H"     {set rsp_answer ""}
55
        "i"     {}
56
        "I"     {}
57
        "k"     {set rsp_answer [rsp_k $cmd_tail]}
58
        "m"     {set rsp_answer [rsp_m $cmd_tail]}
59
        "M"     {set rsp_answer [rsp_M $cmd_tail]}
60
        "p"     {}
61
        "P"     {}
62
        "q"     {set rsp_answer [rsp_q $sock $cmd_tail]}
63
        "Q"     {}
64
        "R"     {}
65
        "s"     {set rsp_answer [rsp_s $sock $cmd_tail]}
66
        "S"     {set rsp_answer [rsp_s $sock $cmd_tail]}
67
        "t"     {}
68
        "T"     {}
69
        "v"     {}
70
        "X"     {}
71
        "z"     {set rsp_answer [rsp_z $sock $cmd_tail]}
72
        "Z"     {set rsp_answer [rsp_Z $sock $cmd_tail]}
73
        default {}
74
    }
75
 
76
 
77
    return $rsp_answer
78
}
79
 
80
 
81
###############################################################################
82
#                                                                             #
83
#                                   RSP COMMANDS                              #
84
#                                                                             #
85
###############################################################################
86
 
87
#-----------------------------------------------------------------------------#
88
# Read CPU registers                                                          #
89
#-----------------------------------------------------------------------------#
90
proc rsp_g {} {
91
 
92
    # Read register value
93
    set reg_val [ReadRegAll]
94
 
95
    # Format answer
96
    set rsp_answer ""
97
    for {set i 0} {$i < [llength $reg_val]} {incr i} {
98
 
99
        regexp {0x(..)(..)} [lindex $reg_val $i] match msb lsb
100
        append rsp_answer "$lsb$msb"
101
    }
102
 
103
    return $rsp_answer
104
}
105
 
106
#-----------------------------------------------------------------------------#
107
# Write CPU registers                                                         #
108
#-----------------------------------------------------------------------------#
109
proc rsp_G {cmd} {
110
 
111
    # Format register value
112
    set num_reg [expr [string length $cmd]/4]
113
 
114
    set reg_val ""
115
    for {set i 0} {$i < $num_reg} {incr i} {
116
 
117
        set lsb "[string index $cmd [expr $i*4+0]][string index $cmd [expr $i*4+1]]"
118
        set msb "[string index $cmd [expr $i*4+2]][string index $cmd [expr $i*4+3]]"
119
        lappend reg_val "0x$msb$lsb"
120
    }
121
 
122
    # Write registers
123
    WriteRegAll $reg_val
124
 
125
    return "OK"
126
}
127
 
128
#-----------------------------------------------------------------------------#
129
# Kill request.                                                               #
130
#-----------------------------------------------------------------------------#
131
proc rsp_k {cmd} {
132
 
133
    # Reset & Stop CPU
134
    ExecutePOR_Halt
135
 
136
    return "-1"
137
}
138
 
139
#-----------------------------------------------------------------------------#
140
# Write length bytes of memory.                                               #
141
#-----------------------------------------------------------------------------#
142
proc rsp_M {cmd} {
143
 
144
    global mem_breakpoint
145
 
146
    # Parse command
147
    regexp {(.*),(.*):(.*)} $cmd match addr length data
148
    set addr   [format %04x "0x$addr"]
149
    set length [format %d   "0x$length"]
150
 
151
    # Format data
152
    set mem_val ""
153
    for {set i 0} {$i<$length} {incr i} {
154
        lappend mem_val "0x[string range $data [expr $i*2] [expr $i*2+1]]"
155
    }
156
 
157
    # Write memory
158
    WriteMemQuick8  "0x$addr" $mem_val
159
 
160
    # Eventually re-set the software breakpoints in case they have been overwritten
161
    set addr_start [format %d "0x$addr"]
162
    foreach {brk_addr brk_val} [array get mem_breakpoint] {
163
        set brk_addr_dec    [format %d "0x$brk_addr"]
164
        set brk_addr_offset [expr $brk_addr_dec-$addr_start]
165
        if {(0<=$brk_addr_offset) && ($brk_addr_offset<=$length)} {
166
            set mem_breakpoint($brk_addr) [lindex $mem_val $brk_addr_offset]
167
            WriteMem 0 "0x$brk_addr" 0x4343
168
        }
169
    }
170
 
171
    return "OK"
172
}
173
 
174
 
175
#-----------------------------------------------------------------------------#
176
# Read length bytes from memory.                                              #
177
#-----------------------------------------------------------------------------#
178
proc rsp_m {cmd} {
179
 
180
    global mem_breakpoint
181
 
182
    # Parse command
183
    regexp {(.*),(.*)} $cmd match addr length
184
    set addr   [format %04x "0x$addr"]
185
    set length [format %d   "0x$length"]
186
 
187
    # Read memory
188
    set data [ReadMemQuick8  "0x$addr" $length]
189
 
190
    # Eventually replace read data by the original software breakpoint value
191
    set addr_start [format %d "0x$addr"]
192
    foreach {brk_addr brk_val} [array get mem_breakpoint] {
193
        set brk_addr_dec    [format %d "0x$brk_addr"]
194
        set brk_addr_offset [expr $brk_addr_dec-$addr_start]
195
        if {(0<=$brk_addr_offset) && ($brk_addr_offset<=$length)} {
196
            set data [lreplace $data $brk_addr_offset $brk_addr_offset "0x$mem_breakpoint($brk_addr)"]
197
        }
198
    }
199
 
200
    # Format data
201
    regsub -all {0x} $data {} data
202
    regsub -all { }  $data {} data
203
 
204
    return $data
205
}
206
 
207
 
208
#-----------------------------------------------------------------------------#
209
# Insert breakpoint.                                                          #
210
#-----------------------------------------------------------------------------#
211
proc rsp_Z {sock cmd} {
212
 
213
    global mem_breakpoint
214
 
215
    # Parse command
216
    regexp {(.),(.*),(.*)} $cmd match type addr length
217
    set addr   [format %04x "0x$addr"]
218
 
219
    switch -exact -- $type {
220
        "0"     {# Memory breakpoint
221
                 set mem_breakpoint($addr) [ReadMem 0 "0x$addr"]
222
                 WriteMem 0 "0x$addr" 0x4343
223
                 return "OK"
224
                }
225
 
226
        "1"     {# Hardware breakpoint
227
                 if {[SetHWBreak 1 [format "0x%04x" 0x$addr] 1 0]} {
228
                     return "OK"
229
                 }
230
                 return ""
231
                }
232
 
233
        "2"     {# Write watchpoint
234
                 if {[SetHWBreak 0 [format "0x%04x" 0x$addr] 0 1]} {
235
                     return "OK"
236
                 }
237
                 return ""
238
                }
239
 
240
        "3"     {# Read watchpoint
241
                 if {[SetHWBreak 0 [format "0x%04x" 0x$addr] 1 0]} {
242
                     return "OK"
243
                 }
244
                 return ""
245
                }
246
 
247
        "4"     {# Access watchpoint
248
                 if {[SetHWBreak 0 [format "0x%04x" 0x$addr] 1 1]} {
249
                     return "OK"
250
                 }
251
                 return ""
252
                }
253
 
254
        default {return ""}
255
    }
256
}
257
 
258
#-----------------------------------------------------------------------------#
259
# Remove breakpoint.                                                          #
260
#-----------------------------------------------------------------------------#
261
proc rsp_z {sock cmd} {
262
 
263
    global mem_breakpoint
264
 
265
    # Parse command
266
    regexp {(.),(.*),(.*)} $cmd match type addr length
267
    set addr   [format %04x "0x$addr"]
268
 
269
    switch -exact -- $type {
270
        "0"     {# Memory breakpoint
271
                 WriteMem 0 "0x$addr" $mem_breakpoint($addr)
272
                 unset mem_breakpoint($addr)
273
                 return "OK"
274
                }
275
 
276
        "1"     {# Hardware breakpoint
277
                 if {[ClearHWBreak 1 [format "0x%04x" 0x$addr]]} {
278
                     return "OK"
279
                 }
280
                 return ""
281
                }
282
 
283
        "2"     {# Write watchpoint
284
                 if {[ClearHWBreak 0 [format "0x%04x" 0x$addr]]} {
285
                     return "OK"
286
                 }
287
                 return ""
288
                }
289
 
290
        "3"     {# Read watchpoint
291
                 if {[ClearHWBreak 0 [format "0x%04x" 0x$addr]]} {
292
                     return "OK"
293
                 }
294
                 return ""
295
                }
296
 
297
        "4"     {# Access watchpoint
298
                 if {[ClearHWBreak 0 [format "0x%04x" 0x$addr]]} {
299
                     return "OK"
300
                 }
301
                 return ""
302
                }
303
 
304
        default {return ""}
305
    }
306
}
307
 
308
#-----------------------------------------------------------------------------#
309
# Continue.                                                                   #
310
#-----------------------------------------------------------------------------#
311
proc rsp_c {sock cmd} {
312
 
313
    # Set address if required
314
    if {$cmd!=""} {
315
        set cmd [format %04x "0x$cmd"]
316
        SetPC "0x$cmd"
317
    }
318
 
319
    # Clear status
320
    ClrStatus
321
 
322
    # Continue
323
    ReleaseCPU
324
 
325
 
326
    return [rsp_stop_reply $sock "c"]
327
}
328
 
329
#-----------------------------------------------------------------------------#
330
# Step.                                                                       #
331
#-----------------------------------------------------------------------------#
332
proc rsp_s {sock cmd} {
333
 
334
    # Set address if required
335
    if {$cmd!=""} {
336
        set cmd [format %04x "0x$cmd"]
337
        SetPC "0x$cmd"
338
    }
339
 
340
    # Clear status
341
    ClrStatus
342
 
343
    # Incremental step
344
    StepCPU
345
 
346
    return [rsp_stop_reply $sock "s"]
347
}
348
 
349
 
350
#-----------------------------------------------------------------------------#
351
# The `C', `c', `S', `s', `vCont', `vAttach', `vRun', `vStopped', and `?'     #
352
# packets can receive any of the below as a reply. Except for `?' and         #
353
# `vStopped', that reply is only returned when the target halts.              #
354
#-----------------------------------------------------------------------------#
355
proc rsp_stop_reply {sock cmd} {
356
 
357
    # Wait until halted
358
    while {![IsHalted]} {
359
 
360
        # Wait a few milliseconds to prevent the gui from freezing
361
        after 100 {set end 1}
362
        vwait end
363
 
364
        # Check if we are interrupted by GDB
365
        fconfigure $sock -blocking 0
366
        set break_char [read -nonewline $sock]
367
        fconfigure $sock -blocking 1
368
        binary scan $break_char H* break_char
369
        if {$break_char=="03"} {
370
            putsVerbose "--> BREAK"
371
            HaltCPU
372
        }
373
    }
374
 
375
    # Read some important registers
376
    set pc [ReadReg 0]
377
    regexp {0x(..)(..)} $pc match pc_hi pc_lo
378
    set r4 [ReadReg 4]
379
    regexp {0x(..)(..)} $r4 match r4_hi r4_lo
380
 
381
#    return "S05"
382
    return "T0500:$pc_lo$pc_hi;04:$r4_lo$r4_hi;"
383
}
384
 
385
 
386
#-----------------------------------------------------------------------------#
387
#                                                                             #
388
#-----------------------------------------------------------------------------#
389
proc rsp_q {sock cmd} {
390
 
391
       switch -regexp -- $cmd {
392
 
393
        "C"       {set rsp_answer ""}
394
        "Offsets" {set rsp_answer "Text=0;Data=0;Bss=0"}
395
        "Rcmd,.+" {set rsp_answer [rsp_qRcmd $sock $cmd]}
396
        default   {set rsp_answer ""}
397
    }
398
    return $rsp_answer
399
}
400
 
401
#-----------------------------------------------------------------------------#
402
# qRcmd,command'                                                              #
403
#    command (hex encoded) is passed to the local interpreter for execution.  #
404
#    Invalid commands should be reported using the output string. Before the  #
405
#    final result packet, the target may also respond with a number of        #
406
#    intermediate `Ooutput' console output packets. Implementors should note  #
407
#    that providing access to a stubs's interpreter may have security         #
408
#    implications.                                                            #
409
#-----------------------------------------------------------------------------#
410
proc rsp_qRcmd {sock cmd} {
411
 
412
    regsub {^Rcmd,} $cmd {} cmd
413
    set cmd [binary format H* $cmd];  # Convert hex to ascii
414
 
415
    switch -exact -- $cmd {
416
        "erase all" {;# Convert ascii to hex
417
                     binary scan "Erasing target program memory..." H* text1
418
                     binary scan " Erased OK\n"                     H* text2
419
                     ;# Execute erase command
420
                     sendRSPpacket $sock "O$text1"
421
                     EraseROM
422
                     sendRSPpacket $sock "O$text2"
423
                     set rsp_answer "OK"
424
                    }
425
        default     {set rsp_answer "OK"}
426
    }
427
 
428
    return $rsp_answer
429
 
430
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.