Move to motorola syntax
Change all branches to use j.. instead of b.. (branches now use byte offsets) (this causes it to go from 932 to 848 bytes of text) Add GETCURPCB macro. (binary identical before the b -> j changes)
This commit is contained in:
parent
c5563e5ccb
commit
cb0d6358fc
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: copy.s,v 1.43 2010/07/07 01:16:25 chs Exp $ */
|
||||
/* $NetBSD: copy.s,v 1.44 2013/07/22 17:52:21 matt Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
||||
@ -80,6 +80,12 @@
|
||||
.file "copy.s"
|
||||
.text
|
||||
|
||||
#ifdef CI_CURPCB
|
||||
#define GETCURPCB(r) movl _C_LABEL(cpu_info_store)+CI_CURPCB,r
|
||||
#else
|
||||
#define GETCURPCB(r) movl _C_LABEL(curpcb),r
|
||||
#endif
|
||||
|
||||
#ifdef DIAGNOSTIC
|
||||
/*
|
||||
* The following routines all use the "moves" instruction to access
|
||||
@ -93,7 +99,7 @@
|
||||
*/
|
||||
Lbadfc:
|
||||
PANIC("copy.s: bad sfc or dfc")
|
||||
bra Lbadfc
|
||||
jra Lbadfc
|
||||
#define CHECK_SFC movec %sfc,%d0; subql #FC_USERD,%d0; bne Lbadfc
|
||||
#define CHECK_DFC movec %dfc,%d0; subql #FC_USERD,%d0; bne Lbadfc
|
||||
#else /* DIAGNOSTIC */
|
||||
@ -114,57 +120,57 @@ Lbadfc:
|
||||
*/
|
||||
ENTRY(copyin)
|
||||
CHECK_SFC
|
||||
movl %sp@(12),%d0 | check count
|
||||
beq Lciret | == 0, don't do anything
|
||||
movl 12(%sp),%d0 | check count
|
||||
jeq Lciret | == 0, don't do anything
|
||||
#ifdef MAPPEDCOPY
|
||||
cmpl _C_LABEL(mappedcopysize),%d0 | size >= mappedcopysize
|
||||
bcc _C_LABEL(mappedcopyin) | yes, go do it the new way
|
||||
jcc _C_LABEL(mappedcopyin) | yes, go do it the new way
|
||||
#endif
|
||||
movl %d2,%sp@- | save scratch register
|
||||
movl _C_LABEL(curpcb),%a0 | set fault handler
|
||||
movl #Lcifault,%a0@(PCB_ONFAULT)
|
||||
movl %sp@(8),%a0 | src address
|
||||
movl %sp@(12),%a1 | dest address
|
||||
movl %d2,-(%sp) | save scratch register
|
||||
GETCURPCB(%a0) | set fault handler
|
||||
movl #Lcifault,PCB_ONFAULT(%a0)
|
||||
movl 8(%sp),%a0 | src address
|
||||
movl 12(%sp),%a1 | dest address
|
||||
movl %a0,%d1
|
||||
btst #0,%d1 | src address odd?
|
||||
beq Lcieven | no, skip alignment
|
||||
movsb %a0@+,%d2 | yes, copy a byte
|
||||
movb %d2,%a1@+
|
||||
jeq Lcieven | no, skip alignment
|
||||
movsb (%a0)+,%d2 | yes, copy a byte
|
||||
movb %d2,(%a1)+
|
||||
subql #1,%d0 | adjust count
|
||||
beq Lcidone | count 0, all done
|
||||
jeq Lcidone | count 0, all done
|
||||
Lcieven:
|
||||
movl %a1,%d1
|
||||
btst #0,%d1 | dest address odd?
|
||||
bne Lcibytes | yes, must copy bytes
|
||||
jne Lcibytes | yes, must copy bytes
|
||||
movl %d0,%d1 | OK, both even. Get count
|
||||
lsrl #2,%d1 | and convert to longwords
|
||||
beq Lcibytes | count 0, skip longword loop
|
||||
jeq Lcibytes | count 0, skip longword loop
|
||||
subql #1,%d1 | predecrement for dbf
|
||||
Lcilloop:
|
||||
movsl %a0@+,%d2 | copy a longword
|
||||
movl %d2,%a1@+
|
||||
movsl (%a0)+,%d2 | copy a longword
|
||||
movl %d2,(%a1)+
|
||||
dbf %d1,Lcilloop | decrement low word of count
|
||||
subil #0x10000,%d1 | decrement high word of count
|
||||
bcc Lcilloop
|
||||
jcc Lcilloop
|
||||
andl #3,%d0 | what remains
|
||||
beq Lcidone | nothing, all done
|
||||
jeq Lcidone | nothing, all done
|
||||
Lcibytes:
|
||||
subql #1,%d0 | predecrement for dbf
|
||||
Lcibloop:
|
||||
movsb %a0@+,%d2 | copy a byte
|
||||
movb %d2,%a1@+
|
||||
movsb (%a0)+,%d2 | copy a byte
|
||||
movb %d2,(%a1)+
|
||||
dbf %d0,Lcibloop | decrement low word of count
|
||||
subil #0x10000,%d0 | decrement high word of count
|
||||
bcc Lcibloop
|
||||
jcc Lcibloop
|
||||
clrl %d0 | no error
|
||||
Lcidone:
|
||||
movl _C_LABEL(curpcb),%a0 | clear fault handler
|
||||
clrl %a0@(PCB_ONFAULT)
|
||||
movl %sp@+,%d2 | restore scratch register
|
||||
GETCURPCB(%a0) | clear fault handler
|
||||
clrl PCB_ONFAULT(%a0)
|
||||
movl (%sp)+,%d2 | restore scratch register
|
||||
Lciret:
|
||||
rts
|
||||
Lcifault:
|
||||
bra Lcidone
|
||||
jra Lcidone
|
||||
|
||||
/*
|
||||
* copyout(void *from, void *to, size_t len);
|
||||
@ -179,57 +185,57 @@ Lcifault:
|
||||
*/
|
||||
ENTRY(copyout)
|
||||
CHECK_DFC
|
||||
movl %sp@(12),%d0 | check count
|
||||
beq Lcoret | == 0, don't do anything
|
||||
movl 12(%sp),%d0 | check count
|
||||
jeq Lcoret | == 0, don't do anything
|
||||
#ifdef MAPPEDCOPY
|
||||
cmpl _C_LABEL(mappedcopysize),%d0 | size >= mappedcopysize
|
||||
bcc _C_LABEL(mappedcopyout) | yes, go do it the new way
|
||||
jcc _C_LABEL(mappedcopyout) | yes, go do it the new way
|
||||
#endif
|
||||
movl %d2,%sp@- | save scratch register
|
||||
movl _C_LABEL(curpcb),%a0 | set fault handler
|
||||
movl #Lcofault,%a0@(PCB_ONFAULT)
|
||||
movl %sp@(8),%a0 | src address
|
||||
movl %sp@(12),%a1 | dest address
|
||||
movl %d2,-(%sp) | save scratch register
|
||||
GETCURPCB(%a0) | set fault handler
|
||||
movl #Lcofault,PCB_ONFAULT(%a0)
|
||||
movl 8(%sp),%a0 | src address
|
||||
movl 12(%sp),%a1 | dest address
|
||||
movl %a0,%d1
|
||||
btst #0,%d1 | src address odd?
|
||||
beq Lcoeven | no, skip alignment
|
||||
movb %a0@+,%d2 | yes, copy a byte
|
||||
movsb %d2,%a1@+
|
||||
jeq Lcoeven | no, skip alignment
|
||||
movb (%a0)+,%d2 | yes, copy a byte
|
||||
movsb %d2,(%a1)+
|
||||
subql #1,%d0 | adjust count
|
||||
beq Lcodone | count 0, all done
|
||||
jeq Lcodone | count 0, all done
|
||||
Lcoeven:
|
||||
movl %a1,%d1
|
||||
btst #0,%d1 | dest address odd?
|
||||
bne Lcobytes | yes, must copy bytes
|
||||
jne Lcobytes | yes, must copy bytes
|
||||
movl %d0,%d1 | OK, both even. Get count
|
||||
lsrl #2,%d1 | and convert to longwords
|
||||
beq Lcobytes | count 0, skip longword loop
|
||||
jeq Lcobytes | count 0, skip longword loop
|
||||
subql #1,%d1 | predecrement for dbf
|
||||
Lcolloop:
|
||||
movl %a0@+,%d2 | copy a longword
|
||||
movsl %d2,%a1@+
|
||||
movl (%a0)+,%d2 | copy a longword
|
||||
movsl %d2,(%a1)+
|
||||
dbf %d1,Lcolloop | decrement low word of count
|
||||
subil #0x10000,%d1 | decrement high word of count
|
||||
bcc Lcolloop
|
||||
jcc Lcolloop
|
||||
andl #3,%d0 | what remains
|
||||
beq Lcodone | nothing, all done
|
||||
jeq Lcodone | nothing, all done
|
||||
Lcobytes:
|
||||
subql #1,%d0 | predecrement for dbf
|
||||
Lcobloop:
|
||||
movb %a0@+,%d2 | copy a byte
|
||||
movsb %d2,%a1@+
|
||||
movb (%a0)+,%d2 | copy a byte
|
||||
movsb %d2,(%a1)+
|
||||
dbf %d0,Lcobloop | decrement low word of count
|
||||
subil #0x10000,%d0 | decrement high word of count
|
||||
bcc Lcobloop
|
||||
jcc Lcobloop
|
||||
clrl %d0 | no error
|
||||
Lcodone:
|
||||
movl _C_LABEL(curpcb),%a0 | clear fault handler
|
||||
clrl %a0@(PCB_ONFAULT)
|
||||
movl %sp@+,%d2 | restore scratch register
|
||||
GETCURPCB(%a0) | clear fault handler
|
||||
clrl PCB_ONFAULT(%a0)
|
||||
movl (%sp)+,%d2 | restore scratch register
|
||||
Lcoret:
|
||||
rts
|
||||
Lcofault:
|
||||
bra Lcodone
|
||||
jra Lcodone
|
||||
|
||||
/*
|
||||
* copystr(void *from, void *to, size_t maxlen, size_t *lencopied);
|
||||
@ -238,26 +244,26 @@ Lcofault:
|
||||
* string is too long, return ENAMETOOLONG; else return 0.
|
||||
*/
|
||||
ENTRY(copystr)
|
||||
movl %sp@(4),%a0 | a0 = fromaddr
|
||||
movl %sp@(8),%a1 | a1 = toaddr
|
||||
movl 4(%sp),%a0 | a0 = fromaddr
|
||||
movl 8(%sp),%a1 | a1 = toaddr
|
||||
clrl %d0
|
||||
movl %sp@(12),%d1 | count
|
||||
beq Lcstoolong | nothing to copy
|
||||
movl 12(%sp),%d1 | count
|
||||
jeq Lcstoolong | nothing to copy
|
||||
subql #1,%d1 | predecrement for dbeq
|
||||
Lcsloop:
|
||||
movb %a0@+,%a1@+ | copy a byte
|
||||
movb (%a0)+,(%a1)+ | copy a byte
|
||||
dbeq %d1,Lcsloop | decrement low word of count
|
||||
beq Lcsdone | copied null, exit
|
||||
jeq Lcsdone | copied null, exit
|
||||
subil #0x10000,%d1 | decrement high word of count
|
||||
bcc Lcsloop | more room, keep going
|
||||
jcc Lcsloop | more room, keep going
|
||||
Lcstoolong:
|
||||
moveq #ENAMETOOLONG,%d0 | ran out of space
|
||||
Lcsdone:
|
||||
tstl %sp@(16) | length desired?
|
||||
beq Lcsret
|
||||
subl %sp@(4),%a0 | yes, calculate length copied
|
||||
movl %sp@(16),%a1 | store at return location
|
||||
movl %a0,%a1@
|
||||
tstl 16(%sp) | length desired?
|
||||
jeq Lcsret
|
||||
subl 4(%sp),%a0 | yes, calculate length copied
|
||||
movl 16(%sp),%a1 | store at return location
|
||||
movl %a0,(%a1)
|
||||
Lcsret:
|
||||
rts
|
||||
|
||||
@ -270,35 +276,35 @@ Lcsret:
|
||||
*/
|
||||
ENTRY(copyinstr)
|
||||
CHECK_SFC
|
||||
movl _C_LABEL(curpcb),%a0 | set fault handler
|
||||
movl #Lcisfault,%a0@(PCB_ONFAULT)
|
||||
movl %sp@(4),%a0 | a0 = fromaddr
|
||||
movl %sp@(8),%a1 | a1 = toaddr
|
||||
GETCURPCB(%a0) | set fault handler
|
||||
movl #Lcisfault,PCB_ONFAULT(%a0)
|
||||
movl 4(%sp),%a0 | a0 = fromaddr
|
||||
movl 8(%sp),%a1 | a1 = toaddr
|
||||
clrl %d0
|
||||
movl %sp@(12),%d1 | count
|
||||
beq Lcistoolong | nothing to copy
|
||||
movl 12(%sp),%d1 | count
|
||||
jeq Lcistoolong | nothing to copy
|
||||
subql #1,%d1 | predecrement for dbeq
|
||||
Lcisloop:
|
||||
movsb %a0@+,%d0 | copy a byte
|
||||
movb %d0,%a1@+
|
||||
movsb (%a0)+,%d0 | copy a byte
|
||||
movb %d0,(%a1)+
|
||||
dbeq %d1,Lcisloop | decrement low word of count
|
||||
beq Lcisdone | copied null, exit
|
||||
jeq Lcisdone | copied null, exit
|
||||
subil #0x10000,%d1 | decrement high word of count
|
||||
bcc Lcisloop | more room, keep going
|
||||
jcc Lcisloop | more room, keep going
|
||||
Lcistoolong:
|
||||
moveq #ENAMETOOLONG,%d0 | ran out of space
|
||||
Lcisdone:
|
||||
tstl %sp@(16) | length desired?
|
||||
beq Lcisexit
|
||||
subl %sp@(4),%a0 | yes, calculate length copied
|
||||
movl %sp@(16),%a1 | store at return location
|
||||
movl %a0,%a1@
|
||||
tstl 16(%sp) | length desired?
|
||||
jeq Lcisexit
|
||||
subl 4(%sp),%a0 | yes, calculate length copied
|
||||
movl 16(%sp),%a1 | store at return location
|
||||
movl %a0,(%a1)
|
||||
Lcisexit:
|
||||
movl _C_LABEL(curpcb),%a0 | clear fault handler
|
||||
clrl %a0@(PCB_ONFAULT)
|
||||
GETCURPCB(%a0) | clear fault handler
|
||||
clrl PCB_ONFAULT(%a0)
|
||||
rts
|
||||
Lcisfault:
|
||||
bra Lcisdone
|
||||
jra Lcisdone
|
||||
|
||||
/*
|
||||
* copyoutstr(void *from, void *to, size_t maxlen, size_t *lencopied);
|
||||
@ -309,35 +315,35 @@ Lcisfault:
|
||||
*/
|
||||
ENTRY(copyoutstr)
|
||||
CHECK_DFC
|
||||
movl _C_LABEL(curpcb),%a0 | set fault handler
|
||||
movl #Lcosfault,%a0@(PCB_ONFAULT)
|
||||
movl %sp@(4),%a0 | a0 = fromaddr
|
||||
movl %sp@(8),%a1 | a1 = toaddr
|
||||
GETCURPCB(%a0) | set fault handler
|
||||
movl #Lcosfault,PCB_ONFAULT(%a0)
|
||||
movl 4(%sp),%a0 | a0 = fromaddr
|
||||
movl 8(%sp),%a1 | a1 = toaddr
|
||||
clrl %d0
|
||||
movl %sp@(12),%d1 | count
|
||||
beq Lcostoolong | nothing to copy
|
||||
movl 12(%sp),%d1 | count
|
||||
jeq Lcostoolong | nothing to copy
|
||||
subql #1,%d1 | predecrement for dbeq
|
||||
Lcosloop:
|
||||
movb %a0@+,%d0 | copy a byte
|
||||
movsb %d0,%a1@+
|
||||
movb (%a0)+,%d0 | copy a byte
|
||||
movsb %d0,(%a1)+
|
||||
dbeq %d1,Lcosloop | decrement low word of count
|
||||
beq Lcosdone | copied null, exit
|
||||
jeq Lcosdone | copied null, exit
|
||||
subil #0x10000,%d1 | decrement high word of count
|
||||
bcc Lcosloop | more room, keep going
|
||||
jcc Lcosloop | more room, keep going
|
||||
Lcostoolong:
|
||||
moveq #ENAMETOOLONG,%d0 | ran out of space
|
||||
Lcosdone:
|
||||
tstl %sp@(16) | length desired?
|
||||
beq Lcosexit
|
||||
subl %sp@(4),%a0 | yes, calculate length copied
|
||||
movl %sp@(16),%a1 | store at return location
|
||||
movl %a0,%a1@
|
||||
tstl 16(%sp) | length desired?
|
||||
jeq Lcosexit
|
||||
subl 4(%sp),%a0 | yes, calculate length copied
|
||||
movl 16(%sp),%a1 | store at return location
|
||||
movl %a0,(%a1)
|
||||
Lcosexit:
|
||||
movl _C_LABEL(curpcb),%a0 | clear fault handler
|
||||
clrl %a0@(PCB_ONFAULT)
|
||||
GETCURPCB(%a0) | clear fault handler
|
||||
clrl PCB_ONFAULT(%a0)
|
||||
rts
|
||||
Lcosfault:
|
||||
bra Lcosdone
|
||||
jra Lcosdone
|
||||
|
||||
/*
|
||||
* kcopy(const void *src, void *dst, size_t len);
|
||||
@ -351,23 +357,23 @@ Lcosfault:
|
||||
*/
|
||||
ENTRY(kcopy)
|
||||
link %a6,#-4
|
||||
movl _C_LABEL(curpcb),%a0 | set fault handler
|
||||
movl %a0@(PCB_ONFAULT),%a6@(-4) | save old handler first
|
||||
movl #Lkcfault,%a0@(PCB_ONFAULT)
|
||||
movl %a6@(16),%sp@- | push len
|
||||
movl %a6@(8),%sp@- | push src
|
||||
movl %a6@(12),%sp@- | push dst
|
||||
GETCURPCB(%a0) | set fault handler
|
||||
movl PCB_ONFAULT(%a0),-4(%a6) | save old handler first
|
||||
movl #Lkcfault,PCB_ONFAULT(%a0)
|
||||
movl 16(%a6),-(%sp) | push len
|
||||
movl 8(%a6),-(%sp) | push src
|
||||
movl 12(%a6),-(%sp) | push dst
|
||||
jbsr _C_LABEL(memcpy) | copy it
|
||||
addl #12,%sp | pop args
|
||||
clrl %d0 | success!
|
||||
Lkcdone:
|
||||
movl _C_LABEL(curpcb),%a0 | restore fault handler
|
||||
movl %a6@(-4),%a0@(PCB_ONFAULT)
|
||||
GETCURPCB(%a0) | restore fault handler
|
||||
movl -4(%a6),PCB_ONFAULT(%a0)
|
||||
unlk %a6
|
||||
rts
|
||||
Lkcfault:
|
||||
addl #16,%sp | pop args and return address
|
||||
bra Lkcdone
|
||||
jra Lkcdone
|
||||
|
||||
/*
|
||||
* fuword(void *uaddr);
|
||||
@ -375,11 +381,11 @@ Lkcfault:
|
||||
*/
|
||||
ENTRY(fuword)
|
||||
CHECK_SFC
|
||||
movl %sp@(4),%a0 | address to read
|
||||
movl _C_LABEL(curpcb),%a1 | set fault handler
|
||||
movl #Lferr,%a1@(PCB_ONFAULT)
|
||||
movsl %a0@,%d0 | do read from user space
|
||||
bra Lfdone
|
||||
movl 4(%sp),%a0 | address to read
|
||||
GETCURPCB(%a1) | set fault handler
|
||||
movl #Lferr,PCB_ONFAULT(%a1)
|
||||
movsl (%a0),%d0 | do read from user space
|
||||
jra Lfdone
|
||||
|
||||
/*
|
||||
* fusword(void *uaddr);
|
||||
@ -387,12 +393,12 @@ ENTRY(fuword)
|
||||
*/
|
||||
ENTRY(fusword)
|
||||
CHECK_SFC
|
||||
movl %sp@(4),%a0 | address to read
|
||||
movl _C_LABEL(curpcb),%a1 | set fault handler
|
||||
movl #Lferr,%a1@(PCB_ONFAULT)
|
||||
movl 4(%sp),%a0 | address to read
|
||||
GETCURPCB(%a1) | set fault handler
|
||||
movl #Lferr,PCB_ONFAULT(%a1)
|
||||
moveq #0,%d0
|
||||
movsw %a0@,%d0 | do read from user space
|
||||
bra Lfdone
|
||||
movsw (%a0),%d0 | do read from user space
|
||||
jra Lfdone
|
||||
|
||||
/*
|
||||
* fuswintr(void *uaddr);
|
||||
@ -401,12 +407,12 @@ ENTRY(fusword)
|
||||
*/
|
||||
ENTRY(fuswintr)
|
||||
CHECK_SFC
|
||||
movl %sp@(4),%a0 | address to read
|
||||
movl _C_LABEL(curpcb),%a1 | set fault handler
|
||||
movl #_C_LABEL(fubail),%a1@(PCB_ONFAULT)
|
||||
movl 4(%sp),%a0 | address to read
|
||||
GETCURPCB(%a1) | set fault handler
|
||||
movl #_C_LABEL(fubail),PCB_ONFAULT(%a1)
|
||||
moveq #0,%d0
|
||||
movsw %a0@,%d0 | do read from user space
|
||||
bra Lfdone
|
||||
movsw (%a0),%d0 | do read from user space
|
||||
jra Lfdone
|
||||
|
||||
/*
|
||||
* fubyte(void *uaddr);
|
||||
@ -414,12 +420,12 @@ ENTRY(fuswintr)
|
||||
*/
|
||||
ENTRY(fubyte)
|
||||
CHECK_SFC
|
||||
movl %sp@(4),%a0 | address to read
|
||||
movl _C_LABEL(curpcb),%a1 | set fault handler
|
||||
movl #Lferr,%a1@(PCB_ONFAULT)
|
||||
movl 4(%sp),%a0 | address to read
|
||||
GETCURPCB(%a1) | set fault handler
|
||||
movl #Lferr,PCB_ONFAULT(%a1)
|
||||
moveq #0,%d0
|
||||
movsb %a0@,%d0 | do read from user space
|
||||
bra Lfdone
|
||||
movsb (%a0),%d0 | do read from user space
|
||||
jra Lfdone
|
||||
|
||||
/*
|
||||
* Error routine for fuswintr. The fault handler in trap.c
|
||||
@ -433,7 +439,7 @@ ENTRY(fubail)
|
||||
Lferr:
|
||||
moveq #-1,%d0 | error indicator
|
||||
Lfdone:
|
||||
clrl %a1@(PCB_ONFAULT) | clear fault handler
|
||||
clrl PCB_ONFAULT(%a1) | clear fault handler
|
||||
rts
|
||||
|
||||
/*
|
||||
@ -442,13 +448,13 @@ Lfdone:
|
||||
*/
|
||||
ENTRY(suword)
|
||||
CHECK_DFC
|
||||
movl %sp@(4),%a0 | address to write
|
||||
movl %sp@(8),%d0 | value to put there
|
||||
movl _C_LABEL(curpcb),%a1 | set fault handler
|
||||
movl #Lserr,%a1@(PCB_ONFAULT)
|
||||
movsl %d0,%a0@ | do write to user space
|
||||
movl 4(%sp),%a0 | address to write
|
||||
movl 8(%sp),%d0 | value to put there
|
||||
GETCURPCB(%a1) | set fault handler
|
||||
movl #Lserr,PCB_ONFAULT(%a1)
|
||||
movsl %d0,(%a0) | do write to user space
|
||||
moveq #0,%d0 | indicate no fault
|
||||
bra Lsdone
|
||||
jra Lsdone
|
||||
|
||||
/*
|
||||
* susword(void *uaddr, short x);
|
||||
@ -456,13 +462,13 @@ ENTRY(suword)
|
||||
*/
|
||||
ENTRY(susword)
|
||||
CHECK_DFC
|
||||
movl %sp@(4),%a0 | address to write
|
||||
movw %sp@(10),%d0 | value to put there
|
||||
movl _C_LABEL(curpcb),%a1 | set fault handler
|
||||
movl #Lserr,%a1@(PCB_ONFAULT)
|
||||
movsw %d0,%a0@ | do write to user space
|
||||
movl 4(%sp),%a0 | address to write
|
||||
movw 10(%sp),%d0 | value to put there
|
||||
GETCURPCB(%a1) | set fault handler
|
||||
movl #Lserr,PCB_ONFAULT(%a1)
|
||||
movsw %d0,(%a0) | do write to user space
|
||||
moveq #0,%d0 | indicate no fault
|
||||
bra Lsdone
|
||||
jra Lsdone
|
||||
|
||||
/*
|
||||
* suswintr(void *uaddr, short x);
|
||||
@ -471,13 +477,13 @@ ENTRY(susword)
|
||||
*/
|
||||
ENTRY(suswintr)
|
||||
CHECK_DFC
|
||||
movl %sp@(4),%a0 | address to write
|
||||
movw %sp@(10),%d0 | value to put there
|
||||
movl _C_LABEL(curpcb),%a1 | set fault handler
|
||||
movl #_C_LABEL(subail),%a1@(PCB_ONFAULT)
|
||||
movsw %d0,%a0@ | do write to user space
|
||||
movl 4(%sp),%a0 | address to write
|
||||
movw 10(%sp),%d0 | value to put there
|
||||
GETCURPCB(%a1) | set fault handler
|
||||
movl #_C_LABEL(subail),PCB_ONFAULT(%a1)
|
||||
movsw %d0,(%a0) | do write to user space
|
||||
moveq #0,%d0 | indicate no fault
|
||||
bra Lsdone
|
||||
jra Lsdone
|
||||
|
||||
/*
|
||||
* subyte(void *uaddr, char x);
|
||||
@ -485,13 +491,13 @@ ENTRY(suswintr)
|
||||
*/
|
||||
ENTRY(subyte)
|
||||
CHECK_DFC
|
||||
movl %sp@(4),%a0 | address to write
|
||||
movb %sp@(11),%d0 | value to put there
|
||||
movl _C_LABEL(curpcb),%a1 | set fault handler
|
||||
movl #Lserr,%a1@(PCB_ONFAULT)
|
||||
movsb %d0,%a0@ | do write to user space
|
||||
movl 4(%sp),%a0 | address to write
|
||||
movb 11(%sp),%d0 | value to put there
|
||||
GETCURPCB(%a1) | set fault handler
|
||||
movl #Lserr,PCB_ONFAULT(%a1)
|
||||
movsb %d0,(%a0) | do write to user space
|
||||
moveq #0,%d0 | indicate no fault
|
||||
bra Lsdone
|
||||
jra Lsdone
|
||||
|
||||
/*
|
||||
* Error routine for suswintr. The fault handler in trap.c
|
||||
@ -505,7 +511,7 @@ ENTRY(subail)
|
||||
Lserr:
|
||||
moveq #-1,%d0 | error indicator
|
||||
Lsdone:
|
||||
clrl %a1@(PCB_ONFAULT) | clear fault handler
|
||||
clrl PCB_ONFAULT(%a1) | clear fault handler
|
||||
rts
|
||||
|
||||
/*
|
||||
@ -517,25 +523,25 @@ Lsdone:
|
||||
ENTRY(ucas_32)
|
||||
CHECK_SFC
|
||||
CHECK_DFC
|
||||
movl _C_LABEL(curpcb),%a1
|
||||
movl #Lucasfault,%a1@(PCB_ONFAULT) | set fault handler
|
||||
movl %sp@(4),%a0 | a0 = uptr
|
||||
GETCURPCB(%a1)
|
||||
movl #Lucasfault,PCB_ONFAULT(%a1) | set fault handler
|
||||
movl 4(%sp),%a0 | a0 = uptr
|
||||
_C_LABEL(ucas_32_ras_start):
|
||||
movl %sp@(8),%d0 | d0 = old
|
||||
movsl %a0@,%d1 | d1 = *uptr
|
||||
movl 8(%sp),%d0 | d0 = old
|
||||
movsl (%a0),%d1 | d1 = *uptr
|
||||
cmpl %d0,%d1 | does *uptr == old?
|
||||
bne Lucasdiff | if not, don't change it
|
||||
movl %sp@(12),%d0 | d0 = new
|
||||
movsl %d0,%a0@ | *uptr = new
|
||||
jne Lucasdiff | if not, don't change it
|
||||
movl 12(%sp),%d0 | d0 = new
|
||||
movsl %d0,(%a0) | *uptr = new
|
||||
nop | pipeline sync
|
||||
_C_LABEL(ucas_32_ras_end):
|
||||
Lucasdiff:
|
||||
movl %sp@(16),%a0 | a0 = ret
|
||||
movl %d1,%a0@ | *ret = d1 (old *uptr)
|
||||
movl 16(%sp),%a0 | a0 = ret
|
||||
movl %d1,(%a0) | *ret = d1 (old *uptr)
|
||||
clrl %d0 | return 0
|
||||
|
||||
Lucasfault:
|
||||
clrl %a1@(PCB_ONFAULT) | clear fault handler
|
||||
clrl PCB_ONFAULT(%a1) | clear fault handler
|
||||
rts
|
||||
|
||||
STRONG_ALIAS(ucas_int,ucas_32)
|
||||
|
Loading…
Reference in New Issue
Block a user