[OpenBIOS] r552 - cpu/x86 cpu/x86/Linux cpu/x86/build forth/lib
svn at openbios.org
svn at openbios.org
Thu Aug 16 22:49:15 CEST 2007
Author: wmb
Date: 2007-08-16 22:49:15 +0200 (Thu, 16 Aug 2007)
New Revision: 552
Modified:
cpu/x86/Linux/catchexc.fth
cpu/x86/build/builder.dic
cpu/x86/cpubpsup.fth
cpu/x86/disassem.fth
cpu/x86/register.fth
forth/lib/stringop.fth
Log:
Added support for exception handling and breakpointing under Linux.
Modified: cpu/x86/Linux/catchexc.fth
===================================================================
--- cpu/x86/Linux/catchexc.fth 2007-08-16 18:57:40 UTC (rev 551)
+++ cpu/x86/Linux/catchexc.fth 2007-08-16 20:49:15 UTC (rev 552)
@@ -3,7 +3,23 @@
decimal
only forth also hidden also forth definitions
+d# 64 constant #signals
+
+\ Ideally, we should determine /fpstate at runtime by searching
+\ for the "retcode" signature 0077b858
+\ h# 264 constant /fpstate \ Determined empirically by dumping with gdb
+h# 26c constant /fpstate \ Determined empirically by dumping with gdb
+
+\ retcode - 8
+\ extramask - 8
+\ fpstate - 264
+\ sigcontext - 58
+\ signal# - 4
+\ retaddr - 4
+
: enterforth
+ \ Adjust pc if it has been incremented past the trap
+ int# 3 = if %eip 1- to %eip then
handle-breakpoint
;
@@ -19,7 +35,7 @@
\ Establish the Data and Return stacks
'user rp0 rp mov
- 'user sp0 bx mov
+ 'user sp0 sp mov
\ Restart the Forth interpreter.
cld
@@ -44,8 +60,8 @@
\ gs, fs, es, ds 00..0c
\ edi, esi, ebp, esp, ebx, edx, ecx, eax 10..2c
\ trapno, err, eip, cs 30..3c
-\ esp_at_signal, ss, *fpstate, oldmask 40..4c
-\ cr2 50
+\ eflags, esp_at_signal, ss, *fpstate 40..4c
+\ oldmask, cr2 50..54
label save-state-signal
@@ -56,29 +72,30 @@
0 [dx] up mov \ Establish user pointer
'user cpu-state bx mov \ Base address of save area
- 4 [sp] si lea \ Address of signal#
+ sp si mov \ Address of return address
cld \ Increment pointers
- ax lods ax offset-of int# [bx] mov
+ ax lods ax offset-of %esp2 [bx] mov
+ ax lods ax offset-of sig# [bx] mov
- ax lods ax offset-of %gs [bx] mov
- ax lods ax offset-of %fs [bx] mov
- ax lods ax offset-of %es [bx] mov
- ax lods ax offset-of %ds [bx] mov
+ ax lods ax offset-of %gs [bx] mov
+ ax lods ax offset-of %fs [bx] mov
+ ax lods ax offset-of %es [bx] mov
+ ax lods ax offset-of %ds [bx] mov
- ax lods ax offset-of %edi [bx] mov
- ax lods ax offset-of %esi [bx] mov
- ax lods ax offset-of %ebp [bx] mov
- ax lods ax offset-of %esp [bx] mov \ Correct ESP value will be set later
- ax lods ax offset-of %ebx [bx] mov
- ax lods ax offset-of %edx [bx] mov
- ax lods ax offset-of %ecx [bx] mov
- ax lods ax offset-of %eax [bx] mov
+ ax lods ax offset-of %edi [bx] mov
+ ax lods ax offset-of %esi [bx] mov
+ ax lods ax offset-of %ebp [bx] mov
+ ax lods ax offset-of %esp [bx] mov \ Correct ESP value will be set later
+ ax lods ax offset-of %ebx [bx] mov
+ ax lods ax offset-of %edx [bx] mov
+ ax lods ax offset-of %ecx [bx] mov
+ ax lods ax offset-of %eax [bx] mov
- ax lods \ Skip trapno
+ ax lods ax offset-of int# [bx] mov \ trapno
ax lods ax offset-of %error [bx] mov \ Save err
- ax lods ax offset-of %eip [bx] mov
+ ax lods ax offset-of %eip [bx] mov
\ Change the resume address to go to "reenter"
make-odd \ word-align address
@@ -90,6 +107,12 @@
ax lods ax offset-of %eflags [bx] mov
ax lods \ Skip esp_at_signal
ax lods ax offset-of %ss [bx] mov
+ ax lods \ Skip *fpstate
+ ax lods ax offset-of %esp1 [bx] mov \ Hijack esp1 for oldmask
+ ax lods ax offset-of %cr3 [bx] mov \ Hijack cr3 for cr2
+ /fpstate # si add \ Skip fpstate
+ ax lods ax offset-of %ss0 [bx] mov \ Hijack ss0 for extramask0
+ ax lods ax offset-of %ss1 [bx] mov \ Hijack ss1 for extramask1
ax ax xor ax dec
ax offset-of %state-valid [bx] mov \ mark saved state as valid
@@ -118,10 +141,82 @@
ret
end-code
+h# 400 buffer: restart-stack
+0 value restart-sp
+code (restart ( -- )
+ \ Restore the Forth stacks.
+
+ cld \ Increment pointers
+ up bx mov \ Save UP because it is di
+
+ \ Data Stack
+ 'user pssave si mov \ Address of data stack save area
+ 'user sp0 di mov \ Top of data stack area
+
+ ps-size # di sub \ Bottom of data stack area
+ ps-size 4 / # cx mov \ Size of data stack area (in longwords)
+ rep movs
+
+
+ \ Return Stack
+ bx up mov \ Restore UP for 'user
+ 'user rssave si mov \ Address of return stack save area
+ 'user rp0 di mov \ Top of return stack area
+
+ rs-size # di sub \ Bottom of return stack area
+ rs-size 4 / # cx mov \ Size of return stack area (in longwords)
+ rep movs
+
+ \ Restore registers
+
+ bx up mov \ Restore UP for 'user
+ 'user cpu-state bx mov \ Base address of save area
+
+ 'user restart-sp sp mov \ Establish a stack for the next steps
+
+ h# 80cd0000 # push \ tail of retcode
+ h# 0077b858 # push \ retcode - ax pop d# 119 # ax mov h# 80 int
+ offset-of %ss1 [bx] push \ Actually extramask
+ offset-of %ss0 [bx] push
+ /fpstate # sp sub \ Space for fpstate
+ offset-of %cr3 [bx] push \ Actually cr2
+ offset-of %esp1 [bx] push \ Actually oldmask
+ 0 # push \ *fpstate
+ offset-of %ss [bx] push \ ss
+ offset-of %esp [bx] push \ esp_at_signal
+ offset-of %eflags [bx] push
+ offset-of %cs [bx] push
+ offset-of %eip [bx] push
+ offset-of %error [bx] push
+ offset-of int# [bx] push \ Actually trapno
+
+ offset-of %eax [bx] push
+ offset-of %ecx [bx] push
+ offset-of %edx [bx] push
+ offset-of %ebx [bx] push
+ offset-of %esp [bx] push
+ offset-of %ebp [bx] push
+ offset-of %esi [bx] push
+ offset-of %edi [bx] push
+
+ offset-of %ds [bx] push
+ offset-of %es [bx] push
+ offset-of %fs [bx] push
+ offset-of %gs [bx] push
+
+ offset-of sig# [bx] push
+ offset-of %esp2 [bx] push \ Actually return address
+
+ ret
+
+end-code
+' (restart is restart
+
+
+
hidden definitions
-d# 65 constant #signals
#signals /n* buffer: old-signals
defer save-state
@@ -179,13 +274,17 @@
( 08 ) ," Floating point error or divide-by-0"
( 09 ) ," "
( 10 ) ," "
-( 11 ) ," "
+( 11 ) ," Segmentation fault"
end-string-array
: (.exception) ( -- )
- int#
- dup d# 8 <= if exception-names ". cr exit then
- push-decimal (u.) type cr pop-base
+ sig# 5 = if
+ int# 3 <> if ." Int 0x" .x then
+ exit
+ then
+
+ sig# d# 11 <= if sig# exception-names ". cr exit then
+ push-decimal sig# (u.) type cr pop-base
;
' (.exception) is .exception
: print-breakpoint
@@ -199,7 +298,9 @@
hidden also
: sys-init
sys-init
+ restart-stack h# 400 + to restart-sp
catch-signals
+ false to hardware-step?
restartable? off
;
only forth also definitions
Modified: cpu/x86/build/builder.dic
===================================================================
(Binary files differ)
Modified: cpu/x86/cpubpsup.fth
===================================================================
--- cpu/x86/cpubpsup.fth 2007-08-16 18:57:40 UTC (rev 551)
+++ cpu/x86/cpubpsup.fth 2007-08-16 20:49:15 UTC (rev 552)
@@ -50,12 +50,30 @@
then ( adr'' )
sizes r> + c@ + ( adr''' ) \ Add displacement
;
+
\ Looks for call instructions and figures out the length of their
\ 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.
-: next-instruction ( following-jsrs? -- adr 0 )
- 0= if
+true value hardware-step? \ True if the environment permits hardware single-step
+: find-successors ( -- pc1 pc2 )
+ hardware-step? if step-adr 0 exit then
+
+ ['] cr behavior >r ['] type behavior >r
+ ['] noop to cr ['] 2drop to type
+ [ also disassembler ] %eip pc!dis1 pc @ branch-target @ [ previous ]
+ r> to type r> to cr
+;
+
+: next-instruction ( following-jsrs? -- next-adr 0|branch_target )
+ if
+ \ We are following jsrs, so we want the target address
+ \ of call instructions.
+ find-successors ( adr1 adr2 )
+ else
+ \ We are not following jsrs, so we want the address right after
+ \ the instruction, not the address within the called subroutine.
+
%eip dup 1+ swap c@ ( %eip opcode )
case ( %eip+1 opcode )
h# 0cc of 0 exit endof \ INT 3
@@ -71,8 +89,8 @@
endof
endcase ( %eip+1 )
drop ( )
- then ( )
- step-adr 0
+ find-successors ( adr1 adr2 )
+ then ( adr1 adr2 )
;
code goto ( adr -- )
@@ -84,7 +102,7 @@
true abort" loop-exit-adr is not implemented"
;
-: bumppc ( -- ) 0 next-instruction to rpc ;
+: bumppc ( -- ) 0 next-instruction drop to rpc ;
only forth also definitions
headers
: set-pc ( adr -- ) dup to rpc ;
Modified: cpu/x86/disassem.fth
===================================================================
--- cpu/x86/disassem.fth 2007-08-16 18:57:40 UTC (rev 551)
+++ cpu/x86/disassem.fth 2007-08-16 20:49:15 UTC (rev 552)
@@ -14,6 +14,7 @@
nuser instruction
variable end-found
nuser pc
+nuser branch-target
nuser dis-offset
: op8@ ( -- b ) pc @ dis-offset @ + c@ 1 pc +! ;
@@ -185,8 +186,8 @@
," s" ," ns" ," pe" ," po" ," l" ," ge" ," le" ," g"
end-string-array
-: jb ( -- ) op8@ bext pc @ + showaddr ;
-: jv ( -- ) adv@ pc @ + showaddr ;
+: jb ( -- ) op8@ bext pc @ + dup branch-target ! showaddr ;
+: jv ( -- ) adv@ pc @ + dup branch-target ! showaddr ;
: .jcc ( -- ) ." j" low4bits >cond ". op-col jb ;
: ea,g ( -- ) get-ea .ea ., gb/v ;
@@ -573,7 +574,7 @@
.op8 .op9 .opa .movi .opc .opd .ope .opf
;
-: (dis-body) ( -- ) decode-op op-class ;
+: (dis-body) ( -- ) branch-target off decode-op op-class ;
' (dis-body) is dis-body
: dis1 ( -- )
??cr
Modified: cpu/x86/register.fth
===================================================================
--- cpu/x86/register.fth 2007-08-16 18:57:40 UTC (rev 551)
+++ cpu/x86/register.fth 2007-08-16 20:49:15 UTC (rev 552)
@@ -63,7 +63,7 @@
\ State information needed by the firmware; not machine registers
register watchdog register %state-valid register %restartable?
-register %saved-my-self register last-trap#
+register %saved-my-self register sig#
\ Following words defined here to satisfy the
\ references to these "variables" anywhere else
Modified: forth/lib/stringop.fth
===================================================================
--- forth/lib/stringop.fth 2007-08-16 18:57:40 UTC (rev 551)
+++ forth/lib/stringop.fth 2007-08-16 20:49:15 UTC (rev 552)
@@ -35,9 +35,9 @@
vocabulary macros
: $set-macro ( value$ name$ -- )
- warning @ warning off
+ warning @ >r warning off
also macros definitions $header create-cf previous definitions ( value$ )
- warning !
+ r> warning !
",
does> ( -- adr len ) count
;
More information about the OpenBIOS
mailing list