xref: /netbsd/sys/arch/m68k/060sp/fnetbsd.S (revision bf9ec67e)
1/*
2#
3# $NetBSD: fnetbsd.S,v 1.5 2000/11/30 21:00:51 scw 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#
38# Derived from:
39# fskeleton.s
40#
41# This file contains:
42#	(1) example "Call-out"s
43#	(2) example package entry code
44#	(3) example "Call-out" table
45#
46
47
48#################################
49# (1) EXAMPLE CALL-OUTS		#
50#				#
51# _060_fpsp_done()		#
52# _060_real_ovfl()		#
53# _060_real_unfl()		#
54# _060_real_operr()		#
55# _060_real_snan()		#
56# _060_real_dz()		#
57# _060_real_inex()		#
58# _060_real_bsun()		#
59# _060_real_fline()		#
60# _060_real_fpu_disabled()	#
61# _060_real_trap()		#
62#################################
63*/
64
65/*
66#
67# _060_fpsp_done():
68#
69# This is the main exit point for the 68060 Floating-Point
70# Software Package. For a normal exit, all 060FPSP routines call this
71# routine. The operating system can do system dependent clean-up or
72# simply execute an "rte" as with the sample code below.
73#
74*/
75ASENTRY_NOPROFILE(_060_fpsp_done)
76	rte
77
78/*
79#
80# _060_real_ovfl():
81#
82# This is the exit point for the 060FPSP when an enabled overflow exception
83# is present. The routine below should point to the operating system handler
84# for enabled overflow conditions. The exception stack frame is an overflow
85# stack frame. The FP state frame holds the EXCEPTIONAL OPERAND.
86#
87# The sample routine below simply clears the exception status bit and
88# does an "rte".
89#
90*/
91ASENTRY_NOPROFILE(_060_real_ovfl)
92	fsave	%sp@-
93	movew	#0x6000,%sp@(0x2)
94	frestore	%sp@+
95	jmp	_C_LABEL(fpfault)
96
97/*
98#
99# _060_real_unfl():
100#
101# This is the exit point for the 060FPSP when an enabled underflow exception
102# is present. The routine below should point to the operating system handler
103# for enabled underflow conditions. The exception stack frame is an underflow
104# stack frame. The FP state frame holds the EXCEPTIONAL OPERAND.
105#
106# The sample routine below simply clears the exception status bit and
107# does an "rte".
108#
109*/
110ASENTRY_NOPROFILE(_060_real_unfl)
111	fsave	%sp@-
112	movew	#0x6000,%sp@(0x2)
113	frestore	%sp@+
114	jmp	_C_LABEL(fpfault)
115
116/*
117#
118# _060_real_operr():
119#
120# This is the exit point for the 060FPSP when an enabled operand error exception
121# is present. The routine below should point to the operating system handler
122# for enabled operand error exceptions. The exception stack frame is an operand error
123# stack frame. The FP state frame holds the source operand of the faulting
124# instruction.
125#
126# The sample routine below simply clears the exception status bit and
127# does an "rte".
128#
129*/
130ASENTRY_NOPROFILE(_060_real_operr)
131	fsave	%sp@-
132	movew	#0x6000,%sp@(0x2)
133	frestore	%sp@+
134	jmp	_C_LABEL(fpfault)
135
136/*
137#
138# _060_real_snan():
139#
140# This is the exit point for the 060FPSP when an enabled signalling NaN exception
141# is present. The routine below should point to the operating system handler
142# for enabled signalling NaN exceptions. The exception stack frame is a signalling NaN
143# stack frame. The FP state frame holds the source operand of the faulting
144# instruction.
145#
146# The sample routine below simply clears the exception status bit and
147# does an "rte".
148#
149*/
150ASENTRY_NOPROFILE(_060_real_snan)
151	fsave	%sp@-
152	movew	#0x6000,%sp@(0x2)
153	frestore	%sp@+
154	jmp	_C_LABEL(fpfault)
155
156/*
157#
158# _060_real_dz():
159#
160# This is the exit point for the 060FPSP when an enabled divide-by-zero exception
161# is present. The routine below should point to the operating system handler
162# for enabled divide-by-zero exceptions. The exception stack frame is a divide-by-zero
163# stack frame. The FP state frame holds the source operand of the faulting
164# instruction.
165#
166# The sample routine below simply clears the exception status bit and
167# does an "rte".
168#
169*/
170ASENTRY_NOPROFILE(_060_real_dz)
171	fsave	%sp@-
172	movew	#0x6000,%sp@(0x2)
173	frestore	%sp@+
174	jmp	_C_LABEL(fpfault)
175
176/*
177#
178# _060_real_inex():
179#
180# This is the exit point for the 060FPSP when an enabled inexact exception
181# is present. The routine below should point to the operating system handler
182# for enabled inexact exceptions. The exception stack frame is an inexact
183# stack frame. The FP state frame holds the source operand of the faulting
184# instruction.
185#
186# The sample routine below simply clears the exception status bit and
187# does an "rte".
188#
189*/
190ASENTRY_NOPROFILE(_060_real_inex)
191	fsave	%sp@-
192	movew	#0x6000,%sp@(0x2)
193	frestore	%sp@+
194	jmp	_C_LABEL(fpfault)
195
196/*
197#
198# _060_real_bsun():
199#
200# This is the exit point for the 060FPSP when an enabled bsun exception
201# is present. The routine below should point to the operating system handler
202# for enabled bsun exceptions. The exception stack frame is a bsun
203# stack frame.
204#
205# The sample routine below clears the exception status bit, clears the NaN
206# bit in the FPSR, and does an "rte". The instruction that caused the
207# bsun will now be re-executed but with the NaN FPSR bit cleared.
208#
209*/
210ASENTRY_NOPROFILE(_060_real_bsun)
211	fsave	%sp@-
212
213	fmovel	%fpsr,%sp@-
214	andib	#0xfe,%sp@
215	fmovel	%sp@+,%fpsr
216
217	addl	#0xc,%sp
218	jmp	_C_LABEL(fpfault)
219
220/*
221#
222# _060_real_fline():
223#
224# This is the exit point for the 060FPSP when an F-Line Illegal exception is
225# encountered. Three different types of exceptions can enter the F-Line exception
226# vector number 11: FP Unimplemented Instructions, FP implemented instructions when
227# the FPU is disabled, and F-Line Illegal instructions. The 060FPSP module
228# _fpsp_fline() distinguishes between the three and acts appropriately. F-Line
229# Illegals branch here.
230#
231*/
232ASENTRY_NOPROFILE(_060_real_fline)
233	jmp	_C_LABEL(fpfault)
234
235/*
236#
237# _060_real_fpu_disabled():
238#
239# This is the exit point for the 060FPSP when an FPU disabled exception is
240# encountered. Three different types of exceptions can enter the F-Line exception
241# vector number 11: FP Unimplemented Instructions, FP implemented instructions when
242# the FPU is disabled, and F-Line Illegal instructions. The 060FPSP module
243# _fpsp_fline() distinguishes between the three and acts appropriately. FPU disabled
244# exceptions branch here.
245#
246# The sample code below enables the FPU, sets the PC field in the exception stack
247# frame to the PC of the instruction causing the exception, and does an "rte".
248# The execution of the instruction then proceeds with an enabled floating-point
249# unit.
250#
251*/
252ASENTRY_NOPROFILE(_060_real_fpu_disabled)
253	movel	%d0,%sp@-		|# enabled the fpu
254
255	.short	0x4e7a,0x0808		|* movec.l pcr,d0
256	bclr	#0x1,%d0
257	.short	0x4e7b,0x0808		|* movec.l d0,pcr
258	movel	%sp@+,%d0
259
260	movel	%sp@(0xc),%sp@(0x2)	|# set "Current PC"
261	rte
262
263/*
264#
265# _060_real_trap():
266#
267# This is the exit point for the 060FPSP when an emulated "ftrapcc" instruction
268# discovers that the trap condition is true and it should branch to the operating
269# system handler for the trap exception vector number 7.
270#
271# The sample code below simply executes an "rte".
272#
273*/
274ASENTRY_NOPROFILE(_060_real_trap)
275	rte
276
277/*
278#############################################################################
279
280##################################
281# (2) EXAMPLE PACKAGE ENTRY CODE #
282##################################
283*/
284ASENTRY_NOPROFILE(_060_fpsp_snan)
285	bral	_C_LABEL(FP_CALL_TOP)+0x80+0x00
286
287ASENTRY_NOPROFILE(_060_fpsp_operr)
288	bral	_C_LABEL(FP_CALL_TOP)+0x80+0x08
289
290ASENTRY_NOPROFILE(_060_fpsp_ovfl)
291	bral	_C_LABEL(FP_CALL_TOP)+0x80+0x10
292
293ASENTRY_NOPROFILE(_060_fpsp_unfl)
294	bral	_C_LABEL(FP_CALL_TOP)+0x80+0x18
295
296ASENTRY_NOPROFILE(_060_fpsp_dz)
297	bral	_C_LABEL(FP_CALL_TOP)+0x80+0x20
298
299ASENTRY_NOPROFILE(_060_fpsp_inex)
300	bral	_C_LABEL(FP_CALL_TOP)+0x80+0x28
301
302ASENTRY_NOPROFILE(_060_fpsp_fline)
303	bral	_C_LABEL(FP_CALL_TOP)+0x80+0x30
304
305ASENTRY_NOPROFILE(_060_fpsp_unsupp)
306	bral	_C_LABEL(FP_CALL_TOP)+0x80+0x38
307
308ASENTRY_NOPROFILE(_060_fpsp_effadd)
309	bral	_C_LABEL(FP_CALL_TOP)+0x80+0x40
310
311/*
312#############################################################################
313
314################################
315# (3) EXAMPLE CALL-OUT SECTION #
316################################
317
318# The size of this section MUST be 128 bytes!!!
319*/
320GLOBAL(FP_CALL_TOP)
321	.long	_ASM_LABEL(_060_real_bsun)-_C_LABEL(FP_CALL_TOP)
322	.long	_ASM_LABEL(_060_real_snan)-_C_LABEL(FP_CALL_TOP)
323	.long	_ASM_LABEL(_060_real_operr)-_C_LABEL(FP_CALL_TOP)
324	.long	_ASM_LABEL(_060_real_ovfl)-_C_LABEL(FP_CALL_TOP)
325	.long	_ASM_LABEL(_060_real_unfl)-_C_LABEL(FP_CALL_TOP)
326	.long	_ASM_LABEL(_060_real_dz)-_C_LABEL(FP_CALL_TOP)
327	.long	_ASM_LABEL(_060_real_inex)-_C_LABEL(FP_CALL_TOP)
328	.long	_ASM_LABEL(_060_real_fline)-_C_LABEL(FP_CALL_TOP)
329	.long	_ASM_LABEL(_060_real_fpu_disabled)-_C_LABEL(FP_CALL_TOP)
330	.long	_ASM_LABEL(_060_real_trap)-_C_LABEL(FP_CALL_TOP)
331	.long	_ASM_LABEL(_060_real_trace)-_C_LABEL(FP_CALL_TOP)
332	.long	_ASM_LABEL(_060_real_access)-_C_LABEL(FP_CALL_TOP)
333	.long	_ASM_LABEL(_060_fpsp_done)-_C_LABEL(FP_CALL_TOP)
334
335	.long	0x00000000,0x00000000,0x00000000
336
337	.long	_ASM_LABEL(_060_imem_read)-_C_LABEL(FP_CALL_TOP)
338	.long	_ASM_LABEL(_060_dmem_read)-_C_LABEL(FP_CALL_TOP)
339	.long	_ASM_LABEL(_060_dmem_write)-_C_LABEL(FP_CALL_TOP)
340	.long	_ASM_LABEL(_060_imem_read_word)-_C_LABEL(FP_CALL_TOP)
341	.long	_ASM_LABEL(_060_imem_read_long)-_C_LABEL(FP_CALL_TOP)
342	.long	_ASM_LABEL(_060_dmem_read_byte)-_C_LABEL(FP_CALL_TOP)
343	.long	_ASM_LABEL(_060_dmem_read_word)-_C_LABEL(FP_CALL_TOP)
344	.long	_ASM_LABEL(_060_dmem_read_long)-_C_LABEL(FP_CALL_TOP)
345	.long	_ASM_LABEL(_060_dmem_write_byte)-_C_LABEL(FP_CALL_TOP)
346	.long	_ASM_LABEL(_060_dmem_write_word)-_C_LABEL(FP_CALL_TOP)
347	.long	_ASM_LABEL(_060_dmem_write_long)-_C_LABEL(FP_CALL_TOP)
348
349	.long	0x00000000
350
351	.long	0x00000000,0x00000000,0x00000000,0x00000000
352
353/*
354#############################################################################
355
356# 060 FPSP KERNEL PACKAGE NEEDS TO GO HERE!!!
357*/
358
359#include "fpsp.S"
360