Annotation of sys/arch/m68k/060sp/os.s, Revision 1.1.1.1
1.1 nbrk 1: #
2: # $OpenBSD: os.s,v 1.2 1996/05/30 22:15:04 niklas Exp $
3: # $NetBSD: os.s,v 1.2 1996/05/15 19:49:06 is Exp $
4: #
5:
6: #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7: # MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
8: # M68000 Hi-Performance Microprocessor Division
9: # M68060 Software Package Production Release
10: #
11: # M68060 Software Package Copyright (C) 1993, 1994, 1995, 1996 Motorola Inc.
12: # All rights reserved.
13: #
14: # THE SOFTWARE is provided on an "AS IS" basis and without warranty.
15: # To the maximum extent permitted by applicable law,
16: # MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
17: # INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS
18: # FOR A PARTICULAR PURPOSE and any warranty against infringement with
19: # regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
20: # and any accompanying written materials.
21: #
22: # To the maximum extent permitted by applicable law,
23: # IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
24: # (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
25: # BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS)
26: # ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
27: #
28: # Motorola assumes no responsibility for the maintenance and support
29: # of the SOFTWARE.
30: #
31: # You are hereby granted a copyright license to use, modify, and distribute the
32: # SOFTWARE so long as this entire notice is retained without alteration
33: # in any modified and/or redistributed versions, and that such modified
34: # versions are clearly identified as such.
35: # No licenses are granted by implication, estoppel or otherwise under any
36: # patents or trademarks of Motorola, Inc.
37: #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
38:
39: #
40: # os.s
41: #
42: # This file contains:
43: # - example "Call-Out"s required by both the ISP and FPSP.
44: #
45:
46:
47: #################################
48: # EXAMPLE CALL-OUTS #
49: # #
50: # _060_dmem_write() #
51: # _060_dmem_read() #
52: # _060_imem_read() #
53: # _060_dmem_read_byte() #
54: # _060_dmem_read_word() #
55: # _060_dmem_read_long() #
56: # _060_imem_read_word() #
57: # _060_imem_read_long() #
58: # _060_dmem_write_byte() #
59: # _060_dmem_write_word() #
60: # _060_dmem_write_long() #
61: # #
62: # _060_real_trace() #
63: # _060_real_access() #
64: #################################
65:
66: #
67: # Each IO routine checks to see if the memory write/read is to/from user
68: # or supervisor application space. The examples below use simple "move"
69: # instructions for supervisor mode applications and call _copyin()/_copyout()
70: # for user mode applications.
71: # When installing the 060SP, the _copyin()/_copyout() equivalents for a
72: # given operating system should be substituted.
73: #
74: # The addresses within the 060SP are guaranteed to be on the stack.
75: # The result is that Unix processes are allowed to sleep as a consequence
76: # of a page fault during a _copyout.
77: #
78:
79: #
80: # _060_dmem_write():
81: #
82: # Writes to data memory while in supervisor mode.
83: #
84: # INPUTS:
85: # a0 - supervisor source address
86: # a1 - user destination address
87: # d0 - number of bytes to write
88: # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
89: # OUTPUTS:
90: # d1 - 0 = success, !0 = failure
91: #
92: global _060_dmem_write
93: _060_dmem_write:
94: btst &0x5,0x4(%a6) # check for supervisor state
95: beq.b user_write
96: super_write:
97: mov.b (%a0)+,(%a1)+ # copy 1 byte
98: subq.l &0x1,%d0 # decr byte counter
99: bne.b super_write # quit if ctr = 0
100: clr.l %d1 # return success
101: rts
102: user_write:
103: mov.l %d0,-(%sp) # pass: counter
104: mov.l %a1,-(%sp) # pass: user dst
105: mov.l %a0,-(%sp) # pass: supervisor src
106: bsr.l _copyout # write byte to user mem
107: mov.l %d0,%d1 # return success
108: add.l &0xc, %sp # clear 3 lw params
109: rts
110:
111: #
112: # _060_imem_read(), _060_dmem_read():
113: #
114: # Reads from data/instruction memory while in supervisor mode.
115: #
116: # INPUTS:
117: # a0 - user source address
118: # a1 - supervisor destination address
119: # d0 - number of bytes to read
120: # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
121: # OUTPUTS:
122: # d1 - 0 = success, !0 = failure
123: #
124: global _060_imem_read
125: global _060_dmem_read
126: _060_imem_read:
127: _060_dmem_read:
128: btst &0x5,0x4(%a6) # check for supervisor state
129: beq.b user_read
130: super_read:
131: mov.b (%a0)+,(%a1)+ # copy 1 byte
132: subq.l &0x1,%d0 # decr byte counter
133: bne.b super_read # quit if ctr = 0
134: clr.l %d1 # return success
135: rts
136: user_read:
137: mov.l %d0,-(%sp) # pass: counter
138: mov.l %a1,-(%sp) # pass: super dst
139: mov.l %a0,-(%sp) # pass: user src
140: bsr.l _copyin # read byte from user mem
141: mov.l %d0,%d1 # return success
142: add.l &0xc,%sp # clear 3 lw params
143: rts
144:
145: #
146: # _060_dmem_read_byte():
147: #
148: # Read a data byte from user memory.
149: #
150: # INPUTS:
151: # a0 - user source address
152: # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
153: # OUTPUTS:
154: # d0 - data byte in d0
155: # d1 - 0 = success, !0 = failure
156: #
157: global _060_dmem_read_byte
158: _060_dmem_read_byte:
159: btst &0x5,0x4(%a6) # check for supervisor state
160: bne.b dmrbs # supervisor
161: dmrbu: clr.l -(%sp) # clear space on stack for result
162: mov.l &0x1,-(%sp) # pass: # bytes to copy
163: pea 0x7(%sp) # pass: dst addr (stack)
164: mov.l %a0,-(%sp) # pass: src addr (user mem)
165: bsr.l _copyin # "copy in" the data
166: mov.l %d0,%d1 # return success
167: add.l &0xc,%sp # delete params
168: mov.l (%sp)+,%d0 # put answer in d0
169: rts
170: dmrbs: clr.l %d0 # clear whole longword
171: mov.b (%a0),%d0 # fetch super byte
172: clr.l %d1 # return success
173: rts
174:
175: #
176: # _060_dmem_read_word():
177: #
178: # Read a data word from user memory.
179: #
180: # INPUTS:
181: # a0 - user source address
182: # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
183: # OUTPUTS:
184: # d0 - data word in d0
185: # d1 - 0 = success, !0 = failure
186: #
187: global _060_dmem_read_word
188: _060_dmem_read_word:
189: btst &0x5,0x4(%a6) # check for supervisor state
190: bne.b dmrws # supervisor
191: dmrwu: clr.l -(%sp) # clear space on stack for result
192: mov.l &0x2,-(%sp) # pass: # bytes to copy
193: pea 0x6(%sp) # pass: dst addr (stack)
194: mov.l %a0,-(%sp) # pass: src addr (user mem)
195: bsr.l _copyin # "copy in" the data
196: mov.l %d0,%d1 # return success
197: add.l &0xc,%sp # delete params
198: mov.l (%sp)+,%d0 # put answer in d0
199: rts
200: dmrws: clr.l %d0 # clear whole longword
201: mov.w (%a0), %d0 # fetch super word
202: clr.l %d1 # return success
203: rts
204:
205: #
206: # _060_dmem_read_long():
207: #
208:
209: #
210: # INPUTS:
211: # a0 - user source address
212: # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
213: # OUTPUTS:
214: # d0 - data longword in d0
215: # d1 - 0 = success, !0 = failure
216: #
217: global _060_dmem_read_long
218: _060_dmem_read_long:
219: btst &0x5,0x4(%a6) # check for supervisor state
220: bne.b dmrls # supervisor
221: dmrlu: subq.l &0x4,%sp # clear space on stack for result
222: mov.l &0x4,-(%sp) # pass: # bytes to copy
223: pea 0x4(%sp) # pass: dst addr (stack)
224: mov.l %a0,-(%sp) # pass: src addr (user mem)
225: bsr.l _copyin # "copy in" the data
226: mov.l %d0,%d1 # return success
227: add.l &0xc,%sp # delete params
228: mov.l (%sp)+,%d0 # put answer in d0
229: rts
230: dmrls: mov.l (%a0),%d0 # fetch super longword
231: clr.l %d1 # return success
232: rts
233:
234: #
235: # _060_dmem_write_byte():
236: #
237: # Write a data byte to user memory.
238: #
239: # INPUTS:
240: # a0 - user destination address
241: # d0 - data byte in d0
242: # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
243: # OUTPUTS:
244: # d1 - 0 = success, !0 = failure
245: #
246: global _060_dmem_write_byte
247: _060_dmem_write_byte:
248: btst &0x5,0x4(%a6) # check for supervisor state
249: bne.b dmwbs # supervisor
250: dmwbu: mov.l %d0,-(%sp) # put src on stack
251: mov.l &0x1,-(%sp) # pass: # bytes to copy
252: mov.l %a0,-(%sp) # pass: dst addr (user mem)
253: pea 0xb(%sp) # pass: src addr (stack)
254: bsr.l _copyout # "copy out" the data
255: mov.l %d0,%d1 # return success
256: add.l &0x10,%sp # delete params + src
257: rts
258: dmwbs: mov.b %d0,(%a0) # store super byte
259: clr.l %d1 # return success
260: rts
261:
262: #
263: # _060_dmem_write_word():
264: #
265: # Write a data word to user memory.
266: #
267: # INPUTS:
268: # a0 - user destination address
269: # d0 - data word in d0
270: # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
271: # OUTPUTS:
272: # d1 - 0 = success, !0 = failure
273: #
274: global _060_dmem_write_word
275: _060_dmem_write_word:
276: btst &0x5,0x4(%a6) # check for supervisor state
277: bne.b dmwws # supervisor
278: dmwwu: mov.l %d0,-(%sp) # put src on stack
279: mov.l &0x2,-(%sp) # pass: # bytes to copy
280: mov.l %a0,-(%sp) # pass: dst addr (user mem)
281: pea 0xa(%sp) # pass: src addr (stack)
282: bsr.l _copyout # "copy out" the data
283: mov.l %d0,%d1 # return success
284: add.l &0x10,%sp # delete params + src
285: rts
286: dmwws: mov.w %d0,(%a0) # store super word
287: clr.l %d1 # return success
288: rts
289:
290: #
291: # _060_dmem_write_long():
292: #
293: # Write a data longword to user memory.
294: #
295: # INPUTS:
296: # a0 - user destination address
297: # d0 - data longword in d0
298: # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
299: # OUTPUTS:
300: # d1 - 0 = success, !0 = failure
301: #
302: global _060_dmem_write_long
303: _060_dmem_write_long:
304: btst &0x5,0x4(%a6) # check for supervisor state
305: bne.b dmwls # supervisor
306: dmwlu: mov.l %d0,-(%sp) # put src on stack
307: mov.l &0x4,-(%sp) # pass: # bytes to copy
308: mov.l %a0,-(%sp) # pass: dst addr (user mem)
309: pea 0x8(%sp) # pass: src addr (stack)
310: bsr.l _copyout # "copy out" the data
311: mov.l %d0,%d1 # return success
312: add.l &0x10,%sp # delete params + src
313: rts
314: dmwls: mov.l %d0,(%a0) # store super longword
315: clr.l %d1 # return success
316: rts
317:
318: #
319: # _060_imem_read_word():
320: #
321: # Read an instruction word from user memory.
322: #
323: # INPUTS:
324: # a0 - user source address
325: # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
326: # OUTPUTS:
327: # d0 - instruction word in d0
328: # d1 - 0 = success, !0 = failure
329: #
330: global _060_imem_read_word
331: _060_imem_read_word:
332: btst &0x5,0x4(%a6) # check for supervisor state
333: bne.b imrws # supervisor
334: imrwu: clr.l -(%sp) # clear space on stack for result
335: mov.l &0x2,-(%sp) # pass: # bytes to copy
336: pea 0x6(%sp) # pass: dst addr (stack)
337: mov.l %a0,-(%sp) # pass: src addr (user mem)
338: bsr.l _copyin # "copy in" the data
339: mov.l %d0,%d1 # return success
340: add.l &0xc,%sp # delete params
341: mov.l (%sp)+,%d0 # put answer in d0
342: rts
343: imrws: mov.w (%a0),%d0 # fetch super word
344: clr.l %d1 # return success
345: rts
346:
347: #
348: # _060_imem_read_long():
349: #
350: # Read an instruction longword from user memory.
351: #
352: # INPUTS:
353: # a0 - user source address
354: # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode
355: # OUTPUTS:
356: # d0 - instruction longword in d0
357: # d1 - 0 = success, !0 = failure
358: #
359: global _060_imem_read_long
360: _060_imem_read_long:
361: btst &0x5,0x4(%a6) # check for supervisor state
362: bne.b imrls # supervisor
363: imrlu: subq.l &0x4,%sp # clear space on stack for result
364: mov.l &0x4,-(%sp) # pass: # bytes to copy
365: pea 0x4(%sp) # pass: dst addr (stack)
366: mov.l %a0,-(%sp) # pass: src addr (user mem)
367: bsr.l _copyin # "copy in" the data
368: mov.l %d0,%d1 # return success
369: add.l &0xc,%sp # delete params
370: mov.l (%sp)+,%d0 # put answer in d0
371: rts
372: imrls: mov.l (%a0),%d0 # fetch super longword
373: clr.l %d1 # return success
374: rts
375:
376: ################################################
377:
378: #
379: # Use these routines if your kernel doesn't have _copyout/_copyin equivalents.
380: # Assumes that D0/D1/A0/A1 are scratch registers. The _copyin/_copyout
381: # below assume that the SFC/DFC have been set previously.
382: #
383:
384: #
385: # int _copyout(supervisor_addr, user_addr, nbytes)
386: #
387: global _copyout
388: _copyout:
389: mov.l 4(%sp),%a0 # source
390: mov.l 8(%sp),%a1 # destination
391: mov.l 12(%sp),%d0 # count
392: moreout:
393: mov.b (%a0)+,%d1 # fetch supervisor byte
394: movs.b %d1,(%a1)+ # store user byte
395: subq.l &0x1,%d0 # are we through yet?
396: bne.w moreout # no; so, continue
397: rts
398:
399: #
400: # int _copyin(user_addr, supervisor_addr, nbytes)
401: #
402: global _copyin
403: _copyin:
404: mov.l 4(%sp),%a0 # source
405: mov.l 8(%sp),%a1 # destination
406: mov.l 12(%sp),%d0 # count
407: morein:
408: movs.b (%a0)+,%d1 # fetch user byte
409: mov.b %d1,(%a1)+ # write supervisor byte
410: subq.l &0x1,%d0 # are we through yet?
411: bne.w morein # no; so, continue
412: rts
413:
414: ############################################################################
415:
416: #
417: # _060_real_trace():
418: #
419: # This is the exit point for the 060FPSP when an instruction is being traced
420: # and there are no other higher priority exceptions pending for this instruction
421: # or they have already been processed.
422: #
423: # The sample code below simply executes an "rte".
424: #
425: global _060_real_trace
426: _060_real_trace:
427: rte
428:
429: #
430: # _060_real_access():
431: #
432: # This is the exit point for the 060FPSP when an access error exception
433: # is encountered. The routine below should point to the operating system
434: # handler for access error exceptions. The exception stack frame is an
435: # 8-word access error frame.
436: #
437: # The sample routine below simply executes an "rte" instruction which
438: # is most likely the incorrect thing to do and could put the system
439: # into an infinite loop.
440: #
441: global _060_real_access
442: _060_real_access:
443: rte
CVSweb