move over from the sun3 tree, and generalize so that the sun3 sfc/dfc

twiddling doesn't happen on the rest of the archs.  this file should
be included by m68k ports via '#include "m68k/copy.s"' at the end of
locore.  arguably, it should be linked in from a seperate .o, but
i can't untangle the necessary include file inclusions w/o a m68k to
compile on.
This commit is contained in:
cgd 1994-01-21 22:50:10 +00:00
parent 28bd1b4bb0
commit 756f7e744f
1 changed files with 67 additions and 50 deletions

View File

@ -1,7 +1,13 @@
/*
* Copyright (c) 1993 Adam Glass
* Copyright (c) 1993 Adam Glass.
* Copyright (c) 1988 University of Utah.
* Copyright (c) 1980, 1990 The Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* the Systems Programming Group of the University of Utah Computer
* Science Department.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -12,11 +18,13 @@
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Adam Glass.
* 4. The name of the Author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY Adam Glass ``AS IS'' AND
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
@ -28,9 +36,23 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Header: /cvsroot/src/sys/arch/m68k/m68k/copy.s,v 1.4 1993/10/12 05:25:41 glass Exp $
* from: Utah Hdr: locore.s 1.58 91/04/22
* from: (hp300) @(#)locore.s 7.11 (Berkeley) 5/9/91
* $Id: copy.s,v 1.5 1994/01/21 22:50:10 cgd Exp $
*/
#ifdef sun3 /* but code this simple prolly won't work for sun3x -- cgd */
#define SETUP_SFC moveq #FC_USERD, d1; movec d1, sfc
#define RESTORE_SFC moveq #FC_CONTROL, d1; movec d1, sfc
#define SETUP_DFC moveq #FC_USERD, d1; movec d1, dfc
#define RESTORE_DFC moveq #FC_CONTROL, d1; movec d1, dfc
#else
#define SETUP_SFC
#define RESTORE_SFC
#define SETUP_DFC
#define RESTORE_DFC
#endif
.text
/*
* copyinstr(fromaddr, toaddr, maxlength, &lencopied)
@ -44,8 +66,7 @@ ENTRY(copyinstr)
movl #Lcisflt1,a0@(PCB_ONFAULT) | set up to catch faults
movl sp@(4),a0 | a0 = fromaddr
movl sp@(8),a1 | a1 = toaddr
moveq #FC_USERD, d1
movec d1, sfc
SETUP_SFC
moveq #0,d0
movw sp@(14),d0 | d0 = maxlength
jlt Lcisflt1 | negative count, error
@ -58,8 +79,7 @@ Lcisloop:
jne Lcisflt2 | ran out of room, error
moveq #0,d0 | got a null, all done
Lcisdone:
moveq #FC_CONTROL, d1
movec d1, sfc
RESTORE_SFC
tstl sp@(16) | return length desired?
jeq Lcisret | no, just return
subl sp@(4),a0 | determine how much was copied
@ -88,8 +108,7 @@ ENTRY(copyoutstr)
movl #Lcosflt1,a0@(PCB_ONFAULT) | set up to catch faults
movl sp@(4),a0 | a0 = fromaddr
movl sp@(8),a1 | a1 = toaddr
moveq #FC_USERD, d1
movec d1, dfc
SETUP_DFC
moveq #0,d0
movw sp@(14),d0 | d0 = maxlength
jlt Lcosflt1 | negative count, error
@ -102,8 +121,7 @@ Lcosloop:
jne Lcosflt2 | ran out of room, error
moveq #0,d0 | got a null, all done
Lcosdone:
moveq #FC_CONTROL, d1
movec d1, dfc
RESTORE_DFC
tstl sp@(16) | return length desired?
jeq Lcosret | no, just return
subl sp@(4),a0 | determine how much was copied
@ -165,8 +183,7 @@ ENTRY(copyin)
movl d2,sp@- | scratch register
movl _curpcb,a0 | current pcb
movl #Lciflt,a0@(PCB_ONFAULT) | set up to catch faults
moveq #FC_USERD, d1
movec d1, sfc
SETUP_SFC
movl sp@(16),d2 | check count
jlt Lciflt | negative, error
jeq Lcidone | zero, done
@ -202,8 +219,7 @@ Lcibloop:
Lcidone:
moveq #0,d0 | success
Lciexit:
moveq #FC_CONTROL, d1
movec d1, sfc
RESTORE_SFC
movl _curpcb,a0 | current pcb
clrl a0@(PCB_ONFAULT) | clear fault catcher
movl sp@+,d2 | restore scratch reg
@ -222,8 +238,7 @@ ENTRY(copyout)
movl d2,sp@- | scratch register
movl _curpcb,a0 | current pcb
movl #Lcoflt,a0@(PCB_ONFAULT) | catch faults
moveq #FC_USERD, d1
movec d1, dfc
SETUP_DFC
movl sp@(16),d2 | check count
jlt Lcoflt | negative, error
jeq Lcodone | zero, done
@ -259,8 +274,7 @@ Lcobloop:
Lcodone:
moveq #0,d0 | success
Lcoexit:
moveq #FC_CONTROL, d1
movec d1, dfc
RESTORE_DFC
movl _curpcb,a0 | current pcb
clrl a0@(PCB_ONFAULT) | clear fault catcher
movl sp@+,d2 | restore scratch reg
@ -273,73 +287,76 @@ Lcoflt:
* {fu,su},{byte,sword,word}
*/
TWOENTRY(fuword,fuiword)
moveq #FC_USERD, d1
movec d1, sfc
SETUP_SFC
movl sp@(4),a0 | address to read
movl _curpcb,a1 | current pcb
movl #Lfserr,a1@(PCB_ONFAULT) | where to return to on a fault
movl #Lferr,a1@(PCB_ONFAULT) | where to return to on a fault
movsl a0@,d0 | do read from user space
jra Lfsdone
jra Lfdone
ENTRY(fusword)
moveq #FC_USERD, d1
movec d1, sfc
SETUP_SFC
movl sp@(4),a0
movl _curpcb,a1 | current pcb
movl #Lfserr,a1@(PCB_ONFAULT) | where to return to on a fault
movl #Lferr,a1@(PCB_ONFAULT) | where to return to on a fault
moveq #0,d0
movsw a0@,d0 | do read from user space
jra Lfsdone
jra Lfdone
TWOENTRY(fubyte,fuibyte)
moveq #FC_USERD, d1
movec d1, sfc
SETUP_SFC
movl sp@(4),a0 | address to read
movl _curpcb,a1 | current pcb
movl #Lfserr,a1@(PCB_ONFAULT) | where to return to on a fault
movl #Lferr,a1@(PCB_ONFAULT) | where to return to on a fault
moveq #0,d0
movsb a0@,d0 | do read from user space
jra Lfsdone
jra Lfdone
Lfserr:
Lferr:
moveq #-1,d0 | error indicator
Lfsdone:
moveq #FC_CONTROL, d1
movec d1, sfc
Lfdone:
RESTORE_SFC
clrl a1@(PCB_ONFAULT) | clear fault address
rts
TWOENTRY(suword,suiword)
moveq #FC_USERD, d1
movec d1, dfc
SETUP_DFC
movl sp@(4),a0 | address to write
movl sp@(8),d0 | value to put there
movl _curpcb,a1 | current pcb
movl #Lfserr,a1@(PCB_ONFAULT) | where to return to on a fault
movl #Lserr,a1@(PCB_ONFAULT) | where to return to on a fault
movsl d0,a0@ | do write to user space
moveq #0,d0 | indicate no fault
jra Lfsdone
jra Lsdone
ENTRY(susword)
moveq #FC_USERD, d1
movec d1, dfc
SETUP_DFC
movl sp@(4),a0 | address to write
movw sp@(10),d0 | value to put there
movl _curpcb,a1 | current pcb
movl #Lfserr,a1@(PCB_ONFAULT) | where to return to on a fault
movl #Lserr,a1@(PCB_ONFAULT) | where to return to on a fault
movsw d0,a0@ | do write to user space
moveq #0,d0 | indicate no fault
jra Lfsdone
jra Lsdone
TWOENTRY(subyte,suibyte)
moveq #FC_USERD, d1
movec d1, dfc
SETUP_DFC
movl sp@(4),a0 | address to write
movb sp@(11),d0 | value to put there
movl _curpcb,a1 | current pcb
movl #Lfserr,a1@(PCB_ONFAULT) | where to return to on a fault
movl #Lserr,a1@(PCB_ONFAULT) | where to return to on a fault
movsb d0,a0@ | do write to user space
moveq #0,d0 | indicate no fault
jra Lfsdone
jra Lsdone
Lserr:
moveq #-1,d0 | error indicator
Lsdone:
RESTORE_DFC
clrl a1@(PCB_ONFAULT) | clear fault address
rts
#undef SETUP_SFC
#undef RESTORE_SFC
#undef SETUP_DFC
#undef RESTORE_DFC