Changeset View
Changeset View
Standalone View
Standalone View
sys/arm/arm/fusu.S
Show First 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
ENTRY(casueword) | ENTRY(casueword) | ||||
EENTRY_NP(casueword32) | EENTRY_NP(casueword32) | ||||
stmfd sp!, {r4, r5, r6} | stmfd sp!, {r4, r5, r6} | ||||
ldr r4, =(VM_MAXUSER_ADDRESS-3) | ldr r4, =(VM_MAXUSER_ADDRESS-3) | ||||
cmp r0, r4 | cmp r0, r4 | ||||
mvncs r0, #0 | mvncs r0, #0 | ||||
bcs 2f | bcs 1f | ||||
GET_PCB(r6) | GET_PCB(r6) | ||||
ldr r6, [r6] | ldr r6, [r6] | ||||
#ifdef DIAGNOSTIC | #ifdef DIAGNOSTIC | ||||
teq r6, #0x00000000 | teq r6, #0x00000000 | ||||
ldmfdeq sp!, {r4, r5, r6} | ldmfdeq sp!, {r4, r5, r6} | ||||
beq .Lfusupcbfault | beq .Lfusupcbfault | ||||
#endif | #endif | ||||
adr r4, .Lcasuwordfault | adr r4, .Lcasuwordfault | ||||
str r4, [r6, #PCB_ONFAULT] | str r4, [r6, #PCB_ONFAULT] | ||||
#if __ARM_ARCH >= 6 | #if __ARM_ARCH >= 6 | ||||
1: | mov r5, #1 | ||||
ldrex r4, [r0] | ldrex r4, [r0] | ||||
cmp r4, r1 | cmp r4, r1 | ||||
strexeq r5, r3, [r0] | strexeq r5, r3, [r0] | ||||
cmpeq r5, #1 | |||||
beq 1b | |||||
#else | #else | ||||
ldrt r4, [r0] | ldrt r4, [r0] | ||||
cmp r4, r1 | cmp r4, r1 | ||||
strteq r3, [r0] | strteq r3, [r0] | ||||
#endif | #endif | ||||
str r4, [r2] | str r4, [r2] | ||||
mov r0, #0 | mov r0, #0 | ||||
str r0, [r6, #PCB_ONFAULT] | str r0, [r6, #PCB_ONFAULT] | ||||
2: | #if __ARM_ARCH >= 6 | ||||
mov r0, r5 | |||||
#endif | |||||
1: | |||||
ldmfd sp!, {r4, r5, r6} | ldmfd sp!, {r4, r5, r6} | ||||
RET | RET | ||||
EEND(casueword32) | EEND(casueword32) | ||||
END(casueword) | END(casueword) | ||||
/* | /* | ||||
* Handle faults from casuword. Clean up and return -1. | * Handle faults from casuword. Clean up and return -1. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 224 Lines • Show Last 20 Lines |