summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2004-12-12 19:21:58 +0000
committercognet <cognet@FreeBSD.org>2004-12-12 19:21:58 +0000
commit8e56111fcd115097003ae63d5e513e78f8f465d2 (patch)
tree9d30f6ff79910baa3f84922592a1a181302c0cd9 /sys/arm
parent1a2e3006535167d1509bedcdace0b6c1e80c5d6d (diff)
downloadFreeBSD-src-8e56111fcd115097003ae63d5e513e78f8f465d2.zip
FreeBSD-src-8e56111fcd115097003ae63d5e513e78f8f465d2.tar.gz
Save a few more cycles in cpu_switch() and cpu_throw().
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/arm/swtch.S53
1 files changed, 24 insertions, 29 deletions
diff --git a/sys/arm/arm/swtch.S b/sys/arm/arm/swtch.S
index 7964835..44bfefb 100644
--- a/sys/arm/arm/swtch.S
+++ b/sys/arm/arm/swtch.S
@@ -128,11 +128,9 @@ __FBSDID("$FreeBSD$");
.Lcpu_do_powersave:
.word _C_LABEL(cpu_do_powersave)
ENTRY(cpu_throw)
- mov r4, r0
mov r5, r1
/*
- * r4 = oldtd
* r5 = newtd
*/
@@ -148,7 +146,6 @@ ENTRY(cpu_throw)
/*
* r0 = Pointer to L1 slot for vector_page (or NULL)
* r1 = lwp0's DACR
- * r4 = lwp we're switching from
* r5 = lwp0
* r6 = exit func
* r7 = lwp0's PCB
@@ -200,9 +197,15 @@ ENTRY(cpu_throw)
ldr r13, [r7, #(PCB_SP)]
#endif
- mov r0, #0x00000000 /* r5 = old lwp = NULL */
- mov r1, r5
- b .Lswitch_resume
+ /* We have a new curthread now so make a note it */
+ ldr r6, .Lcurthread
+ str r5, [r6]
+
+ /* Hook in a new pcb */
+ ldr r6, .Lcurpcb
+ str r7, [r6]
+
+ ldmfd sp, {r4-r7, pc}
ENTRY(cpu_switch)
stmfd sp!, {r4-r7, lr}
@@ -228,16 +231,6 @@ ENTRY(cpu_switch)
ldr r2, [r1, #TD_PCB]
str r2, [r7]
-
- /*
- * If the old lwp on entry to cpu_switch was zero then the
- * process that called it was exiting. This means that we do
- * not need to save the current context. Instead we can jump
- * straight to restoring the context for the new process.
- */
- teq r0, #0x00000000
- beq .Lswitch_return
-
/* rem: r1 = new process */
/* rem: interrupts are enabled */
@@ -267,16 +260,15 @@ ENTRY(cpu_switch)
/* r1 now free! */
+ mrs r3, cpsr
/*
- * This can be optimised... We know we want to go from SVC32
- * mode to UND32 mode
+ * We can do that, since
+ * PSR_SVC32_MODE|PSR_UND32_MODE == MSR_UND32_MODE
*/
- mrs r3, cpsr
- bic r2, r3, #(PSR_MODE)
- orr r2, r2, #(PSR_UND32_MODE)
- msr cpsr_c, r2
+ orr r8, r3, #(PSR_UND32_MODE)
+ msr cpsr_c, r8
- str sp, [r8, #(PCB_UND_SP)]
+ str sp, [r2, #(PCB_UND_SP)]
msr cpsr_c, r3 /* Restore the old mode */
/* rem: r8 = old PCB */
@@ -378,6 +370,10 @@ ENTRY(cpu_switch)
movne r0, #0 /* We *know* vector_page's VA is 0x0 */
movne lr, pc
ldrne pc, [r10, #CF_TLB_FLUSHID_SE]
+ /*
+ * We can do that, since
+ * PSR_SVC32_MODE|PSR_UND32_MODE == MSR_UND32_MODE
+ */
.Lcs_context_switched:
@@ -385,14 +381,13 @@ ENTRY(cpu_switch)
/* rem: r9 = new PCB */
+ mrs r3, cpsr
/*
- * This can be optimised... We know we want to go from SVC32
- * mode to UND32 mode
+ * We can do that, since
+ * PSR_SVC32_MODE|PSR_UND32_MODE == MSR_UND32_MODE
*/
- mrs r3, cpsr
- bic r2, r3, #(PSR_MODE)
- orr r2, r2, #(PSR_UND32_MODE)
- msr cpsr_c, r2
+ orr r2, r3, #(PSR_UND32_MODE)
+ msr cpsr_c, r2
ldr sp, [r9, #(PCB_UND_SP)]
OpenPOWER on IntegriCloud