[AVR32] Implement irqflags trace and lockdep support

Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>

+43 -19
+6
arch/avr32/Kconfig
··· 27 27 config STACKTRACE_SUPPORT 28 28 def_bool y 29 29 30 + config LOCKDEP_SUPPORT 31 + def_bool y 32 + 33 + config TRACE_IRQFLAGS_SUPPORT 34 + def_bool y 35 + 30 36 config HARDIRQS_SW_RESEND 31 37 def_bool y 32 38
+35 -19
arch/avr32/kernel/entry-avr32b.S
··· 527 527 528 528 /* If we get a debug trap from privileged context we end up here */ 529 529 handle_debug_priv: 530 - /* Fix up LR and SP in regs. r11 contains the mode we came from */ 531 - mfsr r8, SYSREG_SR 532 - mov r9, r8 533 - andh r8, hi(~MODE_MASK) 534 - or r8, r11 535 - mtsr SYSREG_SR, r8 530 + /* Fix up LR and SP in regs. r1 contains the mode we came from */ 531 + mfsr r2, SYSREG_SR 532 + mov r3, r2 533 + bfins r2, r1, SYSREG_MODE_OFFSET, SYSREG_MODE_SIZE 534 + mtsr SYSREG_SR, r2 536 535 sub pc, -2 537 536 stdsp sp[REG_LR], lr 538 - mtsr SYSREG_SR, r9 537 + mtsr SYSREG_SR, r3 539 538 sub pc, -2 540 539 sub r10, sp, -FRAME_SIZE_FULL 541 540 stdsp sp[REG_SP], r10 ··· 546 547 popm r10, r11 547 548 mtsr SYSREG_RAR_DBG, r10 548 549 mtsr SYSREG_RSR_DBG, r11 549 - mfsr r8, SYSREG_SR 550 - mov r9, r8 551 - andh r8, hi(~MODE_MASK) 552 - andh r11, hi(MODE_MASK) 553 - or r8, r11 554 - mtsr SYSREG_SR, r8 550 + #ifdef CONFIG_TRACE_IRQFLAGS 551 + bld r11, SYSREG_GM_OFFSET 552 + brcc 1f 553 + rcall trace_hardirqs_on 554 + 1: 555 + #endif 556 + mfsr r2, SYSREG_SR 557 + mov r3, r2 558 + bfins r2, r1, SYSREG_MODE_OFFSET, SYSREG_MODE_SIZE 559 + mtsr SYSREG_SR, r2 555 560 sub pc, -2 556 561 popm lr 557 - mtsr SYSREG_SR, r9 562 + mtsr SYSREG_SR, r3 558 563 sub pc, -2 559 564 sub sp, -4 /* skip SP */ 560 565 popm r0-r12 ··· 575 572 handle_debug: 576 573 sub sp, 4 /* r12_orig */ 577 574 stmts --sp, r0-lr 578 - mfsr r10, SYSREG_RAR_DBG 579 - mfsr r11, SYSREG_RSR_DBG 575 + mfsr r0, SYSREG_RAR_DBG 576 + mfsr r1, SYSREG_RSR_DBG 577 + #ifdef CONFIG_TRACE_IRQFLAGS 578 + rcall trace_hardirqs_off 579 + #endif 580 580 unmask_exceptions 581 - pushm r10,r11 582 - andh r11, (MODE_MASK >> 16), COH 581 + stm --sp, r0, r1 582 + bfextu r1, r1, SYSREG_MODE_OFFSET, SYSREG_MODE_SIZE 583 583 brne handle_debug_priv 584 584 585 585 mov r12, sp ··· 597 591 mask_exceptions 598 592 mtsr SYSREG_RSR_DBG, r11 599 593 mtsr SYSREG_RAR_DBG, r10 594 + #ifdef CONFIG_TRACE_IRQFLAGS 595 + bld r11, SYSREG_GM_OFFSET 596 + brcc 1f 597 + rcall trace_hardirqs_on 598 + 1: 599 + #endif 600 600 ldmts sp++, r0-lr 601 601 sub sp, -4 602 602 retd ··· 687 675 andl r1, _TIF_WORK_MASK, COH 688 676 brne irq_exit_work 689 677 690 - 1: popm r8-r9 678 + 1: 679 + #ifdef CONFIG_TRACE_IRQFLAGS 680 + rcall trace_hardirqs_on 681 + #endif 682 + popm r8-r9 691 683 mtsr rar_int\level, r8 692 684 mtsr rsr_int\level, r9 693 685 ldmts sp++,r0-lr
+2
include/asm-avr32/sysreg.h
··· 93 93 #define SYSREG_I3M_SIZE 1 94 94 #define SYSREG_EM_OFFSET 21 95 95 #define SYSREG_EM_SIZE 1 96 + #define SYSREG_MODE_OFFSET 22 97 + #define SYSREG_MODE_SIZE 3 96 98 #define SYSREG_M0_OFFSET 22 97 99 #define SYSREG_M0_SIZE 1 98 100 #define SYSREG_M1_OFFSET 23