123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- |MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
- |M68000 Hi-Performance Microprocessor Division
- |M68060 Software Package
- |Production Release P1.00 -- October 10, 1994
- |
- |M68060 Software Package Copyright © 1993, 1994 Motorola Inc. All rights reserved.
- |
- |THE SOFTWARE is provided on an "AS IS" basis and without warranty.
- |To the maximum extent permitted by applicable law,
- |MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
- |INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
- |and any warranty against infringement with regard to the SOFTWARE
- |(INCLUDING ANY MODIFIED VERSIONS THEREOF) and any accompanying written materials.
- |
- |To the maximum extent permitted by applicable law,
- |IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
- |(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
- |BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS)
- |ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
- |Motorola assumes no responsibility for the maintenance and support of the SOFTWARE.
- |
- |You are hereby granted a copyright license to use, modify, and distribute the SOFTWARE
- |so long as this entire notice is retained without alteration in any modified and/or
- |redistributed versions, and that such modified versions are clearly identified as such.
- |No licenses are granted by implication, estoppel or otherwise under any patents
- |or trademarks of Motorola, Inc.
- |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- | os.s
- |
- | This file contains:
- | - example "Call-Out"s required by both the ISP and FPSP.
- |
- #include <linux/linkage.h>
- |################################
- | EXAMPLE CALL-OUTS #
- | #
- | _060_dmem_write() #
- | _060_dmem_read() #
- | _060_imem_read() #
- | _060_dmem_read_byte() #
- | _060_dmem_read_word() #
- | _060_dmem_read_long() #
- | _060_imem_read_word() #
- | _060_imem_read_long() #
- | _060_dmem_write_byte() #
- | _060_dmem_write_word() #
- | _060_dmem_write_long() #
- | #
- | _060_real_trace() #
- | _060_real_access() #
- |################################
- |
- | Each IO routine checks to see if the memory write/read is to/from user
- | or supervisor application space. The examples below use simple "move"
- | instructions for supervisor mode applications and call _copyin()/_copyout()
- | for user mode applications.
- | When installing the 060SP, the _copyin()/_copyout() equivalents for a
- | given operating system should be substituted.
- |
- | The addresses within the 060SP are guaranteed to be on the stack.
- | The result is that Unix processes are allowed to sleep as a consequence
- | of a page fault during a _copyout.
- |
- | Linux/68k: The _060_[id]mem_{read,write}_{byte,word,long} functions
- | (i.e. all the known length <= 4) are implemented by single moves
- | statements instead of (more expensive) copy{in,out} calls, if
- | working in user space
- |
- | _060_dmem_write():
- |
- | Writes to data memory while in supervisor mode.
- |
- | INPUTS:
- | a0 - supervisor source address
- | a1 - user destination address
- | d0 - number of bytes to write
- | 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
- | OUTPUTS:
- | d1 - 0 = success, !0 = failure
- |
- .global _060_dmem_write
- _060_dmem_write:
- subq.l #1,%d0
- btst #0x5,0x4(%a6) | check for supervisor state
- beqs user_write
- super_write:
- move.b (%a0)+,(%a1)+ | copy 1 byte
- dbra %d0,super_write | quit if --ctr < 0
- clr.l %d1 | return success
- rts
- user_write:
- move.b (%a0)+,%d1 | copy 1 byte
- copyoutae:
- movs.b %d1,(%a1)+
- dbra %d0,user_write | quit if --ctr < 0
- clr.l %d1 | return success
- rts
- |
- | _060_imem_read(), _060_dmem_read():
- |
- | Reads from data/instruction memory while in supervisor mode.
- |
- | INPUTS:
- | a0 - user source address
- | a1 - supervisor destination address
- | d0 - number of bytes to read
- | 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
- | OUTPUTS:
- | d1 - 0 = success, !0 = failure
- |
- .global _060_imem_read
- .global _060_dmem_read
- _060_imem_read:
- _060_dmem_read:
- subq.l #1,%d0
- btst #0x5,0x4(%a6) | check for supervisor state
- beqs user_read
- super_read:
- move.b (%a0)+,(%a1)+ | copy 1 byte
- dbra %d0,super_read | quit if --ctr < 0
- clr.l %d1 | return success
- rts
- user_read:
- copyinae:
- movs.b (%a0)+,%d1
- move.b %d1,(%a1)+ | copy 1 byte
- dbra %d0,user_read | quit if --ctr < 0
- clr.l %d1 | return success
- rts
- |
- | _060_dmem_read_byte():
- |
- | Read a data byte from user memory.
- |
- | INPUTS:
- | a0 - user source address
- | 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
- | OUTPUTS:
- | d0 - data byte in d0
- | d1 - 0 = success, !0 = failure
- |
- .global _060_dmem_read_byte
- _060_dmem_read_byte:
- clr.l %d0 | clear whole longword
- clr.l %d1 | assume success
- btst #0x5,0x4(%a6) | check for supervisor state
- bnes dmrbs | supervisor
- dmrbuae:movs.b (%a0),%d0 | fetch user byte
- rts
- dmrbs: move.b (%a0),%d0 | fetch super byte
- rts
- |
- | _060_dmem_read_word():
- |
- | Read a data word from user memory.
- |
- | INPUTS:
- | a0 - user source address
- | 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
- | OUTPUTS:
- | d0 - data word in d0
- | d1 - 0 = success, !0 = failure
- |
- | _060_imem_read_word():
- |
- | Read an instruction word from user memory.
- |
- | INPUTS:
- | a0 - user source address
- | 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
- | OUTPUTS:
- | d0 - instruction word in d0
- | d1 - 0 = success, !0 = failure
- |
- .global _060_dmem_read_word
- .global _060_imem_read_word
- _060_dmem_read_word:
- _060_imem_read_word:
- clr.l %d1 | assume success
- clr.l %d0 | clear whole longword
- btst #0x5,0x4(%a6) | check for supervisor state
- bnes dmrws | supervisor
- dmrwuae:movs.w (%a0), %d0 | fetch user word
- rts
- dmrws: move.w (%a0), %d0 | fetch super word
- rts
- |
- | _060_dmem_read_long():
- |
- |
- | INPUTS:
- | a0 - user source address
- | 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
- | OUTPUTS:
- | d0 - data longword in d0
- | d1 - 0 = success, !0 = failure
- |
- | _060_imem_read_long():
- |
- | Read an instruction longword from user memory.
- |
- | INPUTS:
- | a0 - user source address
- | 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
- | OUTPUTS:
- | d0 - instruction longword in d0
- | d1 - 0 = success, !0 = failure
- |
- .global _060_dmem_read_long
- .global _060_imem_read_long
- _060_dmem_read_long:
- _060_imem_read_long:
- clr.l %d1 | assume success
- btst #0x5,0x4(%a6) | check for supervisor state
- bnes dmrls | supervisor
- dmrluae:movs.l (%a0),%d0 | fetch user longword
- rts
- dmrls: move.l (%a0),%d0 | fetch super longword
- rts
- |
- | _060_dmem_write_byte():
- |
- | Write a data byte to user memory.
- |
- | INPUTS:
- | a0 - user destination address
- | d0 - data byte in d0
- | 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
- | OUTPUTS:
- | d1 - 0 = success, !0 = failure
- |
- .global _060_dmem_write_byte
- _060_dmem_write_byte:
- clr.l %d1 | assume success
- btst #0x5,0x4(%a6) | check for supervisor state
- bnes dmwbs | supervisor
- dmwbuae:movs.b %d0,(%a0) | store user byte
- rts
- dmwbs: move.b %d0,(%a0) | store super byte
- rts
- |
- | _060_dmem_write_word():
- |
- | Write a data word to user memory.
- |
- | INPUTS:
- | a0 - user destination address
- | d0 - data word in d0
- | 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
- | OUTPUTS:
- | d1 - 0 = success, !0 = failure
- |
- .global _060_dmem_write_word
- _060_dmem_write_word:
- clr.l %d1 | assume success
- btst #0x5,0x4(%a6) | check for supervisor state
- bnes dmwws | supervisor
- dmwwu:
- dmwwuae:movs.w %d0,(%a0) | store user word
- bras dmwwr
- dmwws: move.w %d0,(%a0) | store super word
- dmwwr: clr.l %d1 | return success
- rts
- |
- | _060_dmem_write_long():
- |
- | Write a data longword to user memory.
- |
- | INPUTS:
- | a0 - user destination address
- | d0 - data longword in d0
- | 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
- | OUTPUTS:
- | d1 - 0 = success, !0 = failure
- |
- .global _060_dmem_write_long
- _060_dmem_write_long:
- clr.l %d1 | assume success
- btst #0x5,0x4(%a6) | check for supervisor state
- bnes dmwls | supervisor
- dmwluae:movs.l %d0,(%a0) | store user longword
- rts
- dmwls: move.l %d0,(%a0) | store super longword
- rts
- #if 0
- |###############################################
- |
- | Use these routines if your kernel doesn't have _copyout/_copyin equivalents.
- | Assumes that D0/D1/A0/A1 are scratch registers. The _copyin/_copyout
- | below assume that the SFC/DFC have been set previously.
- |
- | Linux/68k: These are basically non-inlined versions of
- | memcpy_{to,from}fs, but without long-transfer optimization
- | Note: Assumed that SFC/DFC are pointing correctly to user data
- | space... Should be right, or are there any exceptions?
- |
- | int _copyout(supervisor_addr, user_addr, nbytes)
- |
- .global _copyout
- _copyout:
- move.l 4(%sp),%a0 | source
- move.l 8(%sp),%a1 | destination
- move.l 12(%sp),%d0 | count
- subq.l #1,%d0
- moreout:
- move.b (%a0)+,%d1 | fetch supervisor byte
- copyoutae:
- movs.b %d1,(%a1)+ | store user byte
- dbra %d0,moreout | are we through yet?
- moveq #0,%d0 | return success
- rts
- |
- | int _copyin(user_addr, supervisor_addr, nbytes)
- |
- .global _copyin
- _copyin:
- move.l 4(%sp),%a0 | source
- move.l 8(%sp),%a1 | destination
- move.l 12(%sp),%d0 | count
- subq.l #1,%d0
- morein:
- copyinae:
- movs.b (%a0)+,%d1 | fetch user byte
- move.b %d1,(%a1)+ | write supervisor byte
- dbra %d0,morein | are we through yet?
- moveq #0,%d0 | return success
- rts
- #endif
- |###########################################################################
- |
- | _060_real_trace():
- |
- | This is the exit point for the 060FPSP when an instruction is being traced
- | and there are no other higher priority exceptions pending for this instruction
- | or they have already been processed.
- |
- | The sample code below simply executes an "rte".
- |
- .global _060_real_trace
- _060_real_trace:
- bral trap
- |
- | _060_real_access():
- |
- | This is the exit point for the 060FPSP when an access error exception
- | is encountered. The routine below should point to the operating system
- | handler for access error exceptions. The exception stack frame is an
- | 8-word access error frame.
- |
- | The sample routine below simply executes an "rte" instruction which
- | is most likely the incorrect thing to do and could put the system
- | into an infinite loop.
- |
- .global _060_real_access
- _060_real_access:
- bral buserr
- | Execption handling for movs access to illegal memory
- .section .fixup,#alloc,#execinstr
- .even
- 1: moveq #-1,%d1
- rts
- .section __ex_table,#alloc
- .align 4
- .long dmrbuae,1b
- .long dmrwuae,1b
- .long dmrluae,1b
- .long dmwbuae,1b
- .long dmwwuae,1b
- .long dmwluae,1b
- .long copyoutae,1b
- .long copyinae,1b
- .text
|