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