diff options
Diffstat (limited to 'arch/sh/kernel/dwarf.c')
-rw-r--r-- | arch/sh/kernel/dwarf.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/arch/sh/kernel/dwarf.c b/arch/sh/kernel/dwarf.c index d271d04adccd..606ece37eb42 100644 --- a/arch/sh/kernel/dwarf.c +++ b/arch/sh/kernel/dwarf.c | |||
@@ -69,7 +69,7 @@ static struct dwarf_reg *dwarf_frame_alloc_reg(struct dwarf_frame *frame, | |||
69 | * Let's just bomb hard here, we have no way to | 69 | * Let's just bomb hard here, we have no way to |
70 | * gracefully recover. | 70 | * gracefully recover. |
71 | */ | 71 | */ |
72 | BUG(); | 72 | UNWINDER_BUG(); |
73 | } | 73 | } |
74 | 74 | ||
75 | reg->number = reg_num; | 75 | reg->number = reg_num; |
@@ -232,7 +232,7 @@ static int dwarf_read_encoded_value(char *addr, unsigned long *val, | |||
232 | break; | 232 | break; |
233 | default: | 233 | default: |
234 | pr_debug("encoding=0x%x\n", (encoding & 0x70)); | 234 | pr_debug("encoding=0x%x\n", (encoding & 0x70)); |
235 | BUG(); | 235 | UNWINDER_BUG(); |
236 | } | 236 | } |
237 | 237 | ||
238 | if ((encoding & 0x07) == 0x00) | 238 | if ((encoding & 0x07) == 0x00) |
@@ -247,7 +247,7 @@ static int dwarf_read_encoded_value(char *addr, unsigned long *val, | |||
247 | break; | 247 | break; |
248 | default: | 248 | default: |
249 | pr_debug("encoding=0x%x\n", encoding); | 249 | pr_debug("encoding=0x%x\n", encoding); |
250 | BUG(); | 250 | UNWINDER_BUG(); |
251 | } | 251 | } |
252 | 252 | ||
253 | return count; | 253 | return count; |
@@ -519,6 +519,7 @@ static int dwarf_cfa_execute_insns(unsigned char *insn_start, | |||
519 | break; | 519 | break; |
520 | default: | 520 | default: |
521 | pr_debug("unhandled DWARF instruction 0x%x\n", insn); | 521 | pr_debug("unhandled DWARF instruction 0x%x\n", insn); |
522 | UNWINDER_BUG(); | ||
522 | break; | 523 | break; |
523 | } | 524 | } |
524 | } | 525 | } |
@@ -535,8 +536,8 @@ static int dwarf_cfa_execute_insns(unsigned char *insn_start, | |||
535 | * on the callstack. Each of the lower (older) stack frames are | 536 | * on the callstack. Each of the lower (older) stack frames are |
536 | * linked via the "prev" member. | 537 | * linked via the "prev" member. |
537 | */ | 538 | */ |
538 | struct dwarf_frame *dwarf_unwind_stack(unsigned long pc, | 539 | struct dwarf_frame * dwarf_unwind_stack(unsigned long pc, |
539 | struct dwarf_frame *prev) | 540 | struct dwarf_frame *prev) |
540 | { | 541 | { |
541 | struct dwarf_frame *frame; | 542 | struct dwarf_frame *frame; |
542 | struct dwarf_cie *cie; | 543 | struct dwarf_cie *cie; |
@@ -558,7 +559,7 @@ struct dwarf_frame *dwarf_unwind_stack(unsigned long pc, | |||
558 | frame = mempool_alloc(dwarf_frame_pool, GFP_ATOMIC); | 559 | frame = mempool_alloc(dwarf_frame_pool, GFP_ATOMIC); |
559 | if (!frame) { | 560 | if (!frame) { |
560 | printk(KERN_ERR "Unable to allocate a dwarf frame\n"); | 561 | printk(KERN_ERR "Unable to allocate a dwarf frame\n"); |
561 | BUG(); | 562 | UNWINDER_BUG(); |
562 | } | 563 | } |
563 | 564 | ||
564 | INIT_LIST_HEAD(&frame->reg_list); | 565 | INIT_LIST_HEAD(&frame->reg_list); |
@@ -605,7 +606,8 @@ struct dwarf_frame *dwarf_unwind_stack(unsigned long pc, | |||
605 | case DWARF_FRAME_CFA_REG_OFFSET: | 606 | case DWARF_FRAME_CFA_REG_OFFSET: |
606 | if (prev) { | 607 | if (prev) { |
607 | reg = dwarf_frame_reg(prev, frame->cfa_register); | 608 | reg = dwarf_frame_reg(prev, frame->cfa_register); |
608 | BUG_ON(!reg); | 609 | UNWINDER_BUG_ON(!reg); |
610 | UNWINDER_BUG_ON(reg->flags != DWARF_REG_OFFSET); | ||
609 | 611 | ||
610 | addr = prev->cfa + reg->addr; | 612 | addr = prev->cfa + reg->addr; |
611 | frame->cfa = __raw_readl(addr); | 613 | frame->cfa = __raw_readl(addr); |
@@ -624,12 +626,13 @@ struct dwarf_frame *dwarf_unwind_stack(unsigned long pc, | |||
624 | frame->cfa += frame->cfa_offset; | 626 | frame->cfa += frame->cfa_offset; |
625 | break; | 627 | break; |
626 | default: | 628 | default: |
627 | BUG(); | 629 | UNWINDER_BUG(); |
628 | } | 630 | } |
629 | 631 | ||
630 | /* If we haven't seen the return address reg, we're screwed. */ | 632 | /* If we haven't seen the return address reg, we're screwed. */ |
631 | reg = dwarf_frame_reg(frame, DWARF_ARCH_RA_REG); | 633 | reg = dwarf_frame_reg(frame, DWARF_ARCH_RA_REG); |
632 | BUG_ON(!reg); | 634 | UNWINDER_BUG_ON(!reg); |
635 | UNWINDER_BUG_ON(reg->flags != DWARF_REG_OFFSET); | ||
633 | 636 | ||
634 | addr = frame->cfa + reg->addr; | 637 | addr = frame->cfa + reg->addr; |
635 | frame->return_addr = __raw_readl(addr); | 638 | frame->return_addr = __raw_readl(addr); |
@@ -664,7 +667,7 @@ static int dwarf_parse_cie(void *entry, void *p, unsigned long len, | |||
664 | cie->cie_pointer = (unsigned long)entry; | 667 | cie->cie_pointer = (unsigned long)entry; |
665 | 668 | ||
666 | cie->version = *(char *)p++; | 669 | cie->version = *(char *)p++; |
667 | BUG_ON(cie->version != 1); | 670 | UNWINDER_BUG_ON(cie->version != 1); |
668 | 671 | ||
669 | cie->augmentation = p; | 672 | cie->augmentation = p; |
670 | p += strlen(cie->augmentation) + 1; | 673 | p += strlen(cie->augmentation) + 1; |
@@ -694,7 +697,7 @@ static int dwarf_parse_cie(void *entry, void *p, unsigned long len, | |||
694 | count = dwarf_read_uleb128(p, &length); | 697 | count = dwarf_read_uleb128(p, &length); |
695 | p += count; | 698 | p += count; |
696 | 699 | ||
697 | BUG_ON((unsigned char *)p > end); | 700 | UNWINDER_BUG_ON((unsigned char *)p > end); |
698 | 701 | ||
699 | cie->initial_instructions = p + length; | 702 | cie->initial_instructions = p + length; |
700 | cie->augmentation++; | 703 | cie->augmentation++; |
@@ -722,16 +725,16 @@ static int dwarf_parse_cie(void *entry, void *p, unsigned long len, | |||
722 | * routine in the CIE | 725 | * routine in the CIE |
723 | * augmentation. | 726 | * augmentation. |
724 | */ | 727 | */ |
725 | BUG(); | 728 | UNWINDER_BUG(); |
726 | } else if (*cie->augmentation == 'S') { | 729 | } else if (*cie->augmentation == 'S') { |
727 | BUG(); | 730 | UNWINDER_BUG(); |
728 | } else { | 731 | } else { |
729 | /* | 732 | /* |
730 | * Unknown augmentation. Assume | 733 | * Unknown augmentation. Assume |
731 | * 'z' augmentation. | 734 | * 'z' augmentation. |
732 | */ | 735 | */ |
733 | p = cie->initial_instructions; | 736 | p = cie->initial_instructions; |
734 | BUG_ON(!p); | 737 | UNWINDER_BUG_ON(!p); |
735 | break; | 738 | break; |
736 | } | 739 | } |
737 | } | 740 | } |
@@ -805,9 +808,11 @@ static int dwarf_parse_fde(void *entry, u32 entry_type, | |||
805 | return 0; | 808 | return 0; |
806 | } | 809 | } |
807 | 810 | ||
808 | static void dwarf_unwinder_dump(struct task_struct *task, struct pt_regs *regs, | 811 | static void dwarf_unwinder_dump(struct task_struct *task, |
812 | struct pt_regs *regs, | ||
809 | unsigned long *sp, | 813 | unsigned long *sp, |
810 | const struct stacktrace_ops *ops, void *data) | 814 | const struct stacktrace_ops *ops, |
815 | void *data) | ||
811 | { | 816 | { |
812 | struct dwarf_frame *frame, *_frame; | 817 | struct dwarf_frame *frame, *_frame; |
813 | unsigned long return_addr; | 818 | unsigned long return_addr; |
@@ -831,7 +836,6 @@ static void dwarf_unwinder_dump(struct task_struct *task, struct pt_regs *regs, | |||
831 | return_addr = frame->return_addr; | 836 | return_addr = frame->return_addr; |
832 | ops->address(data, return_addr, 1); | 837 | ops->address(data, return_addr, 1); |
833 | } | 838 | } |
834 | |||
835 | } | 839 | } |
836 | 840 | ||
837 | static struct unwinder dwarf_unwinder = { | 841 | static struct unwinder dwarf_unwinder = { |