void __attribute__((naked)) sys_schedule() { need_resched = 0; __asm__ __volatile__("b schedule_core"); /* it never comes back here */ schedule_finish(); __ret_from_exc(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); }
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; }
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); }