#include <machine/asm.h>
#include <machine/armreg.h>
#include "assym.inc"
.syntax unified
#define GET_PCB(tmp) \
mrc p15, 0, tmp, c13, c0, 4; \
add tmp, tmp, #(TD_PCB)
ENTRY(casueword)
EENTRY_NP(casueword32)
stmfd sp!, {r4, r5, r6}
ldr r4, =(VM_MAXUSER_ADDRESS-3)
cmp r0, r4
mvncs r0, #0
bcs 1f
GET_PCB(r6)
ldr r6, [r6]
#ifdef DIAGNOSTIC
teq r6, #0x00000000
ldmfdeq sp!, {r4, r5, r6}
beq .Lfusupcbfault
#endif
adr r4, .Lcasuwordfault
str r4, [r6, #PCB_ONFAULT]
mov r5, #1
ldrex r4, [r0]
cmp r4, r1
strexeq r5, r3, [r0]
str r4, [r2]
mov r0, #0
str r0, [r6, #PCB_ONFAULT]
mov r0, r5
1:
ldmfd sp!, {r4, r5, r6}
RET
EEND(casueword32)
END(casueword)
.Lcasuwordfault:
mov r0, #0x00000000
str r0, [r6, #PCB_ONFAULT]
mvn r0, #0
ldmfd sp!, {r4, r5, r6}
RET
ENTRY(fueword)
EENTRY_NP(fueword32)
ldr r3, =(VM_MAXUSER_ADDRESS-3)
cmp r0, r3
mvncs r0, #0
RETc(cs)
GET_PCB(r2)
ldr r2, [r2]
#ifdef DIAGNOSTIC
teq r2, #0x00000000
beq .Lfusupcbfault
#endif
adr r3, .Lfusufault
str r3, [r2, #PCB_ONFAULT]
ldrt r3, [r0]
str r3, [r1]
mov r0, #0x00000000
str r0, [r2, #PCB_ONFAULT]
RET
EEND(fueword32)
END(fueword)
ENTRY(fusword)
ldr r3, =(VM_MAXUSER_ADDRESS-1)
cmp r0, r3
mvncs r0, #0
RETc(cs)
GET_PCB(r2)
ldr r2, [r2]
#ifdef DIAGNOSTIC
teq r2, #0x00000000
beq .Lfusupcbfault
#endif
adr r1, .Lfusufault
str r1, [r2, #PCB_ONFAULT]
ldrbt r3, [r0], #1
ldrbt ip, [r0]
orr r0, r3, ip, asl #8
mov r1, #0x00000000
str r1, [r2, #PCB_ONFAULT]
RET
END(fusword)
ENTRY(fubyte)
ldr r3, =VM_MAXUSER_ADDRESS
cmp r0, r3
mvncs r0, #0
RETc(cs)
GET_PCB(r2)
ldr r2, [r2]
#ifdef DIAGNOSTIC
teq r2, #0x00000000
beq .Lfusupcbfault
#endif
adr r1, .Lfusufault
str r1, [r2, #PCB_ONFAULT]
ldrbt r3, [r0]
mov r1, #0x00000000
str r1, [r2, #PCB_ONFAULT]
mov r0, r3
RET
END(fubyte)
.Lfusufault:
mov r0, #0x00000000
str r0, [r2, #PCB_ONFAULT]
mvn r0, #0x00000000
RET
#ifdef DIAGNOSTIC
.Lfusupcbfault:
mov r1, r0
adr r0, fusupcbfaulttext
b _C_LABEL(panic)
fusupcbfaulttext:
.asciz "Yikes - no valid PCB during fusuxxx() addr=%08x\n"
.align 2
#endif
ENTRY(suword16)
ldr r3, =(VM_MAXUSER_ADDRESS-3)
cmp r0, r3
mvncs r0, #0
RETc(cs)
GET_PCB(r2)
ldr r2, [r2]
#ifdef DIAGNOSTIC
teq r2, #0x00000000
beq .Lfusupcbfault
#endif
adr r3, .Lfusufault
str r3, [r2, #PCB_ONFAULT]
strht r1, [r0], #0
mov r0, #0x00000000
str r0, [r2, #PCB_ONFAULT]
RET
END(suword16)
ENTRY(suword)
EENTRY_NP(suword32)
ldr r3, =(VM_MAXUSER_ADDRESS-3)
cmp r0, r3
mvncs r0, #0
RETc(cs)
GET_PCB(r2)
ldr r2, [r2]
#ifdef DIAGNOSTIC
teq r2, #0x00000000
beq .Lfusupcbfault
#endif
adr r3, .Lfusufault
str r3, [r2, #PCB_ONFAULT]
strt r1, [r0]
mov r0, #0x00000000
str r0, [r2, #PCB_ONFAULT]
RET
EEND(suword32)
END(suword)
ENTRY(susword)
ldr r3, =(VM_MAXUSER_ADDRESS-1)
cmp r0, r3
mvncs r0, #0
RETc(cs)
GET_PCB(r2)
ldr r2, [r2]
#ifdef DIAGNOSTIC
teq r2, #0x00000000
beq .Lfusupcbfault
#endif
adr r3, .Lfusufault
str r3, [r2, #PCB_ONFAULT]
strbt r1, [r0], #1
mov r1, r1, lsr #8
strbt r1, [r0]
mov r0, #0x00000000
str r0, [r2, #PCB_ONFAULT]
RET
END(susword)
ENTRY(subyte)
ldr r3, =VM_MAXUSER_ADDRESS
cmp r0, r3
mvncs r0, #0
RETc(cs)
GET_PCB(r2)
ldr r2, [r2]
#ifdef DIAGNOSTIC
teq r2, #0x00000000
beq .Lfusupcbfault
#endif
adr r3, .Lfusufault
str r3, [r2, #PCB_ONFAULT]
strbt r1, [r0]
mov r0, #0x00000000
str r0, [r2, #PCB_ONFAULT]
RET
END(subyte)