t-kernel team mailing list archive
-
t-kernel team
-
Mailing list archive
-
Message #00084
[PATCH] monitor: rewrite monhdr.S, entering monitor
From: Du Huanpeng <u74147@xxxxxxxxx>
Signed-off-by: Du Huanpeng <u74147@xxxxxxxxx>
---
tkernel_source/monitor/hwdepend/arm/cpu/monhdr.S | 268 +++--------------------
tkernel_source/monitor/tmmain/monkey.S | 2 +
2 files changed, 33 insertions(+), 237 deletions(-)
diff --git a/tkernel_source/monitor/hwdepend/arm/cpu/monhdr.S b/tkernel_source/monitor/hwdepend/arm/cpu/monhdr.S
index 15383a9..a4d93b0 100755
--- a/tkernel_source/monitor/hwdepend/arm/cpu/monhdr.S
+++ b/tkernel_source/monitor/hwdepend/arm/cpu/monhdr.S
@@ -1,4 +1,11 @@
/*
+ * original: tkernel_source/monitor/cmdsvc/src/armv6/monhdr.S
+ *
+ * store registers to __stack_regs and branch to monitor.
+ * initial for arm926ej-s core
+ */
+
+/*
*----------------------------------------------------------------------
* T-Kernel 2.0 Software Package
*
@@ -38,13 +45,12 @@
* lr = indeterminate
*/
.text
- .balign 4
- .globl Csym(_defaultHdr)
- .type Csym(_defaultHdr), %function
-Csym(_defaultHdr):
+ .align 2
+ .globl _defaultHdr
+ .type _defaultHdr, %function
+_defaultHdr:
b Csym(entMonitor) // call entMonitor(vec)
-__stack_regs
/*
* save registers
* __stack_regs_limit[0x00-0x0F] usr, r0-r14, cpsr
@@ -56,245 +62,33 @@ __stack_regs
* TODO: cp15
*/
+/*
+ * usr mode -> return
+ * svc mode -> go
+ * the caller must have it's own stack and the registers saved to it's own stack.
+ */
- // save register
- // regStack[0-7] r0 .. r7
- // [8,9] Entry cspr, ip
- // [10] return cspr
- // [11] return r15(pc)
- // [12-18] USR: r8 ..r12, sp, lr
- // [19-26] FIQ: spsr, r8 ..r12, sp, lr
- // [27-29] IRQ: spsr, sp, lr
- // [30-32] ABT: spsr, sp, lr
- // [33-35] UND: spsr, sp, lr
- // [36-38] SVC: spsr, sp, lr
- // [39] CP15: SCTLR (CP15.c1.0.c0.0)
- // [40-42] TTBR0,TTBR1,TTBCR (CP15.c2.0.c0.0 - 2)
- // [43] DACR (CP15.c3.0.c0.0)
- // [44-45] DFSR,IFSR (CP15.c5.0.c0.0 - 1)
- // [46-47] DFAR,IFAR (CP15.c6.0.c0.0,2)
- // [48] CTXIDR (CP15.c13.0.c0.1)
-
- // save r0 .. r7
- ldr lr, =Csym(regStack)
- stmia lr!, {r0-r2} // r0 .. r2
-
- // restore R3 inside stack in the case of interrupt
- mrs r1, cpsr // cpsr -> r1
- and r0, r1, #PSR_M(31)
- cmp r0, #PSR_FIQ
- cmpne r0, #PSR_IRQ
- ldmeqfd sp!, {r3} // in the case of interrupt
-
- stmia lr!, {r3-r7} // r3 .. r7
- mov r7, lr // regStack -> r7
-
- // save the status on entry (cpsr, ip)
-#if __TRON_ARM_ARCH__ >= 6
- cpsid aif // disable FIQ and IRQ
-#else
- mrs r0, spsr
- bic r0, #0x80 @ irq
- bic r0, #0x40 @ fiq
- msr spsr, r0
-#endif
- stmia r7!, {r1, ip} // Entry cspr & ip saved
-
- // restore ip, lr, spsr from the values inside stack and return
- ldr r2, =EIT_VECTBL
- sub r0, ip, r2
- mov r0, r0, asr #2 // interrupt/exception vector number -> r0
- ldmfd sp!, {ip, lr} // restore ip and lr
- ldmfd sp!, {r2} // r2 <- spsr restored
- stmia r7!, {r2, lr} // save spsr, lr(pc)
-
- // save registers of each mode
- stmia r7, {r8-r12,sp,lr}^ // usr: r8 .. r12,sp,lr
- add r7, r7, #(4*7)
-
-#if __TRON_ARM_ARCH__ >= 6
- cps #PSR_FIQ
-#else
- mrs r3,cpsr
- bic r3,r3,#0x1f
- orr r3,r3,#0x11
- msr cpsr,r3
-#endif
- mrs r3, spsr
- stmia r7!, {r3, r8-r12,sp,lr} // fiq: spsr, r8 .. r12,sp,lr
-
-#if __TRON_ARM_ARCH__ >= 6
- cps #PSR_IRQ
-#else
- mrs r3,cpsr
- bic r3,r3,#0x1f
- orr r3,r3,#0x12
- msr cpsr,r3
-#endif
- mrs r3, spsr
- stmia r7!, {r3, sp, lr} // irq: spsr, sp, lr
-
-#if __TRON_ARM_ARCH__ >= 6
- cps #PSR_ABT
-#else
- mrs r3,cpsr
- bic r3,r3,#0x1f
- orr r3,r3,#0x17
- msr cpsr,r3
-#endif
- mrs r3, spsr
- stmia r7!, {r3, sp, lr} // abt: spsr, sp, lr
-
-#if __TRON_ARM_ARCH__ >= 6
- cps #PSR_UND
-#else
- mrs r3,cpsr
- bic r3,r3,#0x1f
- orr r3,r3,#0x1B
- msr cpsr,r3
-#endif
- mrs r3, spsr
- stmia r7!, {r3, sp, lr} // und: spsr, sp, lr
-
-#if __TRON_ARM_ARCH__ >= 6
- cps #PSR_SVC
-#else
- mrs r3,cpsr
- bic r3,r3,#0x1f
- orr r3,r3,#0x13
- msr cpsr,r0
-#endif
- mrs r3, spsr
- stmia r7!, {r3, sp, lr} // svc: spsr, sp, lr
-
- mrc p15, 0, r2, cr1, cr0, 0
- mrc p15, 0, r3, cr2, cr0, 0
- mrc p15, 0, r4, cr2, cr0, 1
- mrc p15, 0, r5, cr2, cr0, 2
- mrc p15, 0, r6, cr3, cr0, 0
- stmia r7!, {r2,r3,r4,r5,r6} // cp15: r1,r2,r3
-
- mrc p15, 0, r2, cr5, cr0, 0
- mrc p15, 0, r3, cr5, cr0, 1
- mrc p15, 0, r4, cr6, cr0, 0
- mrc p15, 0, r5, cr6, cr0, 2
- mrc p15, 0, r6, cr13, cr0, 1 // cp15: r5,r6,r13
- stmia r7!, {r2,r3,r4,r5,r6}
-
- ldr r2, =0xFFFFFFFF
- mcr p15, 0, r2, cr3, cr0, 0 // cp15:r3(domain) manager
-
- // set up stack exclusively used for monitor (SVC mode)
- ldr r2, =__stack_top
- ldr r3, =__stack_bottom // stack exclusively used for monitor
- cmp sp, r2
- cmpcs r3, sp // using monitor stack?
- movcc sp, r3 // switch to monitor stack
-
- // monitor entry: r0 = interrupt/exception vector number (r1 = cpsr) : SVC mode
- bl Csym(entMonitor) // call entMonitor(vec)
-
- // restore registers
- ldr r7, =Csym(regStack) + ((39 + 10) * 4)
-
- ldmdb r7!, {r2,r3,r4,r5,r6} // cp15: r5,r6,r13
- mcr p15, 0, r2, cr5, cr0, 0
- mcr p15, 0, r3, cr5, cr0, 1
- mcr p15, 0, r4, cr6, cr0, 0
- mcr p15, 0, r5, cr6, cr0, 2
- mcr p15, 0, r6, cr13, cr0, 1
-
- ldmdb r7!, {r2,r3,r4,r5,r6} // cp15: r1,r2,r3
-// mcr p15, 0, r2, cr1, cr0, 0 // already restored inside entMonitor
-//RO mcr p15, 0, r3, cr2, cr0, 0 // no need to restore (Read Only)
-//RO mcr p15, 0, r4, cr2, cr0, 1
-//RO mcr p15, 0, r5, cr2, cr0, 2
- mcr p15, 0, r6, cr3, cr0, 0
-
- ldmdb r7!, {r3, sp, lr} // svc: spsr, sp, lr
- msr spsr_fsxc, r3
- mov r1, lr // r1: lr_svc (used for forcible terminal of processes)
-
-#if __TRON_ARM_ARCH__ >= 6
- cps #PSR_UND
-#else
- mrs r3,cpsr
- bic r3,r3,#0x1f
- orr r3,r3,#0x1B
- msr cpsr,r3
-#endif
- ldmdb r7!, {r3, sp, lr} // und: spsr, sp, lr
- msr spsr_fsxc, r3
-
-#if __TRON_ARM_ARCH__ >= 6
- cps #PSR_ABT
-#else
- mrs r3,cpsr
- bic r3,r3,#0x1f
- orr r3,r3,#0x17
- msr cpsr,r3
-#endif
- ldmdb r7!, {r3, sp, lr} // abt: spsr, sp, lr
- msr spsr_fsxc, r3
-
-#if __TRON_ARM_ARCH__ >= 6
- cps #PSR_IRQ
-#else
- mrs r3,cpsr
- bic r3,r3,#0x1f
- orr r3,r3,#0x12
- msr cpsr,r3
-#endif
- ldmdb r7!, {r3, sp, lr} // irq: spsr, sp, lr
- msr spsr_fsxc, r3
-
-#if __TRON_ARM_ARCH__ >= 6
- cps #PSR_FIQ
-#else
- mrs r3,cpsr
- bic r3,r3,#0x1f
- orr r3,r3,#0x11
- msr cpsr,r3
-#endif
- ldmdb r7!, {r3, r8-r12,sp,lr} // fiq: spsr, r8 .. r12,sp,lr
- msr spsr_fsxc, r3
-
- sub r7, r7, #(4*7)
- ldmia r7, {r8-r12,sp,lr}^ // usr: r8 .. r12,sp,lr
+ @ check mode, r4, 5, 6, 7
+ push {r4, r5, r6, r7, lr}
+ mrs r7, cpsr
+ push {r7}
- // restore status on etry
- ldmdb r7!, {r0, r2, r3, r4} // r0:Entry cpsr, r2:Entry ip
- // r3:cpsr(spsr), r4:pc(lr)
- msr cpsr_fsxc, r0 // entry cpsr
- stmfd sp!, {r3} // spsr -> stack
- stmfd sp!, {r4} // pc(lr) -> stack
+ and r6, r7, #0x1F
+ cmp r6, #0x10 @ usr: Normal program execution mode
+ beq 100f
- // do we have request for forcible termination of processe(es)?
- ldr r4, =Csym(killProcReq)
- ldr r0, [r4]
- tst r0, #0xff
- beq no_kill // no request
- mov r0, #0
- str r0, [r4] // clear forcible termination request
+ bic r7, #0x1F
+ orr r7, #0x13 @ svc: A protected mode for the operating system
+ msr cpsr, r7
- // restore to the state on entry completely, and then push lr_svc
- stmfd sp!, {r1, ip} // sp -> lr_svc, ip
- mov ip, r2 // restore ip
- ldmdb r7, {r0-r7} // r0 .. r7
+ bl entMonitor
- swi #SWI_KILLPROC // forcible termination of processes request
- nop // do not return
- nop
+ pop {r7}
+ msr cpsr, r7
+100:
+ pop {r4, r5, r6, r7, pc}
- no_kill:
- ldmdb r7, {r0-r7} // r0 .. r7
- // return from monitor
-#if __TRON_ARM_ARCH__ >= 6
- rfefd sp!
-#else
- pop {pc}
-#endif
/* ------------------------------------------------------------------------ */
diff --git a/tkernel_source/monitor/tmmain/monkey.S b/tkernel_source/monitor/tmmain/monkey.S
index 91d78d8..150b27f 100644
--- a/tkernel_source/monitor/tmmain/monkey.S
+++ b/tkernel_source/monitor/tmmain/monkey.S
@@ -8,6 +8,8 @@
.global monkey
monkey:
+ svc 3
+ svc 4
b start_kernel
.code 32
--
1.9.1
References