Save a few more cycles in cpu_switch() and cpu_throw().
This commit is contained in:
parent
6c98f40194
commit
eb64032876
@ -128,11 +128,9 @@ __FBSDID("$FreeBSD$");
|
|||||||
.Lcpu_do_powersave:
|
.Lcpu_do_powersave:
|
||||||
.word _C_LABEL(cpu_do_powersave)
|
.word _C_LABEL(cpu_do_powersave)
|
||||||
ENTRY(cpu_throw)
|
ENTRY(cpu_throw)
|
||||||
mov r4, r0
|
|
||||||
mov r5, r1
|
mov r5, r1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* r4 = oldtd
|
|
||||||
* r5 = newtd
|
* r5 = newtd
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -148,7 +146,6 @@ ENTRY(cpu_throw)
|
|||||||
/*
|
/*
|
||||||
* r0 = Pointer to L1 slot for vector_page (or NULL)
|
* r0 = Pointer to L1 slot for vector_page (or NULL)
|
||||||
* r1 = lwp0's DACR
|
* r1 = lwp0's DACR
|
||||||
* r4 = lwp we're switching from
|
|
||||||
* r5 = lwp0
|
* r5 = lwp0
|
||||||
* r6 = exit func
|
* r6 = exit func
|
||||||
* r7 = lwp0's PCB
|
* r7 = lwp0's PCB
|
||||||
@ -200,9 +197,15 @@ ENTRY(cpu_throw)
|
|||||||
ldr r13, [r7, #(PCB_SP)]
|
ldr r13, [r7, #(PCB_SP)]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mov r0, #0x00000000 /* r5 = old lwp = NULL */
|
/* We have a new curthread now so make a note it */
|
||||||
mov r1, r5
|
ldr r6, .Lcurthread
|
||||||
b .Lswitch_resume
|
str r5, [r6]
|
||||||
|
|
||||||
|
/* Hook in a new pcb */
|
||||||
|
ldr r6, .Lcurpcb
|
||||||
|
str r7, [r6]
|
||||||
|
|
||||||
|
ldmfd sp, {r4-r7, pc}
|
||||||
|
|
||||||
ENTRY(cpu_switch)
|
ENTRY(cpu_switch)
|
||||||
stmfd sp!, {r4-r7, lr}
|
stmfd sp!, {r4-r7, lr}
|
||||||
@ -228,16 +231,6 @@ ENTRY(cpu_switch)
|
|||||||
ldr r2, [r1, #TD_PCB]
|
ldr r2, [r1, #TD_PCB]
|
||||||
str r2, [r7]
|
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: r1 = new process */
|
||||||
/* rem: interrupts are enabled */
|
/* rem: interrupts are enabled */
|
||||||
|
|
||||||
@ -267,16 +260,15 @@ ENTRY(cpu_switch)
|
|||||||
|
|
||||||
/* r1 now free! */
|
/* r1 now free! */
|
||||||
|
|
||||||
/*
|
|
||||||
* This can be optimised... We know we want to go from SVC32
|
|
||||||
* mode to UND32 mode
|
|
||||||
*/
|
|
||||||
mrs r3, cpsr
|
mrs r3, cpsr
|
||||||
bic r2, r3, #(PSR_MODE)
|
/*
|
||||||
orr r2, r2, #(PSR_UND32_MODE)
|
* We can do that, since
|
||||||
msr cpsr_c, r2
|
* PSR_SVC32_MODE|PSR_UND32_MODE == MSR_UND32_MODE
|
||||||
|
*/
|
||||||
|
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 */
|
msr cpsr_c, r3 /* Restore the old mode */
|
||||||
/* rem: r8 = old PCB */
|
/* rem: r8 = old PCB */
|
||||||
@ -378,6 +370,10 @@ ENTRY(cpu_switch)
|
|||||||
movne r0, #0 /* We *know* vector_page's VA is 0x0 */
|
movne r0, #0 /* We *know* vector_page's VA is 0x0 */
|
||||||
movne lr, pc
|
movne lr, pc
|
||||||
ldrne pc, [r10, #CF_TLB_FLUSHID_SE]
|
ldrne pc, [r10, #CF_TLB_FLUSHID_SE]
|
||||||
|
/*
|
||||||
|
* We can do that, since
|
||||||
|
* PSR_SVC32_MODE|PSR_UND32_MODE == MSR_UND32_MODE
|
||||||
|
*/
|
||||||
|
|
||||||
.Lcs_context_switched:
|
.Lcs_context_switched:
|
||||||
|
|
||||||
@ -385,14 +381,13 @@ ENTRY(cpu_switch)
|
|||||||
|
|
||||||
/* rem: r9 = new PCB */
|
/* rem: r9 = new PCB */
|
||||||
|
|
||||||
/*
|
|
||||||
* This can be optimised... We know we want to go from SVC32
|
|
||||||
* mode to UND32 mode
|
|
||||||
*/
|
|
||||||
mrs r3, cpsr
|
mrs r3, cpsr
|
||||||
bic r2, r3, #(PSR_MODE)
|
/*
|
||||||
orr r2, r2, #(PSR_UND32_MODE)
|
* We can do that, since
|
||||||
msr cpsr_c, r2
|
* PSR_SVC32_MODE|PSR_UND32_MODE == MSR_UND32_MODE
|
||||||
|
*/
|
||||||
|
orr r2, r3, #(PSR_UND32_MODE)
|
||||||
|
msr cpsr_c, r2
|
||||||
|
|
||||||
ldr sp, [r9, #(PCB_UND_SP)]
|
ldr sp, [r9, #(PCB_UND_SP)]
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user