Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / obp / obp / arch / sun4u / go.fth
\ ========== Copyright Header Begin ==========================================
\
\ Hypervisor Software File: go.fth
\
\ Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
\
\ - Do no alter or remove copyright notices
\
\ - Redistribution and use of this software in source and binary forms, with
\ or without modification, are permitted provided that the following
\ conditions are met:
\
\ - Redistribution of source code must retain the above copyright notice,
\ this list of conditions and the following disclaimer.
\
\ - Redistribution in binary form must reproduce the above copyright notice,
\ this list of conditions and the following disclaimer in the
\ documentation and/or other materials provided with the distribution.
\
\ Neither the name of Sun Microsystems, Inc. or the names of contributors
\ may be used to endorse or promote products derived from this software
\ without specific prior written permission.
\
\ This software is provided "AS IS," without a warranty of any kind.
\ ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
\ INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
\ PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
\ MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
\ ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
\ DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
\ OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
\ FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
\ DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
\ ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
\ SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
\
\ You acknowledge that this software is not designed, licensed or
\ intended for use in the design, construction, operation or maintenance of
\ any nuclear facility.
\
\ ========== Copyright Header End ============================================
id: @(#)go.fth 1.22 06/03/14
purpose:
copyright: Copyright 2006 Sun Microsystems, Inc. All Rights Reserved
copyright: Use is subject to license terms.
headerless
\ A wrapper for the cif calls.
overload: do-cif ( ( adr -- result )
mid@ cif-owner l! do-cif -1 cif-owner l!
;
1 1 ' do-cif make-c-entry create &cif-func() token,
headers
: cif-func() ( -- adr ) &cif-func() token@ ;
headers
: (init-program) ( -- )
cif-64 \ 64-Bit IEEE 1275 Client Interface
init-c-stack \ Erase any previous C stack state
\ Zero all the general registers.
0w
0 to %g0 0 to %o0 0 to %l0 0 to %i0
0 to %g1 0 to %o1 0 to %l1 0 to %i1
0 to %g2 0 to %o2 0 to %l2 0 to %i2
0 to %g3 0 to %o3 0 to %l3 0 to %i3
0 to %g4 0 to %o4 0 to %l4 0 to %i4
0 to %g5 0 to %o5 0 to %l5 0 to %i5
0 to %g6 0 to %o6 0 to %l6 0 to %i6
0 to %g7 0 to %o7 0 to %l7 0 to %i7
cif-func() to %o4 \ IEEE 1275 Client Services Handler
%o6@ to %o6 \ C stack pointer
trap-table to %tba \ Set trap table
h# 0 to %y h# 4 to %fprs
h# 16 to %pstate h# 0d to %pil
7 to %cleanwin 0 to %otherwin
0 to %wstate 0 to %canrestore
6 to %cansave 0 to %cwp
h# 16 8 lshift to %tstate-c
load-base set-pc
[ifdef] SUN4V
\ Since we are initializing a stack, make sure we clear out previous saved
\ state indications. This affects ultra4v/savecpu.fth:restore-cpu-state,
\ which is invoked shortly after this.
0 to full-save?
[then]
sp@ saved-sp ! rp@ saved-rp ! \ Needed for later callbacks into Forth
state-valid on restartable? on
true to already-go?
[ifdef] Starcat?
RELEASE-SLAVE-INVALID release-slaves? l!
[then]
;
\ Allow dropin drivers to be standalone programs.
headers
tail-chain: execute-buffer ( adr len -- )
over adjust-elf32-header if ( adr,len entry )
(init-program) set-pc 2drop ( entry )
go
exit
then ( adr,len )
tail;
tail-chain: execute-buffer ( adr len -- )
over adjust-elf64-header if ( adr,len entry )
(init-program) set-pc 2drop ( entry )
go
exit
then ( adr,len )
tail;
tail-chain: execute-buffer ( adr len -- )
over 2 + unaligned-w@ h# 107 = if ( adr len )
over a.out-header /a.out-header move ( adr len )
2dup initsyms ( adr len )
drop /a.out-header + entry-adr ( src dest )
/text /data + move ( )
entry-adr /text /data + + /bss erase ( )
(init-program) entry-adr set-pc ( )
go \ XXX we need some way to get back!
exit
then
tail;
tail-chain: execute-buffer ( adr len -- )
over 2 + unaligned-w@ h# 107 = if ( adr len )
over >r ( adr len ) ( r: adr )
r@ a_entry l@ r@ a_text l@ r> a_data l@ or or
h# 9000.0000 tuck and = if ( adr len )
>r dup dup /a.out-header - r> move ( adr len )
(init-program) set-pc ( adr len )
go \ XXX we need some way to get back!
exit
then ( adr len )
then ( adr len )
tail;
cif: enter ( -- ) reenter call ;
cif: exit ( -- ) exittomon call ;
\ cif: chain ( len args entry size virt -- ) op-chain ;
headers
: init-program ( -- )
load-base file-size @ 'execute-buffer execute (init-program)
;