[openfirmware] r1056 - cpu/x86/Darwin

svn at openfirmware.info svn at openfirmware.info
Tue Dec 30 03:31:30 CET 2008


Author: wmb
Date: 2008-12-30 03:31:29 +0100 (Tue, 30 Dec 2008)
New Revision: 1056

Added:
   cpu/x86/Darwin/Makefile
   cpu/x86/Darwin/catchexc.fth
   cpu/x86/Darwin/graphdev.fth
Log:
Checked in some more files for the Mac OSX/Darwin build environment.



Added: cpu/x86/Darwin/Makefile
===================================================================
--- cpu/x86/Darwin/Makefile	                        (rev 0)
+++ cpu/x86/Darwin/Makefile	2008-12-30 02:31:29 UTC (rev 1056)
@@ -0,0 +1,65 @@
+# Wrapper makefile for x86 Mac OS X / Darwin
+
+BP=../../..
+
+CFLAGS	= -g -m32 -DTARGET_X86
+
+# Extra CFLAGS needed by Darwin hosts. GCC doesn't define __unix__ here,
+# so we must include it ourselves.
+CFLAGS += -D__unix__=1 -Wimplicit-function-declaration
+#CFLAGS += -DUSE_XCB
+
+WRTAIL = forth/wrapper
+WRDIR = ${BP}/${WRTAIL}
+ZIPTAIL = ${WRTAIL}/zip
+ZIPDIR = ${BP}/${ZIPTAIL}
+
+# Apple's GCC is a bit brain-dead. It's probably best to install gcc43 and
+# binutils from macports. See http://macports.macforge.net for how to install
+# and use macports. At the very least, binutils from macports seems to be
+# required.
+
+# The default compiler on Mac OS X (as of 10.5 anyway) does not honor -fpic.
+# GCC will warn about -fpic not being supported, assumes you meant -fPIC,
+# and switches to that. That should be okay, but if you're concerned about it
+# I'm providing this already defined override for ${CC}. To use it, just 
+# uncomment it, or pass CC= on the command line. This is here to make things
+# easier for us lazy people.
+#CC = /opt/local/bin/gcc-mp-4.3
+
+# Unfortunately, Mac OS X does not ship with objcopy. This means that one must
+# install binutils from macports, so we override the OBJCOPY variable here
+# and just use that instead of calling 'objcopy' itself.
+OBJCOPY = /opt/local/bin/gobjcopy
+
+ZIPOBJS = zipmem.o deflate.o trees.o bits.o util.o inflate.o
+
+OBJS = wrapper.o logger.o ${ZIPOBJS}
+
+all: forth x86forth ../build/inflate.bin
+
+# Use forth when you just need to run Forth but don't care what
+# native instruction set it is on.
+# Use x86forth when you need to compile new dictionaries that will
+# run on x86 systems.
+forth: ${OBJS}
+	${CC} -m32 -o $@ ${OBJS}
+	@ln -sf forth x86forth
+
+# Compile with -O0 because with GCC4, higher optimization levels cause the
+# functions to be reordered so the "inflate" entry point is no longer at
+# the beginning.
+inflate.o: ${ZIPDIR}/inflate.c
+	${CC} -c -m32 -O0 -fpic $< -o $@
+
+../build/inflate.bin: inflate.o
+	${OBJCOPY} -O binary $< $@
+
+%.o: ${WRDIR}/%.c
+	${CC} -c ${CFLAGS} -I${ZIPDIR} $< -o $@
+
+%.o: ${ZIPDIR}/%.c
+	${CC} -c ${CFLAGS} -I${ZIPDIR} $< -o $@
+
+clean:
+	@rm -f forth x86forth *.o *~ inflate.bin

Added: cpu/x86/Darwin/catchexc.fth
===================================================================
--- cpu/x86/Darwin/catchexc.fth	                        (rev 0)
+++ cpu/x86/Darwin/catchexc.fth	2008-12-30 02:31:29 UTC (rev 1056)
@@ -0,0 +1,330 @@
+\ See license at end of file
+
+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
+;
+
+label reenter
+   \ We get here from then end of save-state, either by branching directly
+   \ or by modifying the return address in the DPMI exception frame.
+
+   make-odd 			 	\ word-align address
+   'body main-task   dup #  dx  mov
+   -4 allot  token, 			\ rewrite address as relocatable
+
+   0 [dx]             up  mov		\ Establish user pointer
+
+   \ Establish the Data and Return stacks
+   'user rp0          rp   mov
+   'user sp0          sp   mov
+
+   \ Restart the Forth interpreter.
+   cld
+
+   \ Execute enterforth
+\   'body enterforth #)  ip  lea
+   make-even 				\ word-align for relocation
+   'body enterforth  dup #)  ip  lea
+   -4 allot  token, 			\ rewrite address as relocatable   
+c;
+
+\ This is the signal handler.  When it is called, the stack contains:
+\
+\   struct sigcontext  ( See /usr/include/asm/sigcontext.h )
+\   signal number
+\   return address
+\
+\ We copy the data from sigcontext and fiddle the EIP value in sigcontext
+\ so that Forth is re-entered at the enterforth addresss
+
+\ For reference, sigcontext contains:
+\   gs, fs, es, ds                           00..0c
+\   edi, esi, ebp, esp, ebx, edx, ecx, eax   10..2c
+\   trapno, err, eip, cs                     30..3c
+\   eflags, esp_at_signal, ss, *fpstate      40..4c
+\   oldmask, cr2                             50..54
+
+label save-state-signal
+
+   make-odd 			 	\ word-align address
+   'body main-task   dup #  dx  mov
+   -4 allot  token, 			\ rewrite address as relocatable
+
+   0 [dx]             up  mov		\ Establish user pointer
+   'user cpu-state    bx  mov		\ Base address of save area
+
+   sp                 si  mov           \ Address of return address
+
+   cld         \ Increment pointers
+   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 %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 int#   [bx]  mov  \ trapno
+   ax lods  ax  offset-of %error [bx]  mov  \ Save err
+
+   ax lods  ax  offset-of %eip   [bx]  mov
+
+   \ Change the resume address to go to "reenter"
+   make-odd 			 	\ word-align address
+   'body reenter   dup #  ax mov
+   -4 allot  token, 			\ rewrite address as relocatable
+   ax  -4 [si]  mov                     \ Resume at reenter address
+
+   ax lods  ax  offset-of %cs      [bx]  mov
+   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
+
+   \ Copy the entire Forth data stack and return stack areas to a save area.
+   up dx mov    \ Save UP
+
+   \ Data Stack  (load si first because di is the user pointer!)
+   'user sp0          si   mov
+   'user pssave       di   mov    \ Address of data stack save area
+   ps-size #          si   sub    \ Bottom of data stack area (in longwords)
+
+   ps-size 4 / #      cx   mov    \ Size of data stack area
+   rep  movs
+
+   dx up mov    \ Get user pointer back
+
+   \ Return Stack  (load si first because di is the user pointer!)
+   'user rp0          si   mov
+   'user rssave       di   mov    \ Address of return stack save area
+   rs-size #          si   sub    \ Bottom of return stack area
+
+   rs-size 4 / #      cx   mov    \ Size of return stack area (in longwords)
+   rep  movs
+
+   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
+
+#signals /n* buffer: old-signals
+
+defer save-state
+' save-state-signal to save-state
+
+: set-signal  ( handler signal# -- old-handler )
+   d# 92 syscall 2drop retval
+;
+: catch-signal  ( signal# -- )
+   save-state over  set-signal  ( signal# old-handler )
+   old-signals rot na+ !
+;
+: uncatch-signal  ( signal# -- )  old-signals over na+ @  swap set-signal drop  ;
+
+: uncatch-signals  ( -- )
+   d# 02 uncatch-signal	\ SIGINT
+   d# 04 uncatch-signal	\ SIGILL
+   d# 05 uncatch-signal	\ SIGTRAP
+   d# 07 uncatch-signal	\ SIGBUS
+   d# 08 uncatch-signal	\ SIGFPE, Divide by 0
+   d# 11 uncatch-signal	\ SIGSEGV
+;
+
+forth definitions
+: catch-signals  ( -- )
+   pssave drop  rssave drop	\ Force buffer allocation
+   [ 0 alloc-reg ] literal alloc-mem is cpu-state
+
+   d# 02 catch-signal	\ SIGINT
+   d# 04 catch-signal	\ SIGILL
+   d# 05 catch-signal	\ SIGTRAP
+   d# 07 catch-signal	\ SIGBUS
+   d# 08 catch-signal	\ SIGFPE, Divide by 0
+   d# 11 catch-signal	\ SIGSEGV
+;
+
+[ifdef] $save-forth
+: $save-forth  ( name$ -- )
+   uncatch-signals  $save-forth  catch-signals
+;
+[then]
+only forth also definitions
+
+\ Linux signal names
+
+string-array exception-names
+( 00 ) ," "
+( 01 ) ," "
+( 02 ) ," Interrupt"
+( 03 ) ," "
+( 04 ) ," Illegal Instruction"
+( 05 ) ," Trap"
+( 06 ) ," "
+( 07 ) ," Bus error"
+( 08 ) ," Floating point error or divide-by-0"
+( 09 ) ," "
+( 10 ) ," "
+( 11 ) ," Segmentation fault"
+end-string-array
+
+: (.exception)  ( -- )
+   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
+   .exception
+   interactive? 0=  if bye then	\ Restart only if a human is at the controls
+   ??cr quit
+;
+\ ' print-breakpoint is handle-breakpoint
+
+\ defer restart  ( -- )
+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
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2007 FirmWorks
+\ 
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\ 
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\ 
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END

Added: cpu/x86/Darwin/graphdev.fth
===================================================================
--- cpu/x86/Darwin/graphdev.fth	                        (rev 0)
+++ cpu/x86/Darwin/graphdev.fth	2008-12-30 02:31:29 UTC (rev 1056)
@@ -0,0 +1,42 @@
+purpose: Simulation of OFW graphics using X
+
+dev /  new-device
+  " xgraphics" device-name
+  : open  ( -- okay? )  d# 1200 d# 900  d# 392 syscall  2drop retval  0=  ;
+  : close ( -- )   d# 396 syscall  ;
+
+  : fill-rectangle  ( color565 x y w h -- )  d# 404 syscall  4drop drop  ;
+finish-device
+
+: get-color  ( r g b -- color )
+   d# 400 syscall  3drop  retval
+;
+  
+: open-screen
+   " /xgraphics" open-dev to screen-ih
+;
+
+0 value xred
+0 value xgreen
+0 value xblue
+0 value xmagenta
+0 value xblack
+0 value xmagenta
+
+: demo  ( -- )
+   open-screen
+
+   h# ff  h# 00  h# 00  get-color to xred
+   h# 00  h# ff  h# 00  get-color to xgreen
+   h# 00  h# 00  h# ff  get-color to xblue
+   h# ff  h# 00  h# ff  get-color to xmagenta
+       0      0      0  get-color to xblack
+   h# ff  h# ff  h# ff  get-color to xmagenta
+
+   d# 500        0  do  i xred     show-state  loop
+   d# 1000 d#  500  do  i xblue    show-state  loop
+   d# 1500 d# 1000  do  i xgreen   show-state  loop
+   d# 2000 d# 1500  do  i xmagenta show-state  loop
+
+   xblack  d# 400 d# 300  d# 50 d# 60  " fill-rectangle" $call-screen
+;




More information about the openfirmware mailing list