Rev 595 | Rev 704 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
@@@ Copyright 2010 TheSeven@@@ This file is part of emCORE.@@ emCORE is free software: you can redistribute it and/or@ modify it under the terms of the GNU General Public License as@ published by the Free Software Foundation, either version 2 of the@ License, or (at your option) any later version.@@ emCORE is distributed in the hope that it will be useful,@ but WITHOUT ANY WARRANTY; without even the implied warranty of@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.@ See the GNU General Public License for more details.@@ You should have received a copy of the GNU General Public License@ along with emCORE. If not, see <http://www.gnu.org/licenses/>.@@#define ASM_FILE#include "global.h".section .icode.contextswitch, "ax", %progbits.align 2.global panic_recover.type panic_recover, %functionpanic_recover:mrs r0, cpsrand r0, r0, #0x1fcmp r0, #0x17cmpne r0, #0x1bbne yieldldr sp, =_abortstackend - 0x44ldr r9, =current_threadldr lr, [r9]ldmia sp!, {r0-r7}stmia lr!, {r0-r7}ldmia sp!, {r0-r8}stmia lr!, {r0-r8}msr cpsr_c, #0xd2bl scheduler_pause_accountingadr lr, resume_threadmov r0, #0mov r1, r9b scheduler_switch.size panic_recover, .-panic_recover.global yield.type yield, %functionyield:mrs r1, cpsrmsr cpsr_c, #0xdfldr r0, =current_threadldr r0, [r0]stmia r0, {r0-r14}str lr, [r0,#0x3c]str r1, [r0,#0x40]msr cpsr_c, #0xd2mov r4, r0bl scheduler_pause_accountingadr lr, resume_threadmov r0, #0mov r1, r4b scheduler_switch.size yield, .-yield.global syscall_handler.type syscall_handler, %functionsyscall_handler:ldr sp, [lr,#-4]bics sp, sp, #0xff000000beq syscall_breakpointmov r12, lrmrs sp, spsrmsr cpsr_c, spmov lr, r12ldr r12, [lr,#-4]bic r12, r12, #0xff000000cmp r12, #(swilist_end-swilist_start)/4+1movcs r0, #0addcc pc, pc, r12,lsl#2adr r1, unknown_swi_stringmov r2, r12swilist_start:b panicfb get_syscall_tableswilist_end:syscall_breakpoint:msr cpsr_c, #0xd3ldr sp, =current_threadldr sp, [sp]stmia sp!, {r0-r12}mov r2, lrmrs r3, spsrmov r4, #1mov r5, spmsr cpsr_c, #0xdfmov r0, spmov r1, lrmsr cpsr_c, #0xd2stmia r5, {r0-r4}bl scheduler_pause_accountingadr lr, resume_threadmov r0, #0mov r1, #0b scheduler_switch.size syscall_handler, .-syscall_handler.global irq_handler.type irq_handler, %functionwas_in_svc_mode:msr cpsr_c, #0xd3sub r3, lr, #4mrs r4, spsrmsr cpsr_c, r5b enter_irqhandlerirq_handler:str r12, [sp,#-4]ldr r12, =current_threadldr r12, [r12]stmia r12!, {r0-r11}ldr r0, [sp,#-4]mrs r5, cpsrmrs r4, spsrmsr cpsr_c, #0xdfmov r1, spmov r2, lrand r3, r4, #0x1fcmp r3, #0x13beq was_in_svc_modemsr cpsr_c, r5sub r3, lr, #4enter_irqhandler:stmia r12, {r0-r4}bl scheduler_pause_accountingbl irqhandler@ fallthrough.global resume_thread.type resume_thread, %functionresume_thread:bl scheduler_resume_accountingldr lr, =current_threadldr lr, [lr]mov r0, lrldr r1, [lr,#0x40]ldr lr, [lr,#0x3c]msr spsr_all, r1msr cpsr_c, 0xdfldmia r0, {r0-r14}msr cpsr_c, #0xd2movs pc, lr.size irq_handler, .-irq_handler.size resume_thread, .-resume_thread.global enter_critical_section.type enter_critical_section, %functionenter_critical_section:mrs r0, cpsrorr r1, r0, #0xc0msr cpsr_c, r1mov pc, lr.size enter_critical_section, .-enter_critical_section.global leave_critical_section.type leave_critical_section, %functionleave_critical_section:msr cpsr_c, r0mov pc, lr.size leave_critical_section, .-leave_critical_section.global execfirmware.type execfirmware, %functionexecfirmware:ldr sp, =_abortstackendstmfd sp!, {r0-r2}bl interrupt_shutdownmov r0, spmsr cpsr_c, #0xd3mov sp, r0ldmfd sp, {r0-r2}bl memmovebl clean_dcache#ifdef HAVE_TARGETINIT_EXECFIRMWAREbl targetinit_execfirmware#endifldr r1, [sp]mrc p15, 0, r0,c1,c0bic r0, r0, #5mcr p15, 0, r0,c1,c0mov r0, #0mcr p15, 0, r0,c7,c5bx r1.size execfirmware, .-execfirmwareunknown_swi_string:.ascii "Unhandled SWI %06X\0"