Пример #1
0
void __attribute__((naked)) sys_schedule()
{
	need_resched = 0;
	__asm__ __volatile__("b schedule_core");

	/* it never comes back here */
	schedule_finish();
	__ret_from_exc(0);
}
Пример #2
0
void __attribute__((naked, optimize("O0"))) irq_handler()
{
	__asm__ __volatile__("sub lr, lr, #4");
	schedule_prepare();

	__asm__ __volatile__("bl irq_handler_c");

	/* schedule if sched_req is set */
	__asm__ __volatile__(
			"cmp	%0, #0			\n\t"
			"ldrne	r12, =sys_schedule	\n\t"
			"blxne	r12			\n\t"
			:: "r"(need_resched)
			: "r12", "memory");

	schedule_finish();
	__ret_from_exc(0);
}
Пример #3
0
int __init main()
{
    /* keep the calling order below because of dependencies */
    sys_init();
    mm_init();
    fs_init();
    device_init();
    systick_init();
    scheduler_init();
    console_init();

    make_init_task();
    load_user_task(); /* that are registered statically */

    softirq_init();
#ifdef CONFIG_TIMER
    timer_init();
#endif

#ifndef DEFSTR
#define DEFMKSTR(x)	#x
#define DEFSTR(x)	DEFMKSTR(x)
#endif
    /* a banner */
    printk("yaos %s %s\n", DEFSTR(VERSION), DEFSTR(MACHINE));

    /* switch from boot stack memory to new one */
    set_user_sp(init.mm.sp);
    set_kernel_sp(init.mm.kernel.sp);

    /* everything ready now */
#ifndef ARMv7A
    sei();
#endif
    resched();

    /* it doesn't really reach up to this point. init task becomes idle as
     * its context is already set to idle */
    __context_restore(current);
    __ret_from_exc(0);
    freeze();

    return 0;
}
Пример #4
0
void __attribute__((naked, optimize("O0"))) svc_handler()
{
	schedule_prepare();

	/* branch to interrupt service routine */
	__asm__ __volatile__(
			"mov	r4, %0			\n\t"
			:: "r"(current->mm.sp) : "memory");
	__asm__ __volatile__(
			"ldr	r0, [r4, #4]		\n\t"
			/* if nr >= SYSCALL_NR */
			"cmp	r0, %0			\n\t"
			/* then nr = 0 */
			"movge	r0, #0			\n\t"
			/* get the syscall address */
			"ldr	r12, =syscall_table	\n\t"
			"ldr	r12, [r12, r0, lsl #2]	\n\t"
			/* arguments in place */
			"ldr	r0, [r4, #12]		\n\t"
			"ldr	r1, [r4, #16]		\n\t"
			"ldr	r2, [r4, #20]		\n\t"
			"blx	r12			\n\t"
			/* r0 now holds the return value */
			"str	r0, [r4, #4]		\n\t"
			:: "I"(SYSCALL_NR) : "memory");

	/* schedule if sched_req is set */
	__asm__ __volatile__(
			"cmp	%0, #0			\n\t"
			"ldrne	r12, =sys_schedule	\n\t"
			"blxne	r12			\n\t"
			:: "r"(need_resched)
			: "r12", "memory");

	schedule_finish();
	__ret_from_exc(0);
}