| Index: emcore/trunk/panic.c | 
| — | — | @@ -45,7 +45,7 @@ | 
| 46 | 46 | current_thread->state = THREAD_DEFUNCT_ACK; | 
| 47 | 47 | current_thread->block_type = THREAD_DEFUNCT_PANIC; | 
| 48 | 48 | leave_critical_section(mode); | 
| 49 |  | -    yield();
 | 
|  | 49 | +    panic_recover(); | 
| 50 | 50 | } | 
| 51 | 51 |  | 
| 52 | 52 | void panic(enum panic_severity severity, const char* string) | 
| Index: emcore/trunk/target/ipodnano2g/crt0.S | 
| — | — | @@ -144,41 +144,116 @@ | 
| 145 | 145 |  | 
| 146 | 146 | .type reset_handler, %function | 
| 147 | 147 | reset_handler: | 
|  | 148 | +	stmfd	sp, {r10-r12} | 
|  | 149 | +	mov	r10, sp | 
|  | 150 | +	mov	r11, lr | 
|  | 151 | +	mrs	r12, cpsr | 
|  | 152 | +	msr	cpsr_c, #0xd7 | 
|  | 153 | +	sub	sp, sp, #0x44 | 
|  | 154 | +	stmia	sp!, {r0-r9} | 
|  | 155 | +	sub	r0, r10, #0xc | 
|  | 156 | +	ldmia	r0, {r0-r2} | 
|  | 157 | +	mov	r3, r10 | 
|  | 158 | +	mov	r4, r11 | 
|  | 159 | +	mov	r5, r11 | 
|  | 160 | +	mov	r6, r12 | 
|  | 161 | +	stmia	sp!, {r0-r6} | 
|  | 162 | +	sub	sp, sp, #0x44 | 
| 148 | 163 | mov	r0, #0 | 
| 149 | 164 | adr	r1, reset_text | 
|  | 165 | +	mov	r2, r11 | 
| 150 | 166 | b	panic | 
| 151 |  | -reset_text:
 | 
| 152 |  | -	.ascii	"Hit reset vector!\0"
 | 
| 153 | 167 | .size reset_handler, .-reset_handler | 
| 154 | 168 |  | 
| 155 | 169 | .type undef_instr_handler, %function | 
| 156 | 170 | undef_instr_handler: | 
|  | 171 | +	sub	sp, sp, #0x44 | 
|  | 172 | +	stmia	sp!, {r0-r12} | 
|  | 173 | +	sub	r2, lr, #4 | 
|  | 174 | +	mrs	r3, spsr | 
|  | 175 | +	mrs	r4, cpsr | 
|  | 176 | +	orr	r0, r3, #0xc0 | 
|  | 177 | +	msr	cpsr_c, r0 | 
|  | 178 | +	mov	r0, sp | 
|  | 179 | +	mov	r1, lr | 
|  | 180 | +	msr	cpsr_c, r4 | 
|  | 181 | +	stmia	sp!, {r0-r3} | 
|  | 182 | +	sub	sp, sp, #0x44 | 
| 157 | 183 | mov	r0, #0 | 
| 158 | 184 | adr	r1, undef_instr_text | 
| 159 |  | -	sub	r2, lr, #4
 | 
|  | 185 | +	ldr	r3, [r2] | 
| 160 | 186 | b	panicf | 
| 161 | 187 | .size undef_instr_handler, .-undef_instr_handler | 
| 162 | 188 |  | 
| 163 | 189 | .type prefetch_abort_handler, %function | 
| 164 | 190 | prefetch_abort_handler: | 
|  | 191 | +	sub	sp, sp, #0x44 | 
|  | 192 | +	stmia	sp!, {r0-r12} | 
|  | 193 | +	sub	r2, lr, #4 | 
|  | 194 | +	mrs	r3, spsr | 
|  | 195 | +	mrs	r4, cpsr | 
|  | 196 | +	orr	r0, r3, #0xc0 | 
|  | 197 | +	msr	cpsr_c, r0 | 
|  | 198 | +	mov	r0, sp | 
|  | 199 | +	mov	r1, lr | 
|  | 200 | +	msr	cpsr_c, r4 | 
|  | 201 | +	stmia	sp!, {r0-r3} | 
|  | 202 | +	sub	sp, sp, #0x44 | 
| 165 | 203 | mov	r0, #0 | 
| 166 | 204 | adr	r1, prefetch_abort_text | 
| 167 |  | -	sub	r2, lr, #4
 | 
|  | 205 | +	mrc	p15, 0, r3,c5,c0 | 
|  | 206 | +	mov	r4, r3,lsr#4 | 
|  | 207 | +	and	r4, r4, #0xf | 
|  | 208 | +	and	r5, r3, #0xf | 
|  | 209 | +	stmfd	sp!, {r4-r5} | 
| 168 | 210 | b	panicf | 
| 169 | 211 | .size prefetch_abort_handler, .-prefetch_abort_handler | 
| 170 | 212 |  | 
| 171 | 213 | .type data_abort_handler, %function | 
| 172 | 214 | data_abort_handler: | 
|  | 215 | +	sub	sp, sp, #0x44 | 
|  | 216 | +	stmia	sp!, {r0-r12} | 
|  | 217 | +	sub	r2, lr, #8 | 
|  | 218 | +	mrs	r3, spsr | 
|  | 219 | +	mrs	r4, cpsr | 
|  | 220 | +	orr	r0, r3, #0xc0 | 
|  | 221 | +	msr	cpsr_c, r0 | 
|  | 222 | +	mov	r0, sp | 
|  | 223 | +	mov	r1, lr | 
|  | 224 | +	msr	cpsr_c, r4 | 
|  | 225 | +	stmia	sp!, {r0-r3} | 
|  | 226 | +	sub	sp, sp, #0x44 | 
| 173 | 227 | mov	r0, #0 | 
| 174 | 228 | adr	r1, data_abort_text | 
| 175 |  | -	sub	r2, lr, #4
 | 
|  | 229 | +	mrc	p15, 0, r3,c5,c0 | 
|  | 230 | +	mov	r4, r3,lsr#4 | 
|  | 231 | +	and	r4, r4, #0xf | 
|  | 232 | +	and	r5, r3, #0xf | 
|  | 233 | +	mrc	p15, 0, r6,c6,c0 | 
|  | 234 | +	stmfd	sp!, {r4-r6} | 
| 176 | 235 | b	panicf | 
| 177 | 236 | .size data_abort_handler, .-data_abort_handler | 
| 178 | 237 |  | 
| 179 | 238 | .type reserved_handler, %function | 
| 180 | 239 | reserved_handler: | 
|  | 240 | +	stmfd	sp, {r10-r12} | 
|  | 241 | +	mov	r10, sp | 
|  | 242 | +	mov	r11, lr | 
|  | 243 | +	mrs	r12, cpsr | 
|  | 244 | +	msr	cpsr_c, #0xd7 | 
|  | 245 | +	sub	sp, sp, #0x44 | 
|  | 246 | +	stmia	sp!, {r0-r9} | 
|  | 247 | +	sub	r0, r10, #0xc | 
|  | 248 | +	ldmia	r0, {r0-r2} | 
|  | 249 | +	mov	r3, r10 | 
|  | 250 | +	mov	r4, r11 | 
|  | 251 | +	mov	r5, r11 | 
|  | 252 | +	mov	r6, r12 | 
|  | 253 | +	stmia	sp!, {r0-r6} | 
|  | 254 | +	sub	sp, sp, #0x44 | 
| 181 | 255 | mov	r0, #0 | 
| 182 | 256 | adr	r1, reserved_text | 
|  | 257 | +	mov	r2, r11 | 
| 183 | 258 | b	panic | 
| 184 | 259 | .size reserved_handler, .-reserved_handler | 
| 185 | 260 |  | 
| — | — | @@ -189,21 +264,24 @@ | 
| 190 | 265 | b	panic | 
| 191 | 266 | .size fiq_handler, .-fiq_handler | 
| 192 | 267 |  | 
|  | 268 | +prefetch_abort_text: | 
|  | 269 | +	.ascii	"Prefetch abort at %08X!\nFSR: %08X (domain %d, fault %d)\0" | 
|  | 270 | + | 
|  | 271 | +reset_text: | 
|  | 272 | +	.ascii	"Hit reset vector!\n(Last known PC: %08X)\0" | 
|  | 273 | + | 
| 193 | 274 | undef_instr_text: | 
| 194 |  | -	.ascii	"Undefined instruction at %08X!\0"
 | 
|  | 275 | +	.ascii	"Undefined instruction at %08X!\n(Opcode: %08X)\0" | 
| 195 | 276 |  | 
| 196 |  | -prefetch_abort_text:
 | 
| 197 |  | -	.ascii	"Prefetch abort at %08X!\0"
 | 
| 198 |  | -
 | 
| 199 | 277 | data_abort_text: | 
| 200 |  | -	.ascii	"Data abort at %08X!\0"
 | 
|  | 278 | +	.ascii	"Data abort at %08X!\nFSR: %08X (domain %d, fault %d)\nAddress: %08X\0" | 
| 201 | 279 |  | 
| 202 |  | -reserved_text:
 | 
| 203 |  | -	.ascii	"Hit reserved exception handler!\0"
 | 
| 204 |  | -
 | 
| 205 | 280 | fiq_text: | 
| 206 | 281 | .ascii	"Unhandled FIQ!\0" | 
| 207 | 282 |  | 
|  | 283 | +reserved_text: | 
|  | 284 | +	.ascii	"Hit reserved exception handler!\n(Last known PC: %08X)\0" | 
|  | 285 | + | 
| 208 | 286 | syscall_text: | 
| 209 | 287 | .ascii	"Unhandled syscall!\0" | 
| 210 | 288 |  | 
| Index: emcore/trunk/target/ipodnano3g/crt0.S | 
| — | — | @@ -185,41 +185,116 @@ | 
| 186 | 186 |  | 
| 187 | 187 | .type reset_handler, %function | 
| 188 | 188 | reset_handler: | 
|  | 189 | +	stmfd	sp, {r10-r12} | 
|  | 190 | +	mov	r10, sp | 
|  | 191 | +	mov	r11, lr | 
|  | 192 | +	mrs	r12, cpsr | 
|  | 193 | +	msr	cpsr_c, #0xd7 | 
|  | 194 | +	sub	sp, sp, #0x44 | 
|  | 195 | +	stmia	sp!, {r0-r9} | 
|  | 196 | +	sub	r0, r10, #0xc | 
|  | 197 | +	ldmia	r0, {r0-r2} | 
|  | 198 | +	mov	r3, r10 | 
|  | 199 | +	mov	r4, r11 | 
|  | 200 | +	mov	r5, r11 | 
|  | 201 | +	mov	r6, r12 | 
|  | 202 | +	stmia	sp!, {r0-r6} | 
|  | 203 | +	sub	sp, sp, #0x44 | 
| 189 | 204 | mov	r0, #0 | 
| 190 | 205 | adr	r1, reset_text | 
|  | 206 | +	mov	r2, r11 | 
| 191 | 207 | b	panic | 
| 192 |  | -reset_text:
 | 
| 193 |  | -	.ascii	"Hit reset vector!\0"
 | 
| 194 | 208 | .size reset_handler, .-reset_handler | 
| 195 | 209 |  | 
| 196 | 210 | .type undef_instr_handler, %function | 
| 197 | 211 | undef_instr_handler: | 
|  | 212 | +	sub	sp, sp, #0x44 | 
|  | 213 | +	stmia	sp!, {r0-r12} | 
|  | 214 | +	sub	r2, lr, #4 | 
|  | 215 | +	mrs	r3, spsr | 
|  | 216 | +	mrs	r4, cpsr | 
|  | 217 | +	orr	r0, r3, #0xc0 | 
|  | 218 | +	msr	cpsr_c, r0 | 
|  | 219 | +	mov	r0, sp | 
|  | 220 | +	mov	r1, lr | 
|  | 221 | +	msr	cpsr_c, r4 | 
|  | 222 | +	stmia	sp!, {r0-r3} | 
|  | 223 | +	sub	sp, sp, #0x44 | 
| 198 | 224 | mov	r0, #0 | 
| 199 | 225 | adr	r1, undef_instr_text | 
| 200 |  | -	sub	r2, lr, #4
 | 
|  | 226 | +	ldr	r3, [r2] | 
| 201 | 227 | b	panicf | 
| 202 | 228 | .size undef_instr_handler, .-undef_instr_handler | 
| 203 | 229 |  | 
| 204 | 230 | .type prefetch_abort_handler, %function | 
| 205 | 231 | prefetch_abort_handler: | 
|  | 232 | +	sub	sp, sp, #0x44 | 
|  | 233 | +	stmia	sp!, {r0-r12} | 
|  | 234 | +	sub	r2, lr, #4 | 
|  | 235 | +	mrs	r3, spsr | 
|  | 236 | +	mrs	r4, cpsr | 
|  | 237 | +	orr	r0, r3, #0xc0 | 
|  | 238 | +	msr	cpsr_c, r0 | 
|  | 239 | +	mov	r0, sp | 
|  | 240 | +	mov	r1, lr | 
|  | 241 | +	msr	cpsr_c, r4 | 
|  | 242 | +	stmia	sp!, {r0-r3} | 
|  | 243 | +	sub	sp, sp, #0x44 | 
| 206 | 244 | mov	r0, #0 | 
| 207 | 245 | adr	r1, prefetch_abort_text | 
| 208 |  | -	sub	r2, lr, #4
 | 
|  | 246 | +	mrc	p15, 0, r3,c5,c0 | 
|  | 247 | +	mov	r4, r3,lsr#4 | 
|  | 248 | +	and	r4, r4, #0xf | 
|  | 249 | +	and	r5, r3, #0xf | 
|  | 250 | +	stmfd	sp!, {r4-r5} | 
| 209 | 251 | b	panicf | 
| 210 | 252 | .size prefetch_abort_handler, .-prefetch_abort_handler | 
| 211 | 253 |  | 
| 212 | 254 | .type data_abort_handler, %function | 
| 213 | 255 | data_abort_handler: | 
|  | 256 | +	sub	sp, sp, #0x44 | 
|  | 257 | +	stmia	sp!, {r0-r12} | 
|  | 258 | +	sub	r2, lr, #8 | 
|  | 259 | +	mrs	r3, spsr | 
|  | 260 | +	mrs	r4, cpsr | 
|  | 261 | +	orr	r0, r3, #0xc0 | 
|  | 262 | +	msr	cpsr_c, r0 | 
|  | 263 | +	mov	r0, sp | 
|  | 264 | +	mov	r1, lr | 
|  | 265 | +	msr	cpsr_c, r4 | 
|  | 266 | +	stmia	sp!, {r0-r3} | 
|  | 267 | +	sub	sp, sp, #0x44 | 
| 214 | 268 | mov	r0, #0 | 
| 215 | 269 | adr	r1, data_abort_text | 
| 216 |  | -	sub	r2, lr, #4
 | 
|  | 270 | +	mrc	p15, 0, r3,c5,c0 | 
|  | 271 | +	mov	r4, r3,lsr#4 | 
|  | 272 | +	and	r4, r4, #0xf | 
|  | 273 | +	and	r5, r3, #0xf | 
|  | 274 | +	mrc	p15, 0, r6,c6,c0 | 
|  | 275 | +	stmfd	sp!, {r4-r6} | 
| 217 | 276 | b	panicf | 
| 218 | 277 | .size data_abort_handler, .-data_abort_handler | 
| 219 | 278 |  | 
| 220 | 279 | .type reserved_handler, %function | 
| 221 | 280 | reserved_handler: | 
|  | 281 | +	stmfd	sp, {r10-r12} | 
|  | 282 | +	mov	r10, sp | 
|  | 283 | +	mov	r11, lr | 
|  | 284 | +	mrs	r12, cpsr | 
|  | 285 | +	msr	cpsr_c, #0xd7 | 
|  | 286 | +	sub	sp, sp, #0x44 | 
|  | 287 | +	stmia	sp!, {r0-r9} | 
|  | 288 | +	sub	r0, r10, #0xc | 
|  | 289 | +	ldmia	r0, {r0-r2} | 
|  | 290 | +	mov	r3, r10 | 
|  | 291 | +	mov	r4, r11 | 
|  | 292 | +	mov	r5, r11 | 
|  | 293 | +	mov	r6, r12 | 
|  | 294 | +	stmia	sp!, {r0-r6} | 
|  | 295 | +	sub	sp, sp, #0x44 | 
| 222 | 296 | mov	r0, #0 | 
| 223 | 297 | adr	r1, reserved_text | 
|  | 298 | +	mov	r2, r11 | 
| 224 | 299 | b	panic | 
| 225 | 300 | .size reserved_handler, .-reserved_handler | 
| 226 | 301 |  | 
| — | — | @@ -230,21 +305,24 @@ | 
| 231 | 306 | b	panic | 
| 232 | 307 | .size fiq_handler, .-fiq_handler | 
| 233 | 308 |  | 
|  | 309 | +prefetch_abort_text: | 
|  | 310 | +	.ascii	"Prefetch abort at %08X!\nFSR: %08X (domain %d, fault %d)\0" | 
|  | 311 | + | 
|  | 312 | +reset_text: | 
|  | 313 | +	.ascii	"Hit reset vector!\n(Last known PC: %08X)\0" | 
|  | 314 | + | 
| 234 | 315 | undef_instr_text: | 
| 235 |  | -	.ascii	"Undefined instruction at %08X!\0"
 | 
|  | 316 | +	.ascii	"Undefined instruction at %08X!\n(Opcode: %08X)\0" | 
| 236 | 317 |  | 
| 237 |  | -prefetch_abort_text:
 | 
| 238 |  | -	.ascii	"Prefetch abort at %08X!\0"
 | 
| 239 |  | -
 | 
| 240 | 318 | data_abort_text: | 
| 241 |  | -	.ascii	"Data abort at %08X!\0"
 | 
|  | 319 | +	.ascii	"Data abort at %08X!\nFSR: %08X (domain %d, fault %d)\nAddress: %08X\0" | 
| 242 | 320 |  | 
| 243 |  | -reserved_text:
 | 
| 244 |  | -	.ascii	"Hit reserved exception handler!\0"
 | 
| 245 |  | -
 | 
| 246 | 321 | fiq_text: | 
| 247 | 322 | .ascii	"Unhandled FIQ!\0" | 
| 248 | 323 |  | 
|  | 324 | +reserved_text: | 
|  | 325 | +	.ascii	"Hit reserved exception handler!\n(Last known PC: %08X)\0" | 
|  | 326 | + | 
| 249 | 327 | syscall_text: | 
| 250 | 328 | .ascii	"Unhandled syscall!\0" | 
| 251 | 329 |  | 
| Index: emcore/trunk/target/ipodnano4g/crt0.S | 
| — | — | @@ -134,41 +134,116 @@ | 
| 135 | 135 |  | 
| 136 | 136 | .type reset_handler, %function | 
| 137 | 137 | reset_handler: | 
|  | 138 | +	stmfd	sp, {r10-r12} | 
|  | 139 | +	mov	r10, sp | 
|  | 140 | +	mov	r11, lr | 
|  | 141 | +	mrs	r12, cpsr | 
|  | 142 | +	msr	cpsr_c, #0xd7 | 
|  | 143 | +	sub	sp, sp, #0x44 | 
|  | 144 | +	stmia	sp!, {r0-r9} | 
|  | 145 | +	sub	r0, r10, #0xc | 
|  | 146 | +	ldmia	r0, {r0-r2} | 
|  | 147 | +	mov	r3, r10 | 
|  | 148 | +	mov	r4, r11 | 
|  | 149 | +	mov	r5, r11 | 
|  | 150 | +	mov	r6, r12 | 
|  | 151 | +	stmia	sp!, {r0-r6} | 
|  | 152 | +	sub	sp, sp, #0x44 | 
| 138 | 153 | mov	r0, #0 | 
| 139 | 154 | adr	r1, reset_text | 
|  | 155 | +	mov	r2, r11 | 
| 140 | 156 | b	panic | 
| 141 |  | -reset_text:
 | 
| 142 |  | -	.ascii	"Hit reset vector!\0"
 | 
| 143 | 157 | .size reset_handler, .-reset_handler | 
| 144 | 158 |  | 
| 145 | 159 | .type undef_instr_handler, %function | 
| 146 | 160 | undef_instr_handler: | 
|  | 161 | +	sub	sp, sp, #0x44 | 
|  | 162 | +	stmia	sp!, {r0-r12} | 
|  | 163 | +	sub	r2, lr, #4 | 
|  | 164 | +	mrs	r3, spsr | 
|  | 165 | +	mrs	r4, cpsr | 
|  | 166 | +	orr	r0, r3, #0xc0 | 
|  | 167 | +	msr	cpsr_c, r0 | 
|  | 168 | +	mov	r0, sp | 
|  | 169 | +	mov	r1, lr | 
|  | 170 | +	msr	cpsr_c, r4 | 
|  | 171 | +	stmia	sp!, {r0-r3} | 
|  | 172 | +	sub	sp, sp, #0x44 | 
| 147 | 173 | mov	r0, #0 | 
| 148 | 174 | adr	r1, undef_instr_text | 
| 149 |  | -	sub	r2, lr, #4
 | 
|  | 175 | +	ldr	r3, [r2] | 
| 150 | 176 | b	panicf | 
| 151 | 177 | .size undef_instr_handler, .-undef_instr_handler | 
| 152 | 178 |  | 
| 153 | 179 | .type prefetch_abort_handler, %function | 
| 154 | 180 | prefetch_abort_handler: | 
|  | 181 | +	sub	sp, sp, #0x44 | 
|  | 182 | +	stmia	sp!, {r0-r12} | 
|  | 183 | +	sub	r2, lr, #4 | 
|  | 184 | +	mrs	r3, spsr | 
|  | 185 | +	mrs	r4, cpsr | 
|  | 186 | +	orr	r0, r3, #0xc0 | 
|  | 187 | +	msr	cpsr_c, r0 | 
|  | 188 | +	mov	r0, sp | 
|  | 189 | +	mov	r1, lr | 
|  | 190 | +	msr	cpsr_c, r4 | 
|  | 191 | +	stmia	sp!, {r0-r3} | 
|  | 192 | +	sub	sp, sp, #0x44 | 
| 155 | 193 | mov	r0, #0 | 
| 156 | 194 | adr	r1, prefetch_abort_text | 
| 157 |  | -	sub	r2, lr, #4
 | 
|  | 195 | +	mrc	p15, 0, r3,c5,c0,1 | 
|  | 196 | +	mov	r4, r3,lsr#4 | 
|  | 197 | +	and	r4, r4, #0xf | 
|  | 198 | +	and	r5, r3, #0xf | 
|  | 199 | +	stmfd	sp!, {r4-r5} | 
| 158 | 200 | b	panicf | 
| 159 | 201 | .size prefetch_abort_handler, .-prefetch_abort_handler | 
| 160 | 202 |  | 
| 161 | 203 | .type data_abort_handler, %function | 
| 162 | 204 | data_abort_handler: | 
|  | 205 | +	sub	sp, sp, #0x44 | 
|  | 206 | +	stmia	sp!, {r0-r12} | 
|  | 207 | +	sub	r2, lr, #8 | 
|  | 208 | +	mrs	r3, spsr | 
|  | 209 | +	mrs	r4, cpsr | 
|  | 210 | +	orr	r0, r3, #0xc0 | 
|  | 211 | +	msr	cpsr_c, r0 | 
|  | 212 | +	mov	r0, sp | 
|  | 213 | +	mov	r1, lr | 
|  | 214 | +	msr	cpsr_c, r4 | 
|  | 215 | +	stmia	sp!, {r0-r3} | 
|  | 216 | +	sub	sp, sp, #0x44 | 
| 163 | 217 | mov	r0, #0 | 
| 164 | 218 | adr	r1, data_abort_text | 
| 165 |  | -	sub	r2, lr, #4
 | 
|  | 219 | +	mrc	p15, 0, r3,c5,c0 | 
|  | 220 | +	mov	r4, r3,lsr#4 | 
|  | 221 | +	and	r4, r4, #0xf | 
|  | 222 | +	and	r5, r3, #0xf | 
|  | 223 | +	mrc	p15, 0, r6,c6,c0 | 
|  | 224 | +	stmfd	sp!, {r4-r6} | 
| 166 | 225 | b	panicf | 
| 167 | 226 | .size data_abort_handler, .-data_abort_handler | 
| 168 | 227 |  | 
| 169 | 228 | .type reserved_handler, %function | 
| 170 | 229 | reserved_handler: | 
|  | 230 | +	stmfd	sp, {r10-r12} | 
|  | 231 | +	mov	r10, sp | 
|  | 232 | +	mov	r11, lr | 
|  | 233 | +	mrs	r12, cpsr | 
|  | 234 | +	msr	cpsr_c, #0xd7 | 
|  | 235 | +	sub	sp, sp, #0x44 | 
|  | 236 | +	stmia	sp!, {r0-r9} | 
|  | 237 | +	sub	r0, r10, #0xc | 
|  | 238 | +	ldmia	r0, {r0-r2} | 
|  | 239 | +	mov	r3, r10 | 
|  | 240 | +	mov	r4, r11 | 
|  | 241 | +	mov	r5, r11 | 
|  | 242 | +	mov	r6, r12 | 
|  | 243 | +	stmia	sp!, {r0-r6} | 
|  | 244 | +	sub	sp, sp, #0x44 | 
| 171 | 245 | mov	r0, #0 | 
| 172 | 246 | adr	r1, reserved_text | 
|  | 247 | +	mov	r2, r11 | 
| 173 | 248 | b	panic | 
| 174 | 249 | .size reserved_handler, .-reserved_handler | 
| 175 | 250 |  | 
| — | — | @@ -179,21 +254,24 @@ | 
| 180 | 255 | b	panic | 
| 181 | 256 | .size fiq_handler, .-fiq_handler | 
| 182 | 257 |  | 
|  | 258 | +prefetch_abort_text: | 
|  | 259 | +	.ascii	"Prefetch abort at %08X!\nFSR: %08X (domain %d, fault %d)\0" | 
|  | 260 | + | 
|  | 261 | +reset_text: | 
|  | 262 | +	.ascii	"Hit reset vector!\n(Last known PC: %08X)\0" | 
|  | 263 | + | 
| 183 | 264 | undef_instr_text: | 
| 184 |  | -	.ascii	"Undefined instruction at %08X!\0"
 | 
|  | 265 | +	.ascii	"Undefined instruction at %08X!\n(Opcode: %08X)\0" | 
| 185 | 266 |  | 
| 186 |  | -prefetch_abort_text:
 | 
| 187 |  | -	.ascii	"Prefetch abort at %08X!\0"
 | 
| 188 |  | -
 | 
| 189 | 267 | data_abort_text: | 
| 190 |  | -	.ascii	"Data abort at %08X!\0"
 | 
|  | 268 | +	.ascii	"Data abort at %08X!\nFSR: %08X (domain %d, fault %d)\nAddress: %08X\0" | 
| 191 | 269 |  | 
| 192 |  | -reserved_text:
 | 
| 193 |  | -	.ascii	"Hit reserved exception handler!\0"
 | 
| 194 |  | -
 | 
| 195 | 270 | fiq_text: | 
| 196 | 271 | .ascii	"Unhandled FIQ!\0" | 
| 197 | 272 |  | 
|  | 273 | +reserved_text: | 
|  | 274 | +	.ascii	"Hit reserved exception handler!\n(Last known PC: %08X)\0" | 
|  | 275 | + | 
| 198 | 276 | syscall_text: | 
| 199 | 277 | .ascii	"Unhandled syscall!\0" | 
| 200 | 278 |  | 
| Index: emcore/trunk/target/ipodclassic/crt0.S | 
| — | — | @@ -185,41 +185,116 @@ | 
| 186 | 186 |  | 
| 187 | 187 | .type reset_handler, %function | 
| 188 | 188 | reset_handler: | 
|  | 189 | +	stmfd	sp, {r10-r12} | 
|  | 190 | +	mov	r10, sp | 
|  | 191 | +	mov	r11, lr | 
|  | 192 | +	mrs	r12, cpsr | 
|  | 193 | +	msr	cpsr_c, #0xd7 | 
|  | 194 | +	sub	sp, sp, #0x44 | 
|  | 195 | +	stmia	sp!, {r0-r9} | 
|  | 196 | +	sub	r0, r10, #0xc | 
|  | 197 | +	ldmia	r0, {r0-r2} | 
|  | 198 | +	mov	r3, r10 | 
|  | 199 | +	mov	r4, r11 | 
|  | 200 | +	mov	r5, r11 | 
|  | 201 | +	mov	r6, r12 | 
|  | 202 | +	stmia	sp!, {r0-r6} | 
|  | 203 | +	sub	sp, sp, #0x44 | 
| 189 | 204 | mov	r0, #0 | 
| 190 | 205 | adr	r1, reset_text | 
|  | 206 | +	mov	r2, r11 | 
| 191 | 207 | b	panic | 
| 192 |  | -reset_text:
 | 
| 193 |  | -	.ascii	"Hit reset vector!\0"
 | 
| 194 | 208 | .size reset_handler, .-reset_handler | 
| 195 | 209 |  | 
| 196 | 210 | .type undef_instr_handler, %function | 
| 197 | 211 | undef_instr_handler: | 
|  | 212 | +	sub	sp, sp, #0x44 | 
|  | 213 | +	stmia	sp!, {r0-r12} | 
|  | 214 | +	sub	r2, lr, #4 | 
|  | 215 | +	mrs	r3, spsr | 
|  | 216 | +	mrs	r4, cpsr | 
|  | 217 | +	orr	r0, r3, #0xc0 | 
|  | 218 | +	msr	cpsr_c, r0 | 
|  | 219 | +	mov	r0, sp | 
|  | 220 | +	mov	r1, lr | 
|  | 221 | +	msr	cpsr_c, r4 | 
|  | 222 | +	stmia	sp!, {r0-r3} | 
|  | 223 | +	sub	sp, sp, #0x44 | 
| 198 | 224 | mov	r0, #0 | 
| 199 | 225 | adr	r1, undef_instr_text | 
| 200 |  | -	sub	r2, lr, #4
 | 
|  | 226 | +	ldr	r3, [r2] | 
| 201 | 227 | b	panicf | 
| 202 | 228 | .size undef_instr_handler, .-undef_instr_handler | 
| 203 | 229 |  | 
| 204 | 230 | .type prefetch_abort_handler, %function | 
| 205 | 231 | prefetch_abort_handler: | 
|  | 232 | +	sub	sp, sp, #0x44 | 
|  | 233 | +	stmia	sp!, {r0-r12} | 
|  | 234 | +	sub	r2, lr, #4 | 
|  | 235 | +	mrs	r3, spsr | 
|  | 236 | +	mrs	r4, cpsr | 
|  | 237 | +	orr	r0, r3, #0xc0 | 
|  | 238 | +	msr	cpsr_c, r0 | 
|  | 239 | +	mov	r0, sp | 
|  | 240 | +	mov	r1, lr | 
|  | 241 | +	msr	cpsr_c, r4 | 
|  | 242 | +	stmia	sp!, {r0-r3} | 
|  | 243 | +	sub	sp, sp, #0x44 | 
| 206 | 244 | mov	r0, #0 | 
| 207 | 245 | adr	r1, prefetch_abort_text | 
| 208 |  | -	sub	r2, lr, #4
 | 
|  | 246 | +	mrc	p15, 0, r3,c5,c0 | 
|  | 247 | +	mov	r4, r3,lsr#4 | 
|  | 248 | +	and	r4, r4, #0xf | 
|  | 249 | +	and	r5, r3, #0xf | 
|  | 250 | +	stmfd	sp!, {r4-r5} | 
| 209 | 251 | b	panicf | 
| 210 | 252 | .size prefetch_abort_handler, .-prefetch_abort_handler | 
| 211 | 253 |  | 
| 212 | 254 | .type data_abort_handler, %function | 
| 213 | 255 | data_abort_handler: | 
|  | 256 | +	sub	sp, sp, #0x44 | 
|  | 257 | +	stmia	sp!, {r0-r12} | 
|  | 258 | +	sub	r2, lr, #8 | 
|  | 259 | +	mrs	r3, spsr | 
|  | 260 | +	mrs	r4, cpsr | 
|  | 261 | +	orr	r0, r3, #0xc0 | 
|  | 262 | +	msr	cpsr_c, r0 | 
|  | 263 | +	mov	r0, sp | 
|  | 264 | +	mov	r1, lr | 
|  | 265 | +	msr	cpsr_c, r4 | 
|  | 266 | +	stmia	sp!, {r0-r3} | 
|  | 267 | +	sub	sp, sp, #0x44 | 
| 214 | 268 | mov	r0, #0 | 
| 215 | 269 | adr	r1, data_abort_text | 
| 216 |  | -	sub	r2, lr, #4
 | 
|  | 270 | +	mrc	p15, 0, r3,c5,c0 | 
|  | 271 | +	mov	r4, r3,lsr#4 | 
|  | 272 | +	and	r4, r4, #0xf | 
|  | 273 | +	and	r5, r3, #0xf | 
|  | 274 | +	mrc	p15, 0, r6,c6,c0 | 
|  | 275 | +	stmfd	sp!, {r4-r6} | 
| 217 | 276 | b	panicf | 
| 218 | 277 | .size data_abort_handler, .-data_abort_handler | 
| 219 | 278 |  | 
| 220 | 279 | .type reserved_handler, %function | 
| 221 | 280 | reserved_handler: | 
|  | 281 | +	stmfd	sp, {r10-r12} | 
|  | 282 | +	mov	r10, sp | 
|  | 283 | +	mov	r11, lr | 
|  | 284 | +	mrs	r12, cpsr | 
|  | 285 | +	msr	cpsr_c, #0xd7 | 
|  | 286 | +	sub	sp, sp, #0x44 | 
|  | 287 | +	stmia	sp!, {r0-r9} | 
|  | 288 | +	sub	r0, r10, #0xc | 
|  | 289 | +	ldmia	r0, {r0-r2} | 
|  | 290 | +	mov	r3, r10 | 
|  | 291 | +	mov	r4, r11 | 
|  | 292 | +	mov	r5, r11 | 
|  | 293 | +	mov	r6, r12 | 
|  | 294 | +	stmia	sp!, {r0-r6} | 
|  | 295 | +	sub	sp, sp, #0x44 | 
| 222 | 296 | mov	r0, #0 | 
| 223 | 297 | adr	r1, reserved_text | 
|  | 298 | +	mov	r2, r11 | 
| 224 | 299 | b	panic | 
| 225 | 300 | .size reserved_handler, .-reserved_handler | 
| 226 | 301 |  | 
| — | — | @@ -230,21 +305,24 @@ | 
| 231 | 306 | b	panic | 
| 232 | 307 | .size fiq_handler, .-fiq_handler | 
| 233 | 308 |  | 
|  | 309 | +prefetch_abort_text: | 
|  | 310 | +	.ascii	"Prefetch abort at %08X!\nFSR: %08X (domain %d, fault %d)\0" | 
|  | 311 | + | 
|  | 312 | +reset_text: | 
|  | 313 | +	.ascii	"Hit reset vector!\n(Last known PC: %08X)\0" | 
|  | 314 | + | 
| 234 | 315 | undef_instr_text: | 
| 235 |  | -	.ascii	"Undefined instruction at %08X!\0"
 | 
|  | 316 | +	.ascii	"Undefined instruction at %08X!\n(Opcode: %08X)\0" | 
| 236 | 317 |  | 
| 237 |  | -prefetch_abort_text:
 | 
| 238 |  | -	.ascii	"Prefetch abort at %08X!\0"
 | 
| 239 |  | -
 | 
| 240 | 318 | data_abort_text: | 
| 241 |  | -	.ascii	"Data abort at %08X!\0"
 | 
|  | 319 | +	.ascii	"Data abort at %08X!\nFSR: %08X (domain %d, fault %d)\nAddress: %08X\0" | 
| 242 | 320 |  | 
| 243 |  | -reserved_text:
 | 
| 244 |  | -	.ascii	"Hit reserved exception handler!\0"
 | 
| 245 |  | -
 | 
| 246 | 321 | fiq_text: | 
| 247 | 322 | .ascii	"Unhandled FIQ!\0" | 
| 248 | 323 |  | 
|  | 324 | +reserved_text: | 
|  | 325 | +	.ascii	"Hit reserved exception handler!\n(Last known PC: %08X)\0" | 
|  | 326 | + | 
| 249 | 327 | syscall_text: | 
| 250 | 328 | .ascii	"Unhandled syscall!\0" | 
| 251 | 329 |  | 
| Index: emcore/trunk/arm/contextswitch.S | 
| — | — | @@ -23,8 +23,31 @@ | 
| 24 | 24 | #define ASM_FILE | 
| 25 | 25 | #include "global.h" | 
| 26 | 26 |  | 
| 27 |  | -.section .icode.yield, "ax", %progbits
 | 
|  | 27 | +.section .icode.contextswitch, "ax", %progbits | 
| 28 | 28 | .align 2 | 
|  | 29 | +.global panic_recover | 
|  | 30 | +.type panic_recover, %function | 
|  | 31 | +panic_recover: | 
|  | 32 | +	mrs	r0, cpsr | 
|  | 33 | +	and	r0, r0, #0x1f | 
|  | 34 | +	cmp	r0, #0x17 | 
|  | 35 | +	cmpne	r0, #0x1b | 
|  | 36 | +	bne	yield | 
|  | 37 | +	ldr	sp, =_abortstackend - 0x44 | 
|  | 38 | +	ldr	r9, =current_thread | 
|  | 39 | +	ldr	lr, [r9] | 
|  | 40 | +	ldmia	sp!, {r0-r7} | 
|  | 41 | +	stmia	lr!, {r0-r7} | 
|  | 42 | +	ldmia	sp!, {r0-r8} | 
|  | 43 | +	stmia	lr!, {r0-r8} | 
|  | 44 | +	msr	cpsr_c, #0xd2 | 
|  | 45 | +	bl	scheduler_pause_accounting | 
|  | 46 | +	adr	lr, resume_thread | 
|  | 47 | +	mov	r0, #0 | 
|  | 48 | +	mov	r1, r9 | 
|  | 49 | +	b	scheduler_switch | 
|  | 50 | +.size panic_recover, .-panic_recover | 
|  | 51 | + | 
| 29 | 52 | .global yield | 
| 30 | 53 | .type yield, %function | 
| 31 | 54 | yield: | 
| Index: emcore/trunk/contextswitch.h | 
| — | — | @@ -29,6 +29,7 @@ | 
| 30 | 30 |  | 
| 31 | 31 |  | 
| 32 | 32 | void handle_irq(void) __attribute__((noreturn)) ICODE_ATTR; | 
|  | 33 | +void panic_recover() ICODE_ATTR; | 
| 33 | 34 | void yield() ICODE_ATTR; | 
| 34 | 35 | void resume_thread(void) __attribute__((noreturn)) ICODE_ATTR; | 
| 35 | 36 | uint32_t enter_critical_section(void) ICODE_ATTR; |