/* * This file is part of the libpayload project. * * Copyright 2013 Google Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ .text .align 6 .arm .global exception_table exception_table: b 1f b 2f b 3f b 4f b 5f b 6f b 7f b 8f 1: mov sp, #0 b exception_common /* Undefined Instruction (CAREFUL: the PC offset is specific to thumb mode!) */ 2: sub lr, lr, #2 mov sp, #1 b exception_common /* Software Interrupt (no PC offset necessary) */ 3: mov sp, #2 b exception_common /* Prefetch Abort */ 4: sub lr, lr, #4 mov sp, #3 b exception_common /* Data Abort */ 5: sub lr, lr, #8 mov sp, #4 b exception_common /* (not used) */ 6: mov sp, #5 b exception_common /* Interrupt */ 7: sub lr, lr, #4 mov sp, #6 b exception_common /* Fast Interrupt */ 8: sub lr, lr, #4 mov sp, #7 b exception_common exception_common: str sp, exception_idx ldr sp, exception_state_ptr stmia sp!, { r0 - r12 } /* Save regs from bottom to top */ stmia sp, { sp, lr }^ /* Save banked SP/LR (no writeback) */ str lr, [sp, #(4 * 2)] /* Save PC to ®s[13] + 2 */ mrs r0, SPSR str r0, [sp, #(4 * 3)] /* Save SPSR to ®s[13] + 3 */ ldr sp, exception_stack_end /* Point SP to the stack for C code */ ldr r0, exception_idx blx exception_dispatch ldr sp, exception_state_ptr ldr r0, [sp, #(4 * 16)] /* Load SPSR from ®s[0] + 16... */ msr SPSR_cxsf, r0 /* ...and get it out of the way */ ldmia sp!, { r0 - r12 } /* Restore regs from bottom to top */ ldmia sp, { sp, lr }^ /* Restore SP/LR to banked location */ add sp, sp, #8 /* Adjust SP (no writeback allowed) */ ldmia sp!, { pc }^ /* Do exception return (mode switch) */ .align 2 .global exception_stack_end exception_stack_end: .word 0 .global exception_state_ptr exception_state_ptr: .word 0 exception_idx: .word 0 .thumb .global set_vbar .thumb_func set_vbar: mcr p15, 0, r0, c12, c0, 0 bx lr