TLK: Clean up obsolete files
[3rdparty/ote_partner/tlk.git] / arch / arm / arm-m / exceptions.c
1 /*
2  * Copyright (c) 2012 Travis Geiselbrecht
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files
6  * (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 #include <debug.h>
24 #include <compiler.h>
25 #include <stdint.h>
26 #include <arch/arm/cm3.h>
27
28 static void dump_frame(const struct cm3_exception_frame *frame)
29 {
30         printf("exception frame at %p\n", frame);
31         printf("\tr0  0x%08x r1  0x%08x r2  0x%08x r3 0x%08x r4 0x%08x\n",
32                 frame->r0, frame->r1, frame->r2, frame->r3, frame->r4);
33         printf("\tr5  0x%08x r6  0x%08x r7  0x%08x r8 0x%08x r9 0x%08x\n",
34                 frame->r5, frame->r6, frame->r7, frame->r8, frame->r9);
35         printf("\tr10 0x%08x r11 0x%08x r12 0x%08x\n",
36                 frame->r10, frame->r11, frame->r12);
37         printf("\tlr  0x%08x pc  0x%08x psr 0x%08x\n",
38                 frame->lr, frame->pc, frame->psr);
39 }
40
41 static void hardfault(struct cm3_exception_frame *frame)
42 {
43         printf("hardfault: ");
44         dump_frame(frame);
45
46         printf("HFSR 0x%x\n", SCB->HFSR);
47
48         halt();
49 }
50
51 static void usagefault(struct cm3_exception_frame *frame)
52 {
53         printf("usagefault: ");
54         dump_frame(frame);
55
56         halt();
57 }
58
59 static void busfault(struct cm3_exception_frame *frame)
60 {
61         printf("busfault: ");
62         dump_frame(frame);
63
64         halt();
65 }
66
67 /* raw exception vectors */
68
69 void _nmi(void)
70 {
71         printf("nmi\n");
72         halt();
73 }
74
75 __NAKED void _hardfault(void)
76 {
77         __asm__ volatile(
78                 "push   {r4-r11};"
79                 "mov    r0, sp;"
80                 "b              %0;"
81                 :: "i" (hardfault)
82         );
83         __UNREACHABLE;
84 }
85
86 void _memmanage(void)
87 {
88         printf("memmanage\n");
89         halt();
90 }
91
92 void _busfault(void)
93 {
94         __asm__ volatile(
95                 "push   {r4-r11};"
96                 "mov    r0, sp;"
97                 "b              %0;"
98                 :: "i" (busfault)
99         );
100         __UNREACHABLE;
101 }
102
103 void _usagefault(void)
104 {
105         __asm__ volatile(
106                 "push   {r4-r11};"
107                 "mov    r0, sp;"
108                 "b              %0;"
109                 :: "i" (usagefault)
110         );
111         __UNREACHABLE;
112 }
113
114 /* systick handler */
115 void __WEAK _systick(void)
116 {
117         printf("systick\n");
118         halt();
119 }
120
121