1|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2|MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP 3|M68000 Hi-Performance Microprocessor Division 4|M68060 Software Package 5|Production Release P1.00 -- October 10, 1994 6| 7|M68060 Software Package Copyright � 1993, 1994 Motorola Inc. All rights reserved. 8| 9|THE SOFTWARE is provided on an "AS IS" basis and without warranty. 10|To the maximum extent permitted by applicable law, 11|MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, 12|INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE 13|and any warranty against infringement with regard to the SOFTWARE 14|(INCLUDING ANY MODIFIED VERSIONS THEREOF) and any accompanying written materials. 15| 16|To the maximum extent permitted by applicable law, 17|IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER 18|(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, 19|BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) 20|ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. 21|Motorola assumes no responsibility for the maintenance and support of the SOFTWARE. 22| 23|You are hereby granted a copyright license to use, modify, and distribute the SOFTWARE 24|so long as this entire notice is retained without alteration in any modified and/or 25|redistributed versions, and that such modified versions are clearly identified as such. 26|No licenses are granted by implication, estoppel or otherwise under any patents 27|or trademarks of Motorola, Inc. 28|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 29| os.s 30| 31| This file contains: 32| - example "Call-Out"s required by both the ISP and FPSP. 33| 34 35#include <linux/linkage.h> 36 37|################################ 38| EXAMPLE CALL-OUTS # 39| # 40| _060_dmem_write() # 41| _060_dmem_read() # 42| _060_imem_read() # 43| _060_dmem_read_byte() # 44| _060_dmem_read_word() # 45| _060_dmem_read_long() # 46| _060_imem_read_word() # 47| _060_imem_read_long() # 48| _060_dmem_write_byte() # 49| _060_dmem_write_word() # 50| _060_dmem_write_long() # 51| # 52| _060_real_trace() # 53| _060_real_access() # 54|################################ 55 56| 57| Each IO routine checks to see if the memory write/read is to/from user 58| or supervisor application space. The examples below use simple "move" 59| instructions for supervisor mode applications and call _copyin()/_copyout() 60| for user mode applications. 61| When installing the 060SP, the _copyin()/_copyout() equivalents for a 62| given operating system should be substituted. 63| 64| The addresses within the 060SP are guaranteed to be on the stack. 65| The result is that Unix processes are allowed to sleep as a consequence 66| of a page fault during a _copyout. 67| 68| Linux/68k: The _060_[id]mem_{read,write}_{byte,word,long} functions 69| (i.e. all the known length <= 4) are implemented by single moves 70| statements instead of (more expensive) copy{in,out} calls, if 71| working in user space 72 73| 74| _060_dmem_write(): 75| 76| Writes to data memory while in supervisor mode. 77| 78| INPUTS: 79| a0 - supervisor source address 80| a1 - user destination address 81| d0 - number of bytes to write 82| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 83| OUTPUTS: 84| d1 - 0 = success, !0 = failure 85| 86 .global _060_dmem_write 87_060_dmem_write: 88 subq.l #1,%d0 89 btst #0x5,0x4(%a6) | check for supervisor state 90 beqs user_write 91super_write: 92 move.b (%a0)+,(%a1)+ | copy 1 byte 93 dbra %d0,super_write | quit if --ctr < 0 94 clr.l %d1 | return success 95 rts 96user_write: 97 move.b (%a0)+,%d1 | copy 1 byte 98copyoutae: 99 movs.b %d1,(%a1)+ 100 dbra %d0,user_write | quit if --ctr < 0 101 clr.l %d1 | return success 102 rts 103 104| 105| _060_imem_read(), _060_dmem_read(): 106| 107| Reads from data/instruction memory while in supervisor mode. 108| 109| INPUTS: 110| a0 - user source address 111| a1 - supervisor destination address 112| d0 - number of bytes to read 113| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 114| OUTPUTS: 115| d1 - 0 = success, !0 = failure 116| 117 .global _060_imem_read 118 .global _060_dmem_read 119_060_imem_read: 120_060_dmem_read: 121 subq.l #1,%d0 122 btst #0x5,0x4(%a6) | check for supervisor state 123 beqs user_read 124super_read: 125 move.b (%a0)+,(%a1)+ | copy 1 byte 126 dbra %d0,super_read | quit if --ctr < 0 127 clr.l %d1 | return success 128 rts 129user_read: 130copyinae: 131 movs.b (%a0)+,%d1 132 move.b %d1,(%a1)+ | copy 1 byte 133 dbra %d0,user_read | quit if --ctr < 0 134 clr.l %d1 | return success 135 rts 136 137| 138| _060_dmem_read_byte(): 139| 140| Read a data byte from user memory. 141| 142| INPUTS: 143| a0 - user source address 144| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 145| OUTPUTS: 146| d0 - data byte in d0 147| d1 - 0 = success, !0 = failure 148| 149 .global _060_dmem_read_byte 150_060_dmem_read_byte: 151 clr.l %d0 | clear whole longword 152 clr.l %d1 | assume success 153 btst #0x5,0x4(%a6) | check for supervisor state 154 bnes dmrbs | supervisor 155dmrbuae:movs.b (%a0),%d0 | fetch user byte 156 rts 157dmrbs: move.b (%a0),%d0 | fetch super byte 158 rts 159 160| 161| _060_dmem_read_word(): 162| 163| Read a data word from user memory. 164| 165| INPUTS: 166| a0 - user source address 167| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 168| OUTPUTS: 169| d0 - data word in d0 170| d1 - 0 = success, !0 = failure 171| 172| _060_imem_read_word(): 173| 174| Read an instruction word from user memory. 175| 176| INPUTS: 177| a0 - user source address 178| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 179| OUTPUTS: 180| d0 - instruction word in d0 181| d1 - 0 = success, !0 = failure 182| 183 .global _060_dmem_read_word 184 .global _060_imem_read_word 185_060_dmem_read_word: 186_060_imem_read_word: 187 clr.l %d1 | assume success 188 clr.l %d0 | clear whole longword 189 btst #0x5,0x4(%a6) | check for supervisor state 190 bnes dmrws | supervisor 191dmrwuae:movs.w (%a0), %d0 | fetch user word 192 rts 193dmrws: move.w (%a0), %d0 | fetch super word 194 rts 195 196| 197| _060_dmem_read_long(): 198| 199 200| 201| INPUTS: 202| a0 - user source address 203| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 204| OUTPUTS: 205| d0 - data longword in d0 206| d1 - 0 = success, !0 = failure 207| 208| _060_imem_read_long(): 209| 210| Read an instruction longword from user memory. 211| 212| INPUTS: 213| a0 - user source address 214| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 215| OUTPUTS: 216| d0 - instruction longword in d0 217| d1 - 0 = success, !0 = failure 218| 219 .global _060_dmem_read_long 220 .global _060_imem_read_long 221_060_dmem_read_long: 222_060_imem_read_long: 223 clr.l %d1 | assume success 224 btst #0x5,0x4(%a6) | check for supervisor state 225 bnes dmrls | supervisor 226dmrluae:movs.l (%a0),%d0 | fetch user longword 227 rts 228dmrls: move.l (%a0),%d0 | fetch super longword 229 rts 230 231| 232| _060_dmem_write_byte(): 233| 234| Write a data byte to user memory. 235| 236| INPUTS: 237| a0 - user destination address 238| d0 - data byte in d0 239| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 240| OUTPUTS: 241| d1 - 0 = success, !0 = failure 242| 243 .global _060_dmem_write_byte 244_060_dmem_write_byte: 245 clr.l %d1 | assume success 246 btst #0x5,0x4(%a6) | check for supervisor state 247 bnes dmwbs | supervisor 248dmwbuae:movs.b %d0,(%a0) | store user byte 249 rts 250dmwbs: move.b %d0,(%a0) | store super byte 251 rts 252 253| 254| _060_dmem_write_word(): 255| 256| Write a data word to user memory. 257| 258| INPUTS: 259| a0 - user destination address 260| d0 - data word in d0 261| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 262| OUTPUTS: 263| d1 - 0 = success, !0 = failure 264| 265 .global _060_dmem_write_word 266_060_dmem_write_word: 267 clr.l %d1 | assume success 268 btst #0x5,0x4(%a6) | check for supervisor state 269 bnes dmwws | supervisor 270dmwwu: 271dmwwuae:movs.w %d0,(%a0) | store user word 272 bras dmwwr 273dmwws: move.w %d0,(%a0) | store super word 274dmwwr: clr.l %d1 | return success 275 rts 276 277| 278| _060_dmem_write_long(): 279| 280| Write a data longword to user memory. 281| 282| INPUTS: 283| a0 - user destination address 284| d0 - data longword in d0 285| 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 286| OUTPUTS: 287| d1 - 0 = success, !0 = failure 288| 289 .global _060_dmem_write_long 290_060_dmem_write_long: 291 clr.l %d1 | assume success 292 btst #0x5,0x4(%a6) | check for supervisor state 293 bnes dmwls | supervisor 294dmwluae:movs.l %d0,(%a0) | store user longword 295 rts 296dmwls: move.l %d0,(%a0) | store super longword 297 rts 298 299 300 301|########################################################################### 302 303| 304| _060_real_trace(): 305| 306| This is the exit point for the 060FPSP when an instruction is being traced 307| and there are no other higher priority exceptions pending for this instruction 308| or they have already been processed. 309| 310| The sample code below simply executes an "rte". 311| 312 .global _060_real_trace 313_060_real_trace: 314 bral trap 315 316| 317| _060_real_access(): 318| 319| This is the exit point for the 060FPSP when an access error exception 320| is encountered. The routine below should point to the operating system 321| handler for access error exceptions. The exception stack frame is an 322| 8-word access error frame. 323| 324| The sample routine below simply executes an "rte" instruction which 325| is most likely the incorrect thing to do and could put the system 326| into an infinite loop. 327| 328 .global _060_real_access 329_060_real_access: 330 bral buserr 331 332 333 334| Execption handling for movs access to illegal memory 335 .section .fixup,#alloc,#execinstr 336 .even 3371: moveq #-1,%d1 338 rts 339.section __ex_table,#alloc 340 .align 4 341 .long dmrbuae,1b 342 .long dmrwuae,1b 343 .long dmrluae,1b 344 .long dmwbuae,1b 345 .long dmwwuae,1b 346 .long dmwluae,1b 347 .long copyoutae,1b 348 .long copyinae,1b 349 .text 350