Author: wmb Date: 2008-11-17 21:53:53 +0100 (Mon, 17 Nov 2008) New Revision: 1007
Modified: cpu/x86/cpubpsup.fth cpu/x86/dtacc.fth Log: x86 assembly language debugger - use hardware breakpoint mode when running standalone, so that single-stepping RET and indirect JMP/CALL instructions works. Also support single-stepping RET in software breakpoint mode (supporting indirect JMP/CALL is hard, requiring full effective address evaluation, so we don't do it yet).
Modified: cpu/x86/cpubpsup.fth =================================================================== --- cpu/x86/cpubpsup.fth 2008-11-15 03:06:06 UTC (rev 1006) +++ cpu/x86/cpubpsup.fth 2008-11-17 20:53:53 UTC (rev 1007) @@ -10,6 +10,8 @@
: .instruction ( -- ) %eip pc!dis1 ;
+true value hardware-step? \ True if the environment permits hardware single-step + also hidden also definitions
headerless @@ -55,10 +57,25 @@ \ addressing mode bytes. Returns the address following those addressing \ mode bytes, or step-adr if the instruction is not a call or if following- \ jsrs is true. -true value hardware-step? \ True if the environment permits hardware single-step + +: jmp-indirect? ( -- false | pc1 pc2 true ) + %eip c@ h# fe and h# c2 = if \ RET NEAR + %esp l@ 0 true exit + then + + %eip c@ h# ff and if + %eip 1+ c@ 3 rshift 7 and 2 5 between if + ." Single-stepping indirect call/jmp doesn't work in software breakpoint mode" cr + then + then + false +; + : find-successors ( -- pc1 pc2 ) hardware-step? if step-adr 0 exit then
+ jmp-indirect? if exit then + ['] cr behavior >r ['] type behavior >r ['] noop to cr ['] 2drop to type [ also disassembler ] %eip pc!dis1 pc @ branch-target @ [ previous ]
Modified: cpu/x86/dtacc.fth =================================================================== --- cpu/x86/dtacc.fth 2008-11-15 03:06:06 UTC (rev 1006) +++ cpu/x86/dtacc.fth 2008-11-17 20:53:53 UTC (rev 1007) @@ -42,6 +42,7 @@
stand-init: Exceptions make-idt stand-set-idt move-gdt + true to hardware-step? ;
\ LICENSE_BEGIN