Rev 704 | Blame | 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 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_accountingswitch_thread:adr lr, resume_threadmov r0, #0mov r1, r4b scheduler_switch.size yield, .-yield.global leave_thread.type leave_thread, %functionleave_thread:msr cpsr_c, #0xd2mov r4, #0b switch_thread.size leave_thread, .-leave_thread.global syscall_handler.type syscall_handler, %functionsyscall_handler:ldr sp, [lr,#-4]bics sp, sp, #0xff000000beq syscall_breakpointcmp sp, #(swilist_end-swilist_start)/4+1bcs unknown_swimov r12, lrmrs sp, spsrmsr cpsr_c, spmov lr, r12ldr r12, [lr,#-4]bic r12, r12, #0xff000000sub r12, r12, #2add pc, pc, r12,lsl#2swilist_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_switchunknown_swi:ldr sp, =_abortstackend - 0x44str lr, [sp,#-4]mrs lr, spsrstr lr, [sp,#-8]msr cpsr_c, #0xdbldr lr, [sp,#-8]msr spsr_all, lrldr lr, [sp,#-4]b undef_instr_handler.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, .-execfirmware.global panic_recover.type panic_recover, %functionpanic_recover:and r0, r0, #0x1fcmp r0, #0x12beq irqpaniccmp r0, #0x17cmpne r0, #0x1bbne yieldldr sp, =_abortstackend - 0x44ldr r0, [sp,#0x40]and r0, r0, #0x1fcmp r0, #0x12beq irqabortldr 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_recoverirqabort:mov r0, #CONSOLE_PANICadr r1, irqabort_stringldmfd sp!, {r2,r3}bl csprintfmov r0, #CONSOLE_PANICbl csflushmov r0, #CONSOLE_PANICDUMPadr r1, stack_stringbl csputsadd sp, sp, #0x3cldr r4, [sp,#-0x10]sub r4, r4, #0x800add r5, r4, #0x2000irqabort_stackline:mov r0, #CONSOLE_PANICDUMPadr r1, hexdump_stringmov r2, r4ldr r3, [r4], #4bl csprintfcmp r4, r5bne irqabort_stacklinemov r0, #CONSOLE_PANICDUMPbl csflushb hangirqpanic:mov r0, #CONSOLE_PANICadr r1, irqpanic_stringbl csputsmov r0, #CONSOLE_PANICbl csflush@ fallthrough.global panic_fatal.type panic_fatal, %functionpanic_fatal:b hang.size panic_fatal, .-panic_fatalstack_string:.ascii "Stack:\n\0"hexdump_string:.ascii "%08X: %08X\n\0"irqabort_string:.ascii "Exception in IRQ handler!\n".ascii " R0: %08X R1: %08X\n R2: %08X R3: %08X\n".ascii " R4: %08X R5: %08X\n R6: %08X R7: %08X\n".ascii " R8: %08X R9: %08X\nR10: %08X R11: %08X\n".ascii "R12: %08X R13: %08X\nR14: %08X R15: %08X\n".ascii "CPSR: %08X\n\0"irqpanic_string:.ascii "Panic in IRQ handler!\n\0"