-daPreAll: mfmsr r9 /* Save the old MSR */
- rlwinm r9,r9,0,MSR_FP_BIT+1,MSR_FP_BIT-1 ; Force floating point off
- rlwinm r9,r9,0,MSR_VEC_BIT+1,MSR_VEC_BIT-1 ; Force vectors off
- rlwinm r8,r9,0,MSR_EE_BIT+1,MSR_EE_BIT-1 /* Clear interruptions */
- mtmsr r8 /* Interrupts off */
- isync ; May have mess with fp/vec
-
-daPreComm: mfsprg r6,0 /* Get the per_proc block */
- lwz r5,PP_PREEMPT_CNT(r6) /* Get the preemption level */
- addi r5,r5,1 /* Bring up the disable count */
- stw r5,PP_PREEMPT_CNT(r6) /* Save it back */
-#if 0
- mfsprg r4,1 ; (TEST/DEBUG) Note the next 3 keep from interrpting too early
- mr. r4,r4 ; (TEST/DEBUG)
- beq- epskptrc1 ; (TEST/DEBUG)
- lis r0,hi16(CutTrace) ; (TEST/DEBUG)
- lis r4,0xAAAA ; (TEST/DEBUG)
- oris r0,r0,lo16(CutTrace) ; (TEST/DEBUG)
- sc ; (TEST/DEBUG)
-epskptrc1: ; (TEST/DEBUG)
-#endif
-
-;
-; Set PREEMPTSTACK above to enable a preemption traceback stack.
-;
-; NOTE: make sure that PREEMPTSTACK in aligned_data is
-; set the same as it is here. This is the number of
-; traceback entries we can handle per processor
-;
-; A value of 0 disables the stack.
-;
-#if PREEMPTSTACK
- cmplwi r5,PREEMPTSTACK ; Maximum depth
- lwz r6,CPU_ACTIVE_THREAD(r6) ; Get the pointer to the currently active thread
- bgt- nopredeb ; Too many to stack...
- mr. r6,r6 ; During boot?
- beq- nopredeb ; Yes, do not do backtrace...
- lwz r6,THREAD_TOP_ACT(r6) ; Point to the active activation
- lwz r6,ACT_MACT_PCB(r6) ; Get the last savearea used
- mr. r0,r6 ; Any saved context?
- beq- nosaveds ; No...
- lwz r0,saver1(r6) ; Get end of savearea chain
-
-nosaveds: li r11,0 ; Clear callers callers callers return
- li r10,0 ; Clear callers callers callers callers return
- li r8,0 ; Clear callers callers callers callers callers return
- lwz r2,0(r1) ; Get callers callers stack frame
- lwz r12,8(r2) ; Get our callers return
- lwz r4,0(r2) ; Back chain
-
- xor r2,r4,r2 ; Form difference
- cmplwi r2,8192 ; Within a couple of pages?
- mr r2,r4 ; Move register
- bge- nosaveher2 ; No, no back chain then...
- lwz r11,8(r2) ; Get our callers return
- lwz r4,0(r2) ; Back chain
-
- xor r2,r4,r2 ; Form difference
- cmplwi r2,8192 ; Within a couple of pages?
- mr r2,r4 ; Move register
- bge- nosaveher2 ; No, no back chain then...
- lwz r10,8(r2) ; Get our callers return
- lwz r4,0(r2) ; Back chain
-
- xor r2,r4,r2 ; Form difference
- cmplwi r2,8192 ; Within a couple of pages?
- mr r2,r4 ; Move register
- bge- nosaveher2 ; No, no back chain then...
- lwz r8,8(r2) ; Get our callers return
-
-nosaveher2:
- addi r5,r5,-1 ; Get index to slot
- mfspr r6,pir ; Get our processor
- mflr r4 ; Get our return
- rlwinm r6,r6,8,0,23 ; Index to processor slot
- lis r2,hi16(EXT(DBGpreempt)) ; Stack high order
- rlwinm r5,r5,4,0,27 ; Index to stack slot
- ori r2,r2,lo16(EXT(DBGpreempt)) ; Stack low order
- add r2,r2,r5 ; Point to slot
- add r2,r2,r6 ; Move to processor
- stw r4,0(r2) ; Save our return
- stw r11,4(r2) ; Save callers caller
- stw r10,8(r2) ; Save callers callers caller
- stw r8,12(r2) ; Save callers callers callers caller
-nopredeb:
-#endif
- mtmsr r9 /* Allow interruptions now */
-
- blr /* Return... */