microblaze: Add support from PREEMPT
authorMichal Simek <monstr@monstr.eu>
Tue, 12 Jan 2010 08:55:10 +0000 (09:55 +0100)
committerMichal Simek <monstr@monstr.eu>
Thu, 11 Mar 2010 13:07:32 +0000 (14:07 +0100)
This patch add core PREEMPT support for Microblaze.
I tried to trace it via tracers and I was able to see any output.

I also added low level debug functions to see if that code is called.

Signed-off-by: Michal Simek <monstr@monstr.eu>
arch/microblaze/include/asm/tlbflush.h
arch/microblaze/kernel/asm-offsets.c
arch/microblaze/kernel/entry.S

index 10ec70c..bcb8b41 100644 (file)
@@ -23,7 +23,7 @@
 extern void _tlbie(unsigned long address);
 extern void _tlbia(void);
 
-#define __tlbia()      _tlbia()
+#define __tlbia()      { preempt_disable(); _tlbia(); preempt_enable(); }
 
 static inline void local_flush_tlb_all(void)
        { __tlbia(); }
index 7bc7b68..0071260 100644 (file)
@@ -90,6 +90,7 @@ int main(int argc, char *argv[])
        DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
        DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit));
        DEFINE(TI_CPU_CONTEXT, offsetof(struct thread_info, cpu_context));
+       DEFINE(TI_PREEMPT_COUNT, offsetof(struct thread_info, preempt_count));
        BLANK();
 
        /* struct cpu_context */
index 3bad4ff..1a6729d 100644 (file)
@@ -853,7 +853,30 @@ no_intr_resched:
        lwi     r1, r1, PT_R1 - PT_SIZE;
        bri     6f;
 /* MS: Return to kernel state. */
-2:     VM_OFF /* MS: turn off MMU */
+2:
+#ifdef CONFIG_PREEMPT
+       add     r11, r0, CURRENT_TASK;
+       lwi     r11, r11, TS_THREAD_INFO;
+       /* MS: get preempt_count from thread info */
+       lwi     r5, r11, TI_PREEMPT_COUNT;
+       bgti    r5, restore;
+
+       lwi     r5, r11, TI_FLAGS;              /* get flags in thread info */
+       andi    r5, r5, _TIF_NEED_RESCHED;
+       beqi    r5, restore /* if zero jump over */
+
+preempt:
+       /* interrupts are off that's why I am calling preempt_chedule_irq */
+       bralid  r15, preempt_schedule_irq
+       nop
+       add     r11, r0, CURRENT_TASK;  /* Get current task ptr into r11 */
+       lwi     r11, r11, TS_THREAD_INFO;       /* get thread info */
+       lwi     r5, r11, TI_FLAGS;              /* get flags in thread info */
+       andi    r5, r5, _TIF_NEED_RESCHED;
+       bnei    r5, preempt /* if non zero jump to resched */
+restore:
+#endif
+       VM_OFF /* MS: turn off MMU */
        tophys(r1,r1)
        lwi     r3, r1, PTO + PT_R3; /* MS: restore saved r3, r4 registers */
        lwi     r4, r1, PTO + PT_R4;