xref: /netbsd/sys/arch/m68k/060sp/netbsd060sp.S (revision 6550d01e)
1/*
2#
3# $NetBSD: netbsd060sp.S,v 1.7 2001/07/12 17:17:45 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# os.s
40#
41# This file contains:
42#	- example "Call-Out"s required by both the ISP and FPSP.
43#
44*/
45
46#include <machine/asm.h>
47
48#include "assym.h"
49
50/*
51#
52# make the copyright notice appear in the binary:
53#
54*/
55#include "copyright.S"
56
57/*
58#################################
59# EXAMPLE CALL-OUTS 		#
60# 				#
61# _060_dmem_write()		#
62# _060_dmem_read()		#
63# _060_imem_read()		#
64# _060_dmem_read_byte()		#
65# _060_dmem_read_word()		#
66# _060_dmem_read_long()		#
67# _060_imem_read_word()		#
68# _060_imem_read_long()		#
69# _060_dmem_write_byte()	#
70# _060_dmem_write_word()	#
71# _060_dmem_write_long()	#
72#				#
73# _060_real_trace()		#
74# _060_real_access()		#
75#################################
76*/
77
78/*
79#
80# Each IO routine checks to see if the memory write/read is to/from user
81# or supervisor application space. The examples below use simple "move"
82# instructions for supervisor mode applications and call _copyin()/_copyout()
83# for user mode applications.
84# When installing the 060SP, the _copyin()/_copyout() equivalents for a
85# given operating system should be substituted.
86#
87# The addresses within the 060SP are guaranteed to be on the stack.
88# The result is that Unix processes are allowed to sleep as a consequence
89# of a page fault during a _copyout.
90#
91*/
92
93/*
94#
95# _060_dmem_write():
96#
97# Writes to data memory while in supervisor mode.
98#
99# INPUTS:
100#	a0 - supervisor source address
101#	a1 - user destination address
102#	d0 - number of bytes to write
103# 	a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode
104# OUTPUTS:
105#	d1 - 0 = success, !0 = failure
106#
107*/
108ASENTRY_NOPROFILE(_060_dmem_write)
109	btst	#0x5,%a6@(0x4)	|# check for supervisor state
110	beqs	user_write
111super_write:
112	moveb	%a0@+,%a1@+	|# copy 1 byte
113	subql	#0x1,%d0	|# decr byte counter
114	bnes	super_write	|# quit if ctr = 0
115	clrl	%d1		|# return success
116	rts
117user_write:
118	movel	%d0,%sp@-	|# pass: counter
119	movel	%a1,%sp@-	|# pass: user dst
120	movel	%a0,%sp@-	|# pass: supervisor src
121	bsrl	_C_LABEL(copyout)	|# write byte to user mem
122	movel	%d0,%d1		|# return success
123	addl	#0xc,%sp	|# clear 3 lw params
124	rts
125
126/*
127#
128# _060_imem_read(), _060_dmem_read():
129#
130# Reads from data/instruction memory while in supervisor mode.
131#
132# INPUTS:
133#	a0 - user source address
134#	a1 - supervisor destination address
135#	d0 - number of bytes to read
136# 	a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode
137# OUTPUTS:
138#	d1 - 0 = success, !0 = failure
139#
140*/
141ASENTRY_NOPROFILE(_060_imem_read)
142ASENTRY_NOPROFILE(_060_dmem_read)
143	btst	#0x5,%a6@(0x4)	|# check for supervisor state
144	beqs	user_read
145super_read:
146	moveb	%a0@+,%a1@+	|# copy 1 byte
147	subql	#0x1,%d0	|# decr byte counter
148	bnes	super_read	|# quit if ctr = 0
149	clrl	%d1		|# return success
150	rts
151user_read:
152	movel	%d0,%sp@-	|# pass: counter
153	movel	%a1,%sp@-	|# pass: super dst
154	movel	%a0,%sp@-	|# pass: user src
155	bsrl	_C_LABEL(copyin)	|# read byte from user mem
156	movel	%d0,%d1		|# return success
157	addl	#0xc,%sp	|# clear 3 lw params
158	rts
159
160/*
161#
162# _060_dmem_read_byte():
163#
164# Read a data byte from user memory.
165#
166# INPUTS:
167#	a0 - user source address
168# 	a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode
169# OUTPUTS:
170#	d0 - data byte in d0
171#	d1 - 0 = success, !0 = failure
172#
173*/
174ASENTRY_NOPROFILE(_060_dmem_read_byte)
175	clrl	%d1			|# return success
176	clrl	%d0			|# clear whole longword
177	btst	#0x5,%a6@(0x4)		|# check for supervisor state
178	bnes	dmrbs			|# supervisor
179dmrbu:
180	movl	_C_LABEL(curpcb),%a1	| fault handler
181	movl	#Lferr,%a1@(PCB_ONFAULT)| set it
182	movsb	%a0@,%d0
183	bra	Lfdone
184
185dmrbs:
186	moveb	%a0@,%d0		|# fetch super byte
187	rts
188
189/*
190#
191# _060_imem_read_word():
192# Read an instruction word from user memory.
193#
194# _060_dmem_read_word():
195# Read a data word from user memory.
196#
197# INPUTS:
198#	a0 - user source address
199# 	a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode
200# OUTPUTS:
201#	d0 - data word in d0
202#	d1 - 0 = success, !0 = failure
203#
204*/
205ASENTRY_NOPROFILE(_060_imem_read_word)
206ASENTRY_NOPROFILE(_060_dmem_read_word)
207	clrl	%d1			|# return success
208	clrl	%d0			|# clear whole longword
209	btst	#0x5,%a6@(0x4)		|# check for supervisor state
210	bnes	dmrws			|# supervisor
211dmrwu:
212	movl	_C_LABEL(curpcb),%a1	| fault handler
213	movl	#Lferr,%a1@(PCB_ONFAULT)| set it
214	movsw	%a0@,%d0
215	bra	Lfdone
216dmrws:
217	movew	%a0@,%d0		|# fetch super word
218	rts
219
220/*
221#
222# _060_imem_read_long():
223# Read an instruction longword from user memory.
224#
225# _060_dmem_read_long():
226# Read an data longword from user memory.
227#
228#
229# INPUTS:
230#	a0 - user source address
231# 	a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode
232# OUTPUTS:
233#	d0 - data longword in d0
234#	d1 - 0 = success, !0 = failure
235#
236*/
237ASENTRY_NOPROFILE(_060_imem_read_long)
238ASENTRY_NOPROFILE(_060_dmem_read_long)
239	clrl	%d1			|# return success
240	btst	#0x5,%a6@(0x4)		|# check for supervisor state
241	bnes	dmrls			|# supervisor
242dmrlu:
243	movl	_C_LABEL(curpcb),%a1	| fault handler
244	movl	#Lferr,%a1@(PCB_ONFAULT)| set it
245	movsl	%a0@,%d0
246	bra	Lfdone
247dmrls:
248	movel	%a0@,%d0		|# fetch super longword
249	rts
250
251/*
252#
253# _060_dmem_write_byte():
254#
255# Write a data byte to user memory.
256#
257# INPUTS:
258#	a0 - user destination address
259# 	d0 - data byte in d0
260# 	a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode
261# OUTPUTS:
262#	d1 - 0 = success, !0 = failure
263#
264*/
265ASENTRY_NOPROFILE(_060_dmem_write_byte)
266	clrl	%d1			|# return success
267	btst	#0x5,%a6@(0x4)		|# check for supervisor state
268	bnes	dmwbs			|# supervisor
269dmwbu:
270	movl	_C_LABEL(curpcb),%a1	| fault handler
271	movl	#Lferr,%a1@(PCB_ONFAULT)| set it
272	movsb	%d0,%a0@
273	bra	Lfdone
274dmwbs:
275	moveb	%d0,%a0@		|# store super byte
276	rts
277
278/*
279#
280# _060_dmem_write_word():
281#
282# Write a data word to user memory.
283#
284# INPUTS:
285#	a0 - user destination address
286# 	d0 - data word in d0
287# 	a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode
288# OUTPUTS:
289#	d1 - 0 = success, !0 = failure
290#
291*/
292ASENTRY_NOPROFILE(_060_dmem_write_word)
293	clrl	%d1			|# return success
294	btst	#0x5,%a6@(0x4)		|# check for supervisor state
295	bnes	dmwws			|# supervisor
296dmwwu:
297	movl	_C_LABEL(curpcb),%a1	| fault handler
298	movl	#Lferr,%a1@(PCB_ONFAULT)| set it
299	movsw	%d0,%a0@
300	bra	Lfdone
301dmwws:
302	movew	%d0,%a0@		|# store super word
303	rts
304
305/*
306#
307# _060_dmem_write_long():
308#
309# Write a data longword to user memory.
310#
311# INPUTS:
312#	a0 - user destination address
313# 	d0 - data longword in d0
314# 	a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode
315# OUTPUTS:
316#	d1 - 0 = success, !0 = failure
317#
318*/
319ASENTRY_NOPROFILE(_060_dmem_write_long)
320	clrl	%d1			|# return success
321	btst	#0x5,%a6@(0x4)		|# check for supervisor state
322	bnes	dmwls			|# supervisor
323dmwlu:
324	movl	_C_LABEL(curpcb),%a1	| fault handler
325	movl	#Lferr,%a1@(PCB_ONFAULT)| set it
326	movsl	%d0,%a0@
327	bra	Lfdone
328dmwls:
329	movel	%d0,%a0@		|# store super longword
330	rts
331
332|############################################################################
333Lferr:
334	moveq	#-1,%d1
335Lfdone:
336	clrl	%a1@(PCB_ONFAULT)	| clear fault handler
337	rts
338
339|############################################################################
340
341/*
342#
343# _060_real_trace():
344#
345# This is the exit point for the 060FPSP when an instruction is being traced
346# and there are no other higher priority exceptions pending for this instruction
347# or they have already been processed.
348#
349# The sample code below simply executes an "rte".
350#
351*/
352ASENTRY_NOPROFILE(_060_real_trace)
353	jra	_C_LABEL(trace)
354
355/*
356#
357# _060_real_access():
358#
359# This is the exit point for the 060FPSP when an access error exception
360# is encountered. The routine below should point to the operating system
361# handler for access error exceptions. The exception stack frame is an
362# 8-word access error frame.
363#
364# We jump directly to the 68060 buserr handler.
365# If we had a sane ld, we could use use that entry point directly...
366#
367*/
368ASENTRY_NOPROFILE(_060_real_access)
369	jra	_C_LABEL(buserr60)
370
371#include "inetbsd.S"
372#include "fnetbsd.S"
373