162306a36Sopenharmony_ci|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 262306a36Sopenharmony_ci|MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP 362306a36Sopenharmony_ci|M68000 Hi-Performance Microprocessor Division 462306a36Sopenharmony_ci|M68060 Software Package 562306a36Sopenharmony_ci|Production Release P1.00 -- October 10, 1994 662306a36Sopenharmony_ci| 762306a36Sopenharmony_ci|M68060 Software Package Copyright © 1993, 1994 Motorola Inc. All rights reserved. 862306a36Sopenharmony_ci| 962306a36Sopenharmony_ci|THE SOFTWARE is provided on an "AS IS" basis and without warranty. 1062306a36Sopenharmony_ci|To the maximum extent permitted by applicable law, 1162306a36Sopenharmony_ci|MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, 1262306a36Sopenharmony_ci|INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE 1362306a36Sopenharmony_ci|and any warranty against infringement with regard to the SOFTWARE 1462306a36Sopenharmony_ci|(INCLUDING ANY MODIFIED VERSIONS THEREOF) and any accompanying written materials. 1562306a36Sopenharmony_ci| 1662306a36Sopenharmony_ci|To the maximum extent permitted by applicable law, 1762306a36Sopenharmony_ci|IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER 1862306a36Sopenharmony_ci|(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, 1962306a36Sopenharmony_ci|BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) 2062306a36Sopenharmony_ci|ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. 2162306a36Sopenharmony_ci|Motorola assumes no responsibility for the maintenance and support of the SOFTWARE. 2262306a36Sopenharmony_ci| 2362306a36Sopenharmony_ci|You are hereby granted a copyright license to use, modify, and distribute the SOFTWARE 2462306a36Sopenharmony_ci|so long as this entire notice is retained without alteration in any modified and/or 2562306a36Sopenharmony_ci|redistributed versions, and that such modified versions are clearly identified as such. 2662306a36Sopenharmony_ci|No licenses are granted by implication, estoppel or otherwise under any patents 2762306a36Sopenharmony_ci|or trademarks of Motorola, Inc. 2862306a36Sopenharmony_ci|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2962306a36Sopenharmony_ci| os.s 3062306a36Sopenharmony_ci| 3162306a36Sopenharmony_ci| This file contains: 3262306a36Sopenharmony_ci| - example "Call-Out"s required by both the ISP and FPSP. 3362306a36Sopenharmony_ci| 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#include <linux/linkage.h> 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci|################################ 3862306a36Sopenharmony_ci| EXAMPLE CALL-OUTS # 3962306a36Sopenharmony_ci| # 4062306a36Sopenharmony_ci| _060_dmem_write() # 4162306a36Sopenharmony_ci| _060_dmem_read() # 4262306a36Sopenharmony_ci| _060_imem_read() # 4362306a36Sopenharmony_ci| _060_dmem_read_byte() # 4462306a36Sopenharmony_ci| _060_dmem_read_word() # 4562306a36Sopenharmony_ci| _060_dmem_read_long() # 4662306a36Sopenharmony_ci| _060_imem_read_word() # 4762306a36Sopenharmony_ci| _060_imem_read_long() # 4862306a36Sopenharmony_ci| _060_dmem_write_byte() # 4962306a36Sopenharmony_ci| _060_dmem_write_word() # 5062306a36Sopenharmony_ci| _060_dmem_write_long() # 5162306a36Sopenharmony_ci| # 5262306a36Sopenharmony_ci| _060_real_trace() # 5362306a36Sopenharmony_ci| _060_real_access() # 5462306a36Sopenharmony_ci|################################ 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci| 5762306a36Sopenharmony_ci| Each IO routine checks to see if the memory write/read is to/from user 5862306a36Sopenharmony_ci| or supervisor application space. The examples below use simple "move" 5962306a36Sopenharmony_ci| instructions for supervisor mode applications and call _copyin()/_copyout() 6062306a36Sopenharmony_ci| for user mode applications. 6162306a36Sopenharmony_ci| When installing the 060SP, the _copyin()/_copyout() equivalents for a 6262306a36Sopenharmony_ci| given operating system should be substituted. 6362306a36Sopenharmony_ci| 6462306a36Sopenharmony_ci| The addresses within the 060SP are guaranteed to be on the stack. 6562306a36Sopenharmony_ci| The result is that Unix processes are allowed to sleep as a consequence 6662306a36Sopenharmony_ci| of a page fault during a _copyout. 6762306a36Sopenharmony_ci| 6862306a36Sopenharmony_ci| Linux/68k: The _060_[id]mem_{read,write}_{byte,word,long} functions 6962306a36Sopenharmony_ci| (i.e. all the known length <= 4) are implemented by single moves 7062306a36Sopenharmony_ci| statements instead of (more expensive) copy{in,out} calls, if 7162306a36Sopenharmony_ci| working in user space 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci| 7462306a36Sopenharmony_ci| _060_dmem_write(): 7562306a36Sopenharmony_ci| 7662306a36Sopenharmony_ci| Writes to data memory while in supervisor mode. 7762306a36Sopenharmony_ci| 7862306a36Sopenharmony_ci| INPUTS: 7962306a36Sopenharmony_ci| a0 - supervisor source address 8062306a36Sopenharmony_ci| a1 - user destination address 8162306a36Sopenharmony_ci| d0 - number of bytes to write 8262306a36Sopenharmony_ci| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 8362306a36Sopenharmony_ci| OUTPUTS: 8462306a36Sopenharmony_ci| d1 - 0 = success, !0 = failure 8562306a36Sopenharmony_ci| 8662306a36Sopenharmony_ci .global _060_dmem_write 8762306a36Sopenharmony_ci_060_dmem_write: 8862306a36Sopenharmony_ci subq.l #1,%d0 8962306a36Sopenharmony_ci btst #0x5,0x4(%a6) | check for supervisor state 9062306a36Sopenharmony_ci beqs user_write 9162306a36Sopenharmony_cisuper_write: 9262306a36Sopenharmony_ci move.b (%a0)+,(%a1)+ | copy 1 byte 9362306a36Sopenharmony_ci dbra %d0,super_write | quit if --ctr < 0 9462306a36Sopenharmony_ci clr.l %d1 | return success 9562306a36Sopenharmony_ci rts 9662306a36Sopenharmony_ciuser_write: 9762306a36Sopenharmony_ci move.b (%a0)+,%d1 | copy 1 byte 9862306a36Sopenharmony_cicopyoutae: 9962306a36Sopenharmony_ci movs.b %d1,(%a1)+ 10062306a36Sopenharmony_ci dbra %d0,user_write | quit if --ctr < 0 10162306a36Sopenharmony_ci clr.l %d1 | return success 10262306a36Sopenharmony_ci rts 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci| 10562306a36Sopenharmony_ci| _060_imem_read(), _060_dmem_read(): 10662306a36Sopenharmony_ci| 10762306a36Sopenharmony_ci| Reads from data/instruction memory while in supervisor mode. 10862306a36Sopenharmony_ci| 10962306a36Sopenharmony_ci| INPUTS: 11062306a36Sopenharmony_ci| a0 - user source address 11162306a36Sopenharmony_ci| a1 - supervisor destination address 11262306a36Sopenharmony_ci| d0 - number of bytes to read 11362306a36Sopenharmony_ci| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 11462306a36Sopenharmony_ci| OUTPUTS: 11562306a36Sopenharmony_ci| d1 - 0 = success, !0 = failure 11662306a36Sopenharmony_ci| 11762306a36Sopenharmony_ci .global _060_imem_read 11862306a36Sopenharmony_ci .global _060_dmem_read 11962306a36Sopenharmony_ci_060_imem_read: 12062306a36Sopenharmony_ci_060_dmem_read: 12162306a36Sopenharmony_ci subq.l #1,%d0 12262306a36Sopenharmony_ci btst #0x5,0x4(%a6) | check for supervisor state 12362306a36Sopenharmony_ci beqs user_read 12462306a36Sopenharmony_cisuper_read: 12562306a36Sopenharmony_ci move.b (%a0)+,(%a1)+ | copy 1 byte 12662306a36Sopenharmony_ci dbra %d0,super_read | quit if --ctr < 0 12762306a36Sopenharmony_ci clr.l %d1 | return success 12862306a36Sopenharmony_ci rts 12962306a36Sopenharmony_ciuser_read: 13062306a36Sopenharmony_cicopyinae: 13162306a36Sopenharmony_ci movs.b (%a0)+,%d1 13262306a36Sopenharmony_ci move.b %d1,(%a1)+ | copy 1 byte 13362306a36Sopenharmony_ci dbra %d0,user_read | quit if --ctr < 0 13462306a36Sopenharmony_ci clr.l %d1 | return success 13562306a36Sopenharmony_ci rts 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci| 13862306a36Sopenharmony_ci| _060_dmem_read_byte(): 13962306a36Sopenharmony_ci| 14062306a36Sopenharmony_ci| Read a data byte from user memory. 14162306a36Sopenharmony_ci| 14262306a36Sopenharmony_ci| INPUTS: 14362306a36Sopenharmony_ci| a0 - user source address 14462306a36Sopenharmony_ci| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 14562306a36Sopenharmony_ci| OUTPUTS: 14662306a36Sopenharmony_ci| d0 - data byte in d0 14762306a36Sopenharmony_ci| d1 - 0 = success, !0 = failure 14862306a36Sopenharmony_ci| 14962306a36Sopenharmony_ci .global _060_dmem_read_byte 15062306a36Sopenharmony_ci_060_dmem_read_byte: 15162306a36Sopenharmony_ci clr.l %d0 | clear whole longword 15262306a36Sopenharmony_ci clr.l %d1 | assume success 15362306a36Sopenharmony_ci btst #0x5,0x4(%a6) | check for supervisor state 15462306a36Sopenharmony_ci bnes dmrbs | supervisor 15562306a36Sopenharmony_cidmrbuae:movs.b (%a0),%d0 | fetch user byte 15662306a36Sopenharmony_ci rts 15762306a36Sopenharmony_cidmrbs: move.b (%a0),%d0 | fetch super byte 15862306a36Sopenharmony_ci rts 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci| 16162306a36Sopenharmony_ci| _060_dmem_read_word(): 16262306a36Sopenharmony_ci| 16362306a36Sopenharmony_ci| Read a data word from user memory. 16462306a36Sopenharmony_ci| 16562306a36Sopenharmony_ci| INPUTS: 16662306a36Sopenharmony_ci| a0 - user source address 16762306a36Sopenharmony_ci| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 16862306a36Sopenharmony_ci| OUTPUTS: 16962306a36Sopenharmony_ci| d0 - data word in d0 17062306a36Sopenharmony_ci| d1 - 0 = success, !0 = failure 17162306a36Sopenharmony_ci| 17262306a36Sopenharmony_ci| _060_imem_read_word(): 17362306a36Sopenharmony_ci| 17462306a36Sopenharmony_ci| Read an instruction word from user memory. 17562306a36Sopenharmony_ci| 17662306a36Sopenharmony_ci| INPUTS: 17762306a36Sopenharmony_ci| a0 - user source address 17862306a36Sopenharmony_ci| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 17962306a36Sopenharmony_ci| OUTPUTS: 18062306a36Sopenharmony_ci| d0 - instruction word in d0 18162306a36Sopenharmony_ci| d1 - 0 = success, !0 = failure 18262306a36Sopenharmony_ci| 18362306a36Sopenharmony_ci .global _060_dmem_read_word 18462306a36Sopenharmony_ci .global _060_imem_read_word 18562306a36Sopenharmony_ci_060_dmem_read_word: 18662306a36Sopenharmony_ci_060_imem_read_word: 18762306a36Sopenharmony_ci clr.l %d1 | assume success 18862306a36Sopenharmony_ci clr.l %d0 | clear whole longword 18962306a36Sopenharmony_ci btst #0x5,0x4(%a6) | check for supervisor state 19062306a36Sopenharmony_ci bnes dmrws | supervisor 19162306a36Sopenharmony_cidmrwuae:movs.w (%a0), %d0 | fetch user word 19262306a36Sopenharmony_ci rts 19362306a36Sopenharmony_cidmrws: move.w (%a0), %d0 | fetch super word 19462306a36Sopenharmony_ci rts 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci| 19762306a36Sopenharmony_ci| _060_dmem_read_long(): 19862306a36Sopenharmony_ci| 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci| 20162306a36Sopenharmony_ci| INPUTS: 20262306a36Sopenharmony_ci| a0 - user source address 20362306a36Sopenharmony_ci| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 20462306a36Sopenharmony_ci| OUTPUTS: 20562306a36Sopenharmony_ci| d0 - data longword in d0 20662306a36Sopenharmony_ci| d1 - 0 = success, !0 = failure 20762306a36Sopenharmony_ci| 20862306a36Sopenharmony_ci| _060_imem_read_long(): 20962306a36Sopenharmony_ci| 21062306a36Sopenharmony_ci| Read an instruction longword from user memory. 21162306a36Sopenharmony_ci| 21262306a36Sopenharmony_ci| INPUTS: 21362306a36Sopenharmony_ci| a0 - user source address 21462306a36Sopenharmony_ci| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 21562306a36Sopenharmony_ci| OUTPUTS: 21662306a36Sopenharmony_ci| d0 - instruction longword in d0 21762306a36Sopenharmony_ci| d1 - 0 = success, !0 = failure 21862306a36Sopenharmony_ci| 21962306a36Sopenharmony_ci .global _060_dmem_read_long 22062306a36Sopenharmony_ci .global _060_imem_read_long 22162306a36Sopenharmony_ci_060_dmem_read_long: 22262306a36Sopenharmony_ci_060_imem_read_long: 22362306a36Sopenharmony_ci clr.l %d1 | assume success 22462306a36Sopenharmony_ci btst #0x5,0x4(%a6) | check for supervisor state 22562306a36Sopenharmony_ci bnes dmrls | supervisor 22662306a36Sopenharmony_cidmrluae:movs.l (%a0),%d0 | fetch user longword 22762306a36Sopenharmony_ci rts 22862306a36Sopenharmony_cidmrls: move.l (%a0),%d0 | fetch super longword 22962306a36Sopenharmony_ci rts 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci| 23262306a36Sopenharmony_ci| _060_dmem_write_byte(): 23362306a36Sopenharmony_ci| 23462306a36Sopenharmony_ci| Write a data byte to user memory. 23562306a36Sopenharmony_ci| 23662306a36Sopenharmony_ci| INPUTS: 23762306a36Sopenharmony_ci| a0 - user destination address 23862306a36Sopenharmony_ci| d0 - data byte in d0 23962306a36Sopenharmony_ci| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 24062306a36Sopenharmony_ci| OUTPUTS: 24162306a36Sopenharmony_ci| d1 - 0 = success, !0 = failure 24262306a36Sopenharmony_ci| 24362306a36Sopenharmony_ci .global _060_dmem_write_byte 24462306a36Sopenharmony_ci_060_dmem_write_byte: 24562306a36Sopenharmony_ci clr.l %d1 | assume success 24662306a36Sopenharmony_ci btst #0x5,0x4(%a6) | check for supervisor state 24762306a36Sopenharmony_ci bnes dmwbs | supervisor 24862306a36Sopenharmony_cidmwbuae:movs.b %d0,(%a0) | store user byte 24962306a36Sopenharmony_ci rts 25062306a36Sopenharmony_cidmwbs: move.b %d0,(%a0) | store super byte 25162306a36Sopenharmony_ci rts 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci| 25462306a36Sopenharmony_ci| _060_dmem_write_word(): 25562306a36Sopenharmony_ci| 25662306a36Sopenharmony_ci| Write a data word to user memory. 25762306a36Sopenharmony_ci| 25862306a36Sopenharmony_ci| INPUTS: 25962306a36Sopenharmony_ci| a0 - user destination address 26062306a36Sopenharmony_ci| d0 - data word in d0 26162306a36Sopenharmony_ci| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 26262306a36Sopenharmony_ci| OUTPUTS: 26362306a36Sopenharmony_ci| d1 - 0 = success, !0 = failure 26462306a36Sopenharmony_ci| 26562306a36Sopenharmony_ci .global _060_dmem_write_word 26662306a36Sopenharmony_ci_060_dmem_write_word: 26762306a36Sopenharmony_ci clr.l %d1 | assume success 26862306a36Sopenharmony_ci btst #0x5,0x4(%a6) | check for supervisor state 26962306a36Sopenharmony_ci bnes dmwws | supervisor 27062306a36Sopenharmony_cidmwwu: 27162306a36Sopenharmony_cidmwwuae:movs.w %d0,(%a0) | store user word 27262306a36Sopenharmony_ci bras dmwwr 27362306a36Sopenharmony_cidmwws: move.w %d0,(%a0) | store super word 27462306a36Sopenharmony_cidmwwr: clr.l %d1 | return success 27562306a36Sopenharmony_ci rts 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci| 27862306a36Sopenharmony_ci| _060_dmem_write_long(): 27962306a36Sopenharmony_ci| 28062306a36Sopenharmony_ci| Write a data longword to user memory. 28162306a36Sopenharmony_ci| 28262306a36Sopenharmony_ci| INPUTS: 28362306a36Sopenharmony_ci| a0 - user destination address 28462306a36Sopenharmony_ci| d0 - data longword in d0 28562306a36Sopenharmony_ci| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 28662306a36Sopenharmony_ci| OUTPUTS: 28762306a36Sopenharmony_ci| d1 - 0 = success, !0 = failure 28862306a36Sopenharmony_ci| 28962306a36Sopenharmony_ci .global _060_dmem_write_long 29062306a36Sopenharmony_ci_060_dmem_write_long: 29162306a36Sopenharmony_ci clr.l %d1 | assume success 29262306a36Sopenharmony_ci btst #0x5,0x4(%a6) | check for supervisor state 29362306a36Sopenharmony_ci bnes dmwls | supervisor 29462306a36Sopenharmony_cidmwluae:movs.l %d0,(%a0) | store user longword 29562306a36Sopenharmony_ci rts 29662306a36Sopenharmony_cidmwls: move.l %d0,(%a0) | store super longword 29762306a36Sopenharmony_ci rts 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci#if 0 30162306a36Sopenharmony_ci|############################################### 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci| 30462306a36Sopenharmony_ci| Use these routines if your kernel doesn't have _copyout/_copyin equivalents. 30562306a36Sopenharmony_ci| Assumes that D0/D1/A0/A1 are scratch registers. The _copyin/_copyout 30662306a36Sopenharmony_ci| below assume that the SFC/DFC have been set previously. 30762306a36Sopenharmony_ci| 30862306a36Sopenharmony_ci| Linux/68k: These are basically non-inlined versions of 30962306a36Sopenharmony_ci| memcpy_{to,from}fs, but without long-transfer optimization 31062306a36Sopenharmony_ci| Note: Assumed that SFC/DFC are pointing correctly to user data 31162306a36Sopenharmony_ci| space... Should be right, or are there any exceptions? 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci| 31462306a36Sopenharmony_ci| int _copyout(supervisor_addr, user_addr, nbytes) 31562306a36Sopenharmony_ci| 31662306a36Sopenharmony_ci .global _copyout 31762306a36Sopenharmony_ci_copyout: 31862306a36Sopenharmony_ci move.l 4(%sp),%a0 | source 31962306a36Sopenharmony_ci move.l 8(%sp),%a1 | destination 32062306a36Sopenharmony_ci move.l 12(%sp),%d0 | count 32162306a36Sopenharmony_ci subq.l #1,%d0 32262306a36Sopenharmony_cimoreout: 32362306a36Sopenharmony_ci move.b (%a0)+,%d1 | fetch supervisor byte 32462306a36Sopenharmony_cicopyoutae: 32562306a36Sopenharmony_ci movs.b %d1,(%a1)+ | store user byte 32662306a36Sopenharmony_ci dbra %d0,moreout | are we through yet? 32762306a36Sopenharmony_ci moveq #0,%d0 | return success 32862306a36Sopenharmony_ci rts 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci| 33162306a36Sopenharmony_ci| int _copyin(user_addr, supervisor_addr, nbytes) 33262306a36Sopenharmony_ci| 33362306a36Sopenharmony_ci .global _copyin 33462306a36Sopenharmony_ci_copyin: 33562306a36Sopenharmony_ci move.l 4(%sp),%a0 | source 33662306a36Sopenharmony_ci move.l 8(%sp),%a1 | destination 33762306a36Sopenharmony_ci move.l 12(%sp),%d0 | count 33862306a36Sopenharmony_ci subq.l #1,%d0 33962306a36Sopenharmony_cimorein: 34062306a36Sopenharmony_cicopyinae: 34162306a36Sopenharmony_ci movs.b (%a0)+,%d1 | fetch user byte 34262306a36Sopenharmony_ci move.b %d1,(%a1)+ | write supervisor byte 34362306a36Sopenharmony_ci dbra %d0,morein | are we through yet? 34462306a36Sopenharmony_ci moveq #0,%d0 | return success 34562306a36Sopenharmony_ci rts 34662306a36Sopenharmony_ci#endif 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci|########################################################################### 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci| 35162306a36Sopenharmony_ci| _060_real_trace(): 35262306a36Sopenharmony_ci| 35362306a36Sopenharmony_ci| This is the exit point for the 060FPSP when an instruction is being traced 35462306a36Sopenharmony_ci| and there are no other higher priority exceptions pending for this instruction 35562306a36Sopenharmony_ci| or they have already been processed. 35662306a36Sopenharmony_ci| 35762306a36Sopenharmony_ci| The sample code below simply executes an "rte". 35862306a36Sopenharmony_ci| 35962306a36Sopenharmony_ci .global _060_real_trace 36062306a36Sopenharmony_ci_060_real_trace: 36162306a36Sopenharmony_ci bral trap 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci| 36462306a36Sopenharmony_ci| _060_real_access(): 36562306a36Sopenharmony_ci| 36662306a36Sopenharmony_ci| This is the exit point for the 060FPSP when an access error exception 36762306a36Sopenharmony_ci| is encountered. The routine below should point to the operating system 36862306a36Sopenharmony_ci| handler for access error exceptions. The exception stack frame is an 36962306a36Sopenharmony_ci| 8-word access error frame. 37062306a36Sopenharmony_ci| 37162306a36Sopenharmony_ci| The sample routine below simply executes an "rte" instruction which 37262306a36Sopenharmony_ci| is most likely the incorrect thing to do and could put the system 37362306a36Sopenharmony_ci| into an infinite loop. 37462306a36Sopenharmony_ci| 37562306a36Sopenharmony_ci .global _060_real_access 37662306a36Sopenharmony_ci_060_real_access: 37762306a36Sopenharmony_ci bral buserr 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci| Execption handling for movs access to illegal memory 38262306a36Sopenharmony_ci .section .fixup,"ax" 38362306a36Sopenharmony_ci .even 38462306a36Sopenharmony_ci1: moveq #-1,%d1 38562306a36Sopenharmony_ci rts 38662306a36Sopenharmony_ci.section __ex_table,"a" 38762306a36Sopenharmony_ci .align 4 38862306a36Sopenharmony_ci .long dmrbuae,1b 38962306a36Sopenharmony_ci .long dmrwuae,1b 39062306a36Sopenharmony_ci .long dmrluae,1b 39162306a36Sopenharmony_ci .long dmwbuae,1b 39262306a36Sopenharmony_ci .long dmwwuae,1b 39362306a36Sopenharmony_ci .long dmwluae,1b 39462306a36Sopenharmony_ci .long copyoutae,1b 39562306a36Sopenharmony_ci .long copyinae,1b 39662306a36Sopenharmony_ci .text 397