Home | History | Annotate | Line # | Download | only in 060sp
      1 /*
      2 #
      3 # $NetBSD: inetbsd.S,v 1.5 2024/05/13 00:10:06 msaitoh Exp $
      4 #
      5 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      6 # MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
      7 # M68000 Hi-Performance Microprocessor Division
      8 # M68060 Software Package Production Release
      9 #
     10 # M68060 Software Package Copyright (C) 1993, 1994, 1995, 1996 Motorola Inc.
     11 # All rights reserved.
     12 #
     13 # THE SOFTWARE is provided on an "AS IS" basis and without warranty.
     14 # To the maximum extent permitted by applicable law,
     15 # MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
     16 # INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS
     17 # FOR A PARTICULAR PURPOSE and any warranty against infringement with
     18 # regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
     19 # and any accompanying written materials.
     20 #
     21 # To the maximum extent permitted by applicable law,
     22 # IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
     23 # (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
     24 # BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS)
     25 # ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
     26 #
     27 # Motorola assumes no responsibility for the maintenance and support
     28 # of the SOFTWARE.
     29 #
     30 # You are hereby granted a copyright license to use, modify, and distribute the
     31 # SOFTWARE so long as this entire notice is retained without alteration
     32 # in any modified and/or redistributed versions, and that such modified
     33 # versions are clearly identified as such.
     34 # No licenses are granted by implication, estoppel or otherwise under any
     35 # patents or trademarks of Motorola, Inc.
     36 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     37 # Derived from:
     38 # iskeleton.s
     39 #
     40 # This file contains:
     41 #	(1) example "Call-out"s
     42 #	(2) example package entry code
     43 #	(3) example "Call-out" table
     44 #
     45 
     46 
     47 #################################
     48 # (1) EXAMPLE CALL-OUTS 	#
     49 #				#
     50 # _060_isp_done()		#
     51 # _060_real_chk()		#
     52 # _060_real_divbyzero()		#
     53 #				#
     54 # _060_real_cas()		#
     55 # _060_real_cas2()		#
     56 # _060_real_lock_page()		#
     57 # _060_real_unlock_page()	#
     58 #################################
     59 */
     60 
     61 /*
     62 #
     63 # _060_isp_done():
     64 #
     65 # This is and example main exit point for the Unimplemented Integer
     66 # Instruction exception handler. For a normal exit, the
     67 # _isp_unimp() branches to here so that the operating system
     68 # can do any clean-up desired. The stack frame is the
     69 # Unimplemented Integer Instruction stack frame with
     70 # the PC pointing to the instruction following the instruction
     71 # just emulated.
     72 # To simply continue execution at the next instruction, just
     73 # do an "rte".
     74 #
     75 */
     76 ASENTRY_NOPROFILE(_060_isp_done)
     77 	rte
     78 
     79 /*
     80 #
     81 # _060_real_chk():
     82 #
     83 # This is an alternate exit point for the Unimplemented Integer
     84 # Instruction exception handler. If the instruction was a "chk2"
     85 # and the operand was out of bounds, then _isp_unimp() creates
     86 # a CHK exception stack frame from the Unimplemented Integer Instruction
     87 # stack frame and branches to this routine.
     88 #
     89 */
     90 ASENTRY_NOPROFILE(_060_real_chk)
     91 	tstb	%sp@			|# is tracing enabled?
     92 	bpls	real_chk_end		|# no
     93 
     94 /*
     95 #
     96 #	    CHK FRAME		   TRACE FRAME
     97 #	*****************	*****************
     98 #	*   Current PC	*	*   Current PC	*
     99 #	*****************	*****************
    100 #	* 0x2 *  0x018	*	* 0x2 *  0x024	*
    101 #	*****************	*****************
    102 #	*     Next	*	*     Next	*
    103 #	*      PC	*	*      PC	*
    104 #	*****************	*****************
    105 #	*      SR	*	*      SR	*
    106 #	*****************	*****************
    107 #
    108 */
    109 	moveb	#0x24,%sp@(0x7)		|# set trace vecno
    110 	bral	_ASM_LABEL(_060_real_trace)
    111 
    112 real_chk_end:
    113 	jmp	_C_LABEL(chkinst)
    114 
    115 /*
    116 #
    117 # _060_real_divbyzero:
    118 #
    119 # This is an alternate exit point for the Unimplemented Integer
    120 # Instruction exception handler isp_unimp(). If the instruction is a 64-bit
    121 # integer divide where the source operand is a zero, then the _isp_unimp()
    122 # creates a Divide-by-zero exception stack frame from the Unimplemented
    123 # Integer Instruction stack frame and branches to this routine.
    124 #
    125 # Remember that a trace exception may be pending. The code below performs
    126 # no action associated with the "chk" exception. If tracing is enabled,
    127 # then it create a Trace exception stack frame from the "chk" exception
    128 # stack frame and branches to the _real_trace() entry point.
    129 #
    130 */
    131 ASENTRY_NOPROFILE(_060_real_divbyzero)
    132 	tstb	%sp@			|# is tracing enabled?
    133 	bpls	real_divbyzero_end	|# no
    134 
    135 /*
    136 #
    137 #	 DIVBYZERO FRAME	   TRACE FRAME
    138 #	*****************	*****************
    139 #	*   Current PC	*	*   Current PC	*
    140 #	*****************	*****************
    141 #	* 0x2 *  0x014	*	* 0x2 *  0x024	*
    142 #	*****************	*****************
    143 #	*     Next	*	*     Next	*
    144 #	*      PC	*	*      PC	*
    145 #	*****************	*****************
    146 #	*      SR	*	*      SR	*
    147 #	*****************	*****************
    148 #
    149 */
    150 	moveb	#0x24,%sp@(0x7)		|# set trace vecno
    151 	bral	_ASM_LABEL(_060_real_trace)
    152 
    153 real_divbyzero_end:
    154 	jmp	_C_LABEL(zerodiv)
    155 
    156 |###########################
    157 
    158 /*
    159 #
    160 # _060_real_cas():
    161 #
    162 # Entry point for the selected cas emulation code implementation.
    163 # If the implementation provided by the 68060ISP is sufficient,
    164 # then this routine simply re-enters the package through _isp_cas.
    165 #
    166 */
    167 ASENTRY_NOPROFILE(_060_real_cas)
    168 	bral	_C_LABEL(I_CALL_TOP)+0x80+0x08
    169 
    170 /*
    171 #
    172 # _060_real_cas2():
    173 #
    174 # Entry point for the selected cas2 emulation code implementation.
    175 # If the implementation provided by the 68060ISP is sufficient,
    176 # then this routine simply re-enters the package through _isp_cas2.
    177 #
    178 */
    179 ASENTRY_NOPROFILE(_060_real_cas2)
    180 	bral	_C_LABEL(I_CALL_TOP)+0x80+0x10
    181 
    182 /*
    183 #
    184 # _060_lock_page():
    185 #
    186 # Entry point for the operating system's routine to "lock" a page
    187 # from being paged out. This routine is needed by the cas/cas2
    188 # algorithms so that no page faults occur within the "core" code
    189 # region. Note: the routine must lock two pages if the operand
    190 # spans two pages.
    191 # NOTE: THE ROUTINE SHOULD RETURN AN FSLW VALUE IN D0 ON FAILURE
    192 # SO THAT THE 060SP CAN CREATE A PROPER ACCESS ERROR FRAME.
    193 # Arguments:
    194 #	a0 = operand address
    195 #	d0 = `xxxxxxff -> supervisor| `xxxxxx00 -> user
    196 #	d1 = `xxxxxxff -> longword| `xxxxxx00 -> word
    197 # Expected outputs:
    198 #	d0 = 0 -> success| non-zero -> failure
    199 #
    200 */
    201 ASENTRY_NOPROFILE(_060_real_lock_page)
    202 	clrl	%d0
    203 	rts
    204 
    205 /*
    206 #
    207 # _060_unlock_page():
    208 #
    209 # Entry point for the operating system's routine to "unlock" a
    210 # page that has been "locked" previously with _real_lock_page.
    211 # Note: the routine must unlock two pages if the operand spans
    212 # two pages.
    213 # Arguments:
    214 # 	a0 = operand address
    215 #	d0 = `xxxxxxff -> supervisor| `xxxxxx00 -> user
    216 #	d1 = `xxxxxxff -> longword| `xxxxxx00 -> word
    217 #
    218 */
    219 ASENTRY_NOPROFILE(_060_real_unlock_page)
    220 	clrl	%d0
    221 	rts
    222 
    223 |############################################################################
    224 /*
    225 ##################################
    226 # (2) EXAMPLE PACKAGE ENTRY CODE #
    227 ##################################
    228 */
    229 
    230 ASENTRY_NOPROFILE(_060_isp_unimp)
    231 	bral	_C_LABEL(I_CALL_TOP)+0x80+0x00
    232 
    233 ASENTRY_NOPROFILE(_060_isp_cas)
    234 	bral	_C_LABEL(I_CALL_TOP)+0x80+0x08
    235 
    236 ASENTRY_NOPROFILE(_060_isp_cas2)
    237 	bral	_C_LABEL(I_CALL_TOP)+0x80+0x10
    238 
    239 ASENTRY_NOPROFILE(_060_isp_cas_finish)
    240 	bral	_C_LABEL(I_CALL_TOP)+0x80+0x18
    241 
    242 ASENTRY_NOPROFILE(_060_isp_cas2_finish)
    243 	bral	_C_LABEL(I_CALL_TOP)+0x80+0x20
    244 
    245 ASENTRY_NOPROFILE(_060_isp_cas_inrange)
    246 	bral	_C_LABEL(I_CALL_TOP)+0x80+0x28
    247 
    248 ASENTRY_NOPROFILE(_060_isp_cas_terminate)
    249 	bral	_C_LABEL(I_CALL_TOP)+0x80+0x30
    250 
    251 ASENTRY_NOPROFILE(_060_isp_cas_restart)
    252 	bral	_C_LABEL(I_CALL_TOP)+0x80+0x38
    253 
    254 |############################################################################
    255 
    256 /*
    257 ################################
    258 # (3) EXAMPLE CALL-OUT SECTION #
    259 ################################
    260 
    261 # The size of this section MUST be 128 bytes!!!
    262 */
    263 
    264 GLOBAL(I_CALL_TOP)
    265 	.long	_ASM_LABEL(_060_real_chk)-_C_LABEL(I_CALL_TOP)
    266 	.long	_ASM_LABEL(_060_real_divbyzero)-_C_LABEL(I_CALL_TOP)
    267 	.long	_ASM_LABEL(_060_real_trace)-_C_LABEL(I_CALL_TOP)
    268 	.long	_ASM_LABEL(_060_real_access)-_C_LABEL(I_CALL_TOP)
    269 	.long	_ASM_LABEL(_060_isp_done)-_C_LABEL(I_CALL_TOP)
    270 
    271 	.long	_ASM_LABEL(_060_real_cas)-_C_LABEL(I_CALL_TOP)
    272 	.long	_ASM_LABEL(_060_real_cas2)-_C_LABEL(I_CALL_TOP)
    273 	.long	_ASM_LABEL(_060_real_lock_page)-_C_LABEL(I_CALL_TOP)
    274 	.long	_ASM_LABEL(_060_real_unlock_page)-_C_LABEL(I_CALL_TOP)
    275 
    276 	.long	0x00000000,0x00000000,0x00000000,0x00000000
    277 	.long	0x00000000,0x00000000,0x00000000
    278 
    279 	.long	_ASM_LABEL(_060_imem_read)-_C_LABEL(I_CALL_TOP)
    280 	.long	_ASM_LABEL(_060_dmem_read)-_C_LABEL(I_CALL_TOP)
    281 	.long	_ASM_LABEL(_060_dmem_write)-_C_LABEL(I_CALL_TOP)
    282 	.long	_ASM_LABEL(_060_imem_read_word)-_C_LABEL(I_CALL_TOP)
    283 	.long	_ASM_LABEL(_060_imem_read_long)-_C_LABEL(I_CALL_TOP)
    284 	.long	_ASM_LABEL(_060_dmem_read_byte)-_C_LABEL(I_CALL_TOP)
    285 	.long	_ASM_LABEL(_060_dmem_read_word)-_C_LABEL(I_CALL_TOP)
    286 	.long	_ASM_LABEL(_060_dmem_read_long)-_C_LABEL(I_CALL_TOP)
    287 	.long	_ASM_LABEL(_060_dmem_write_byte)-_C_LABEL(I_CALL_TOP)
    288 	.long	_ASM_LABEL(_060_dmem_write_word)-_C_LABEL(I_CALL_TOP)
    289 	.long	_ASM_LABEL(_060_dmem_write_long)-_C_LABEL(I_CALL_TOP)
    290 
    291 	.long	0x00000000
    292 	.long	0x00000000,0x00000000,0x00000000,0x00000000
    293 
    294 /*
    295 ############################################################################
    296 
    297 # 060 INTEGER KERNEL PACKAGE MUST GO HERE!!!
    298 */
    299 
    300 #include "isp.S"
    301