Commit 77753790 authored by Michal Simek's avatar Michal Simek
Browse files

microblaze: Add support from PREEMPT



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: default avatarMichal Simek <monstr@monstr.eu>
parent 733cc218
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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(); }
+1 −0
Original line number Diff line number Diff line
@@ -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 */
+24 −1
Original line number Diff line number Diff line
@@ -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;