18c2ecf20Sopenharmony_ci|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
28c2ecf20Sopenharmony_ci|MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
38c2ecf20Sopenharmony_ci|M68000 Hi-Performance Microprocessor Division
48c2ecf20Sopenharmony_ci|M68060 Software Package
58c2ecf20Sopenharmony_ci|Production Release P1.00 -- October 10, 1994
68c2ecf20Sopenharmony_ci|
78c2ecf20Sopenharmony_ci|M68060 Software Package Copyright © 1993, 1994 Motorola Inc.  All rights reserved.
88c2ecf20Sopenharmony_ci|
98c2ecf20Sopenharmony_ci|THE SOFTWARE is provided on an "AS IS" basis and without warranty.
108c2ecf20Sopenharmony_ci|To the maximum extent permitted by applicable law,
118c2ecf20Sopenharmony_ci|MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
128c2ecf20Sopenharmony_ci|INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
138c2ecf20Sopenharmony_ci|and any warranty against infringement with regard to the SOFTWARE
148c2ecf20Sopenharmony_ci|(INCLUDING ANY MODIFIED VERSIONS THEREOF) and any accompanying written materials.
158c2ecf20Sopenharmony_ci|
168c2ecf20Sopenharmony_ci|To the maximum extent permitted by applicable law,
178c2ecf20Sopenharmony_ci|IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
188c2ecf20Sopenharmony_ci|(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
198c2ecf20Sopenharmony_ci|BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS)
208c2ecf20Sopenharmony_ci|ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
218c2ecf20Sopenharmony_ci|Motorola assumes no responsibility for the maintenance and support of the SOFTWARE.
228c2ecf20Sopenharmony_ci|
238c2ecf20Sopenharmony_ci|You are hereby granted a copyright license to use, modify, and distribute the SOFTWARE
248c2ecf20Sopenharmony_ci|so long as this entire notice is retained without alteration in any modified and/or
258c2ecf20Sopenharmony_ci|redistributed versions, and that such modified versions are clearly identified as such.
268c2ecf20Sopenharmony_ci|No licenses are granted by implication, estoppel or otherwise under any patents
278c2ecf20Sopenharmony_ci|or trademarks of Motorola, Inc.
288c2ecf20Sopenharmony_ci|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
298c2ecf20Sopenharmony_ci| os.s
308c2ecf20Sopenharmony_ci|
318c2ecf20Sopenharmony_ci| This file contains:
328c2ecf20Sopenharmony_ci|	- example "Call-Out"s required by both the ISP and FPSP.
338c2ecf20Sopenharmony_ci|
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci#include <linux/linkage.h>
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci|################################
388c2ecf20Sopenharmony_ci| EXAMPLE CALL-OUTS		#
398c2ecf20Sopenharmony_ci|				#
408c2ecf20Sopenharmony_ci| _060_dmem_write()		#
418c2ecf20Sopenharmony_ci| _060_dmem_read()		#
428c2ecf20Sopenharmony_ci| _060_imem_read()		#
438c2ecf20Sopenharmony_ci| _060_dmem_read_byte()		#
448c2ecf20Sopenharmony_ci| _060_dmem_read_word()		#
458c2ecf20Sopenharmony_ci| _060_dmem_read_long()		#
468c2ecf20Sopenharmony_ci| _060_imem_read_word()		#
478c2ecf20Sopenharmony_ci| _060_imem_read_long()		#
488c2ecf20Sopenharmony_ci| _060_dmem_write_byte()	#
498c2ecf20Sopenharmony_ci| _060_dmem_write_word()	#
508c2ecf20Sopenharmony_ci| _060_dmem_write_long()	#
518c2ecf20Sopenharmony_ci|				#
528c2ecf20Sopenharmony_ci| _060_real_trace()		#
538c2ecf20Sopenharmony_ci| _060_real_access()		#
548c2ecf20Sopenharmony_ci|################################
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci|
578c2ecf20Sopenharmony_ci| Each IO routine checks to see if the memory write/read is to/from user
588c2ecf20Sopenharmony_ci| or supervisor application space. The examples below use simple "move"
598c2ecf20Sopenharmony_ci| instructions for supervisor mode applications and call _copyin()/_copyout()
608c2ecf20Sopenharmony_ci| for user mode applications.
618c2ecf20Sopenharmony_ci| When installing the 060SP, the _copyin()/_copyout() equivalents for a
628c2ecf20Sopenharmony_ci| given operating system should be substituted.
638c2ecf20Sopenharmony_ci|
648c2ecf20Sopenharmony_ci| The addresses within the 060SP are guaranteed to be on the stack.
658c2ecf20Sopenharmony_ci| The result is that Unix processes are allowed to sleep as a consequence
668c2ecf20Sopenharmony_ci| of a page fault during a _copyout.
678c2ecf20Sopenharmony_ci|
688c2ecf20Sopenharmony_ci| Linux/68k: The _060_[id]mem_{read,write}_{byte,word,long} functions
698c2ecf20Sopenharmony_ci| (i.e. all the known length <= 4) are implemented by single moves
708c2ecf20Sopenharmony_ci| statements instead of (more expensive) copy{in,out} calls, if
718c2ecf20Sopenharmony_ci| working in user space
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci|
748c2ecf20Sopenharmony_ci| _060_dmem_write():
758c2ecf20Sopenharmony_ci|
768c2ecf20Sopenharmony_ci| Writes to data memory while in supervisor mode.
778c2ecf20Sopenharmony_ci|
788c2ecf20Sopenharmony_ci| INPUTS:
798c2ecf20Sopenharmony_ci|	a0 - supervisor source address
808c2ecf20Sopenharmony_ci|	a1 - user destination address
818c2ecf20Sopenharmony_ci|	d0 - number of bytes to write
828c2ecf20Sopenharmony_ci|	0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
838c2ecf20Sopenharmony_ci| OUTPUTS:
848c2ecf20Sopenharmony_ci|	d1 - 0 = success, !0 = failure
858c2ecf20Sopenharmony_ci|
868c2ecf20Sopenharmony_ci	.global		_060_dmem_write
878c2ecf20Sopenharmony_ci_060_dmem_write:
888c2ecf20Sopenharmony_ci	subq.l		#1,%d0
898c2ecf20Sopenharmony_ci	btst		#0x5,0x4(%a6)		| check for supervisor state
908c2ecf20Sopenharmony_ci	beqs		user_write
918c2ecf20Sopenharmony_cisuper_write:
928c2ecf20Sopenharmony_ci	move.b		(%a0)+,(%a1)+		| copy 1 byte
938c2ecf20Sopenharmony_ci	dbra		%d0,super_write		| quit if --ctr < 0
948c2ecf20Sopenharmony_ci	clr.l		%d1			| return success
958c2ecf20Sopenharmony_ci	rts
968c2ecf20Sopenharmony_ciuser_write:
978c2ecf20Sopenharmony_ci	move.b		(%a0)+,%d1		| copy 1 byte
988c2ecf20Sopenharmony_cicopyoutae:
998c2ecf20Sopenharmony_ci	movs.b		%d1,(%a1)+
1008c2ecf20Sopenharmony_ci	dbra		%d0,user_write		| quit if --ctr < 0
1018c2ecf20Sopenharmony_ci	clr.l		%d1			| return success
1028c2ecf20Sopenharmony_ci	rts
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci|
1058c2ecf20Sopenharmony_ci| _060_imem_read(), _060_dmem_read():
1068c2ecf20Sopenharmony_ci|
1078c2ecf20Sopenharmony_ci| Reads from data/instruction memory while in supervisor mode.
1088c2ecf20Sopenharmony_ci|
1098c2ecf20Sopenharmony_ci| INPUTS:
1108c2ecf20Sopenharmony_ci|	a0 - user source address
1118c2ecf20Sopenharmony_ci|	a1 - supervisor destination address
1128c2ecf20Sopenharmony_ci|	d0 - number of bytes to read
1138c2ecf20Sopenharmony_ci|	0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
1148c2ecf20Sopenharmony_ci| OUTPUTS:
1158c2ecf20Sopenharmony_ci|	d1 - 0 = success, !0 = failure
1168c2ecf20Sopenharmony_ci|
1178c2ecf20Sopenharmony_ci	.global		_060_imem_read
1188c2ecf20Sopenharmony_ci	.global		_060_dmem_read
1198c2ecf20Sopenharmony_ci_060_imem_read:
1208c2ecf20Sopenharmony_ci_060_dmem_read:
1218c2ecf20Sopenharmony_ci	subq.l		#1,%d0
1228c2ecf20Sopenharmony_ci	btst		#0x5,0x4(%a6)		| check for supervisor state
1238c2ecf20Sopenharmony_ci	beqs		user_read
1248c2ecf20Sopenharmony_cisuper_read:
1258c2ecf20Sopenharmony_ci	move.b		(%a0)+,(%a1)+		| copy 1 byte
1268c2ecf20Sopenharmony_ci	dbra		%d0,super_read		| quit if --ctr < 0
1278c2ecf20Sopenharmony_ci	clr.l		%d1			| return success
1288c2ecf20Sopenharmony_ci	rts
1298c2ecf20Sopenharmony_ciuser_read:
1308c2ecf20Sopenharmony_cicopyinae:
1318c2ecf20Sopenharmony_ci	movs.b		(%a0)+,%d1
1328c2ecf20Sopenharmony_ci	move.b		%d1,(%a1)+		| copy 1 byte
1338c2ecf20Sopenharmony_ci	dbra		%d0,user_read		| quit if --ctr < 0
1348c2ecf20Sopenharmony_ci	clr.l		%d1			| return success
1358c2ecf20Sopenharmony_ci	rts
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci|
1388c2ecf20Sopenharmony_ci| _060_dmem_read_byte():
1398c2ecf20Sopenharmony_ci|
1408c2ecf20Sopenharmony_ci| Read a data byte from user memory.
1418c2ecf20Sopenharmony_ci|
1428c2ecf20Sopenharmony_ci| INPUTS:
1438c2ecf20Sopenharmony_ci|	a0 - user source address
1448c2ecf20Sopenharmony_ci|	0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
1458c2ecf20Sopenharmony_ci| OUTPUTS:
1468c2ecf20Sopenharmony_ci|	d0 - data byte in d0
1478c2ecf20Sopenharmony_ci|	d1 - 0 = success, !0 = failure
1488c2ecf20Sopenharmony_ci|
1498c2ecf20Sopenharmony_ci	.global		_060_dmem_read_byte
1508c2ecf20Sopenharmony_ci_060_dmem_read_byte:
1518c2ecf20Sopenharmony_ci	clr.l		%d0			| clear whole longword
1528c2ecf20Sopenharmony_ci	clr.l		%d1			| assume success
1538c2ecf20Sopenharmony_ci	btst		#0x5,0x4(%a6)		| check for supervisor state
1548c2ecf20Sopenharmony_ci	bnes		dmrbs			| supervisor
1558c2ecf20Sopenharmony_cidmrbuae:movs.b		(%a0),%d0		| fetch user byte
1568c2ecf20Sopenharmony_ci	rts
1578c2ecf20Sopenharmony_cidmrbs:	move.b		(%a0),%d0		| fetch super byte
1588c2ecf20Sopenharmony_ci	rts
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci|
1618c2ecf20Sopenharmony_ci| _060_dmem_read_word():
1628c2ecf20Sopenharmony_ci|
1638c2ecf20Sopenharmony_ci| Read a data word from user memory.
1648c2ecf20Sopenharmony_ci|
1658c2ecf20Sopenharmony_ci| INPUTS:
1668c2ecf20Sopenharmony_ci|	a0 - user source address
1678c2ecf20Sopenharmony_ci|	0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
1688c2ecf20Sopenharmony_ci| OUTPUTS:
1698c2ecf20Sopenharmony_ci|	d0 - data word in d0
1708c2ecf20Sopenharmony_ci|	d1 - 0 = success, !0 = failure
1718c2ecf20Sopenharmony_ci|
1728c2ecf20Sopenharmony_ci| _060_imem_read_word():
1738c2ecf20Sopenharmony_ci|
1748c2ecf20Sopenharmony_ci| Read an instruction word from user memory.
1758c2ecf20Sopenharmony_ci|
1768c2ecf20Sopenharmony_ci| INPUTS:
1778c2ecf20Sopenharmony_ci|	a0 - user source address
1788c2ecf20Sopenharmony_ci|	0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
1798c2ecf20Sopenharmony_ci| OUTPUTS:
1808c2ecf20Sopenharmony_ci|	d0 - instruction word in d0
1818c2ecf20Sopenharmony_ci|	d1 - 0 = success, !0 = failure
1828c2ecf20Sopenharmony_ci|
1838c2ecf20Sopenharmony_ci	.global		_060_dmem_read_word
1848c2ecf20Sopenharmony_ci	.global		_060_imem_read_word
1858c2ecf20Sopenharmony_ci_060_dmem_read_word:
1868c2ecf20Sopenharmony_ci_060_imem_read_word:
1878c2ecf20Sopenharmony_ci	clr.l		%d1			| assume success
1888c2ecf20Sopenharmony_ci	clr.l		%d0			| clear whole longword
1898c2ecf20Sopenharmony_ci	btst		#0x5,0x4(%a6)		| check for supervisor state
1908c2ecf20Sopenharmony_ci	bnes		dmrws			| supervisor
1918c2ecf20Sopenharmony_cidmrwuae:movs.w		(%a0), %d0		| fetch user word
1928c2ecf20Sopenharmony_ci	rts
1938c2ecf20Sopenharmony_cidmrws:	move.w		(%a0), %d0		| fetch super word
1948c2ecf20Sopenharmony_ci	rts
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci|
1978c2ecf20Sopenharmony_ci| _060_dmem_read_long():
1988c2ecf20Sopenharmony_ci|
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci|
2018c2ecf20Sopenharmony_ci| INPUTS:
2028c2ecf20Sopenharmony_ci|	a0 - user source address
2038c2ecf20Sopenharmony_ci|	0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
2048c2ecf20Sopenharmony_ci| OUTPUTS:
2058c2ecf20Sopenharmony_ci|	d0 - data longword in d0
2068c2ecf20Sopenharmony_ci|	d1 - 0 = success, !0 = failure
2078c2ecf20Sopenharmony_ci|
2088c2ecf20Sopenharmony_ci| _060_imem_read_long():
2098c2ecf20Sopenharmony_ci|
2108c2ecf20Sopenharmony_ci| Read an instruction longword from user memory.
2118c2ecf20Sopenharmony_ci|
2128c2ecf20Sopenharmony_ci| INPUTS:
2138c2ecf20Sopenharmony_ci|	a0 - user source address
2148c2ecf20Sopenharmony_ci|	0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
2158c2ecf20Sopenharmony_ci| OUTPUTS:
2168c2ecf20Sopenharmony_ci|	d0 - instruction longword in d0
2178c2ecf20Sopenharmony_ci|	d1 - 0 = success, !0 = failure
2188c2ecf20Sopenharmony_ci|
2198c2ecf20Sopenharmony_ci	.global		_060_dmem_read_long
2208c2ecf20Sopenharmony_ci	.global		_060_imem_read_long
2218c2ecf20Sopenharmony_ci_060_dmem_read_long:
2228c2ecf20Sopenharmony_ci_060_imem_read_long:
2238c2ecf20Sopenharmony_ci	clr.l		%d1			| assume success
2248c2ecf20Sopenharmony_ci	btst		#0x5,0x4(%a6)		| check for supervisor state
2258c2ecf20Sopenharmony_ci	bnes		dmrls			| supervisor
2268c2ecf20Sopenharmony_cidmrluae:movs.l		(%a0),%d0		| fetch user longword
2278c2ecf20Sopenharmony_ci	rts
2288c2ecf20Sopenharmony_cidmrls:	move.l		(%a0),%d0		| fetch super longword
2298c2ecf20Sopenharmony_ci	rts
2308c2ecf20Sopenharmony_ci
2318c2ecf20Sopenharmony_ci|
2328c2ecf20Sopenharmony_ci| _060_dmem_write_byte():
2338c2ecf20Sopenharmony_ci|
2348c2ecf20Sopenharmony_ci| Write a data byte to user memory.
2358c2ecf20Sopenharmony_ci|
2368c2ecf20Sopenharmony_ci| INPUTS:
2378c2ecf20Sopenharmony_ci|	a0 - user destination address
2388c2ecf20Sopenharmony_ci|	d0 - data byte in d0
2398c2ecf20Sopenharmony_ci|	0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
2408c2ecf20Sopenharmony_ci| OUTPUTS:
2418c2ecf20Sopenharmony_ci|	d1 - 0 = success, !0 = failure
2428c2ecf20Sopenharmony_ci|
2438c2ecf20Sopenharmony_ci	.global		_060_dmem_write_byte
2448c2ecf20Sopenharmony_ci_060_dmem_write_byte:
2458c2ecf20Sopenharmony_ci	clr.l		%d1			| assume success
2468c2ecf20Sopenharmony_ci	btst		#0x5,0x4(%a6)		| check for supervisor state
2478c2ecf20Sopenharmony_ci	bnes		dmwbs			| supervisor
2488c2ecf20Sopenharmony_cidmwbuae:movs.b		%d0,(%a0)		| store user byte
2498c2ecf20Sopenharmony_ci	rts
2508c2ecf20Sopenharmony_cidmwbs:	move.b		%d0,(%a0)		| store super byte
2518c2ecf20Sopenharmony_ci	rts
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci|
2548c2ecf20Sopenharmony_ci| _060_dmem_write_word():
2558c2ecf20Sopenharmony_ci|
2568c2ecf20Sopenharmony_ci| Write a data word to user memory.
2578c2ecf20Sopenharmony_ci|
2588c2ecf20Sopenharmony_ci| INPUTS:
2598c2ecf20Sopenharmony_ci|	a0 - user destination address
2608c2ecf20Sopenharmony_ci|	d0 - data word in d0
2618c2ecf20Sopenharmony_ci|	0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
2628c2ecf20Sopenharmony_ci| OUTPUTS:
2638c2ecf20Sopenharmony_ci|	d1 - 0 = success, !0 = failure
2648c2ecf20Sopenharmony_ci|
2658c2ecf20Sopenharmony_ci	.global		_060_dmem_write_word
2668c2ecf20Sopenharmony_ci_060_dmem_write_word:
2678c2ecf20Sopenharmony_ci	clr.l		%d1			| assume success
2688c2ecf20Sopenharmony_ci	btst		#0x5,0x4(%a6)		| check for supervisor state
2698c2ecf20Sopenharmony_ci	bnes		dmwws			| supervisor
2708c2ecf20Sopenharmony_cidmwwu:
2718c2ecf20Sopenharmony_cidmwwuae:movs.w		%d0,(%a0)		| store user word
2728c2ecf20Sopenharmony_ci	bras		dmwwr
2738c2ecf20Sopenharmony_cidmwws:	move.w		%d0,(%a0)		| store super word
2748c2ecf20Sopenharmony_cidmwwr:	clr.l		%d1			| return success
2758c2ecf20Sopenharmony_ci	rts
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci|
2788c2ecf20Sopenharmony_ci| _060_dmem_write_long():
2798c2ecf20Sopenharmony_ci|
2808c2ecf20Sopenharmony_ci| Write a data longword to user memory.
2818c2ecf20Sopenharmony_ci|
2828c2ecf20Sopenharmony_ci| INPUTS:
2838c2ecf20Sopenharmony_ci|	a0 - user destination address
2848c2ecf20Sopenharmony_ci|	d0 - data longword in d0
2858c2ecf20Sopenharmony_ci|	0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
2868c2ecf20Sopenharmony_ci| OUTPUTS:
2878c2ecf20Sopenharmony_ci|	d1 - 0 = success, !0 = failure
2888c2ecf20Sopenharmony_ci|
2898c2ecf20Sopenharmony_ci	.global		_060_dmem_write_long
2908c2ecf20Sopenharmony_ci_060_dmem_write_long:
2918c2ecf20Sopenharmony_ci	clr.l		%d1			| assume success
2928c2ecf20Sopenharmony_ci	btst		#0x5,0x4(%a6)		| check for supervisor state
2938c2ecf20Sopenharmony_ci	bnes		dmwls			| supervisor
2948c2ecf20Sopenharmony_cidmwluae:movs.l		%d0,(%a0)		| store user longword
2958c2ecf20Sopenharmony_ci	rts
2968c2ecf20Sopenharmony_cidmwls:	move.l		%d0,(%a0)		| store super longword
2978c2ecf20Sopenharmony_ci	rts
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_ci#if 0
3018c2ecf20Sopenharmony_ci|###############################################
3028c2ecf20Sopenharmony_ci
3038c2ecf20Sopenharmony_ci|
3048c2ecf20Sopenharmony_ci| Use these routines if your kernel doesn't have _copyout/_copyin equivalents.
3058c2ecf20Sopenharmony_ci| Assumes that D0/D1/A0/A1 are scratch registers. The _copyin/_copyout
3068c2ecf20Sopenharmony_ci| below assume that the SFC/DFC have been set previously.
3078c2ecf20Sopenharmony_ci|
3088c2ecf20Sopenharmony_ci| Linux/68k: These are basically non-inlined versions of
3098c2ecf20Sopenharmony_ci| memcpy_{to,from}fs, but without long-transfer optimization
3108c2ecf20Sopenharmony_ci| Note: Assumed that SFC/DFC are pointing correctly to user data
3118c2ecf20Sopenharmony_ci| space... Should be right, or are there any exceptions?
3128c2ecf20Sopenharmony_ci
3138c2ecf20Sopenharmony_ci|
3148c2ecf20Sopenharmony_ci| int _copyout(supervisor_addr, user_addr, nbytes)
3158c2ecf20Sopenharmony_ci|
3168c2ecf20Sopenharmony_ci	.global		_copyout
3178c2ecf20Sopenharmony_ci_copyout:
3188c2ecf20Sopenharmony_ci	move.l		4(%sp),%a0		| source
3198c2ecf20Sopenharmony_ci	move.l		8(%sp),%a1		| destination
3208c2ecf20Sopenharmony_ci	move.l		12(%sp),%d0		| count
3218c2ecf20Sopenharmony_ci	subq.l		#1,%d0
3228c2ecf20Sopenharmony_cimoreout:
3238c2ecf20Sopenharmony_ci	move.b		(%a0)+,%d1		| fetch supervisor byte
3248c2ecf20Sopenharmony_cicopyoutae:
3258c2ecf20Sopenharmony_ci	movs.b		%d1,(%a1)+		| store user byte
3268c2ecf20Sopenharmony_ci	dbra		%d0,moreout		| are we through yet?
3278c2ecf20Sopenharmony_ci	moveq		#0,%d0			| return success
3288c2ecf20Sopenharmony_ci	rts
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ci|
3318c2ecf20Sopenharmony_ci| int _copyin(user_addr, supervisor_addr, nbytes)
3328c2ecf20Sopenharmony_ci|
3338c2ecf20Sopenharmony_ci	.global		_copyin
3348c2ecf20Sopenharmony_ci_copyin:
3358c2ecf20Sopenharmony_ci	move.l		4(%sp),%a0		| source
3368c2ecf20Sopenharmony_ci	move.l		8(%sp),%a1		| destination
3378c2ecf20Sopenharmony_ci	move.l		12(%sp),%d0		| count
3388c2ecf20Sopenharmony_ci    subq.l      #1,%d0
3398c2ecf20Sopenharmony_cimorein:
3408c2ecf20Sopenharmony_cicopyinae:
3418c2ecf20Sopenharmony_ci	movs.b		(%a0)+,%d1		| fetch user byte
3428c2ecf20Sopenharmony_ci	move.b		%d1,(%a1)+		| write supervisor byte
3438c2ecf20Sopenharmony_ci	dbra		%d0,morein		| are we through yet?
3448c2ecf20Sopenharmony_ci	moveq		#0,%d0			| return success
3458c2ecf20Sopenharmony_ci	rts
3468c2ecf20Sopenharmony_ci#endif
3478c2ecf20Sopenharmony_ci
3488c2ecf20Sopenharmony_ci|###########################################################################
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_ci|
3518c2ecf20Sopenharmony_ci| _060_real_trace():
3528c2ecf20Sopenharmony_ci|
3538c2ecf20Sopenharmony_ci| This is the exit point for the 060FPSP when an instruction is being traced
3548c2ecf20Sopenharmony_ci| and there are no other higher priority exceptions pending for this instruction
3558c2ecf20Sopenharmony_ci| or they have already been processed.
3568c2ecf20Sopenharmony_ci|
3578c2ecf20Sopenharmony_ci| The sample code below simply executes an "rte".
3588c2ecf20Sopenharmony_ci|
3598c2ecf20Sopenharmony_ci	.global		_060_real_trace
3608c2ecf20Sopenharmony_ci_060_real_trace:
3618c2ecf20Sopenharmony_ci	bral	trap
3628c2ecf20Sopenharmony_ci
3638c2ecf20Sopenharmony_ci|
3648c2ecf20Sopenharmony_ci| _060_real_access():
3658c2ecf20Sopenharmony_ci|
3668c2ecf20Sopenharmony_ci| This is the exit point for the 060FPSP when an access error exception
3678c2ecf20Sopenharmony_ci| is encountered. The routine below should point to the operating system
3688c2ecf20Sopenharmony_ci| handler for access error exceptions. The exception stack frame is an
3698c2ecf20Sopenharmony_ci| 8-word access error frame.
3708c2ecf20Sopenharmony_ci|
3718c2ecf20Sopenharmony_ci| The sample routine below simply executes an "rte" instruction which
3728c2ecf20Sopenharmony_ci| is most likely the incorrect thing to do and could put the system
3738c2ecf20Sopenharmony_ci| into an infinite loop.
3748c2ecf20Sopenharmony_ci|
3758c2ecf20Sopenharmony_ci	.global		_060_real_access
3768c2ecf20Sopenharmony_ci_060_real_access:
3778c2ecf20Sopenharmony_ci	bral	buserr
3788c2ecf20Sopenharmony_ci
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci
3818c2ecf20Sopenharmony_ci| Execption handling for movs access to illegal memory
3828c2ecf20Sopenharmony_ci	.section .fixup,"ax"
3838c2ecf20Sopenharmony_ci	.even
3848c2ecf20Sopenharmony_ci1:	moveq		#-1,%d1
3858c2ecf20Sopenharmony_ci	rts
3868c2ecf20Sopenharmony_ci.section __ex_table,"a"
3878c2ecf20Sopenharmony_ci	.align 4
3888c2ecf20Sopenharmony_ci	.long	dmrbuae,1b
3898c2ecf20Sopenharmony_ci	.long	dmrwuae,1b
3908c2ecf20Sopenharmony_ci	.long	dmrluae,1b
3918c2ecf20Sopenharmony_ci	.long	dmwbuae,1b
3928c2ecf20Sopenharmony_ci	.long	dmwwuae,1b
3938c2ecf20Sopenharmony_ci	.long	dmwluae,1b
3948c2ecf20Sopenharmony_ci	.long	copyoutae,1b
3958c2ecf20Sopenharmony_ci	.long	copyinae,1b
3968c2ecf20Sopenharmony_ci	.text
397