This source file includes following definitions.
- dwarf_frame_alloc_reg
- dwarf_frame_free_regs
- dwarf_frame_reg
- dwarf_read_addr
- dwarf_read_uleb128
- dwarf_read_leb128
- dwarf_read_encoded_value
- dwarf_entry_len
- dwarf_lookup_cie
- dwarf_lookup_fde
- dwarf_cfa_execute_insns
- dwarf_free_frame
- dwarf_unwind_stack
- dwarf_parse_cie
- dwarf_parse_fde
- dwarf_unwinder_dump
- dwarf_unwinder_cleanup
- dwarf_parse_section
- module_dwarf_finalize
- module_dwarf_cleanup
- dwarf_unwinder_init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <linux/kernel.h>
16 #include <linux/io.h>
17 #include <linux/list.h>
18 #include <linux/mempool.h>
19 #include <linux/mm.h>
20 #include <linux/elf.h>
21 #include <linux/ftrace.h>
22 #include <linux/module.h>
23 #include <linux/slab.h>
24 #include <asm/dwarf.h>
25 #include <asm/unwinder.h>
26 #include <asm/sections.h>
27 #include <asm/unaligned.h>
28 #include <asm/stacktrace.h>
29
30
31 #define DWARF_FRAME_MIN_REQ 2
32
33 #define DWARF_REG_MIN_REQ (DWARF_FRAME_MIN_REQ * 4)
34
35 static struct kmem_cache *dwarf_frame_cachep;
36 static mempool_t *dwarf_frame_pool;
37
38 static struct kmem_cache *dwarf_reg_cachep;
39 static mempool_t *dwarf_reg_pool;
40
41 static struct rb_root cie_root;
42 static DEFINE_SPINLOCK(dwarf_cie_lock);
43
44 static struct rb_root fde_root;
45 static DEFINE_SPINLOCK(dwarf_fde_lock);
46
47 static struct dwarf_cie *cached_cie;
48
49 static unsigned int dwarf_unwinder_ready;
50
51
52
53
54
55
56
57
58
59
60
61
62 static struct dwarf_reg *dwarf_frame_alloc_reg(struct dwarf_frame *frame,
63 unsigned int reg_num)
64 {
65 struct dwarf_reg *reg;
66
67 reg = mempool_alloc(dwarf_reg_pool, GFP_ATOMIC);
68 if (!reg) {
69 printk(KERN_WARNING "Unable to allocate a DWARF register\n");
70
71
72
73
74 UNWINDER_BUG();
75 }
76
77 reg->number = reg_num;
78 reg->addr = 0;
79 reg->flags = 0;
80
81 list_add(®->link, &frame->reg_list);
82
83 return reg;
84 }
85
86 static void dwarf_frame_free_regs(struct dwarf_frame *frame)
87 {
88 struct dwarf_reg *reg, *n;
89
90 list_for_each_entry_safe(reg, n, &frame->reg_list, link) {
91 list_del(®->link);
92 mempool_free(reg, dwarf_reg_pool);
93 }
94 }
95
96
97
98
99
100
101
102
103
104 static struct dwarf_reg *dwarf_frame_reg(struct dwarf_frame *frame,
105 unsigned int reg_num)
106 {
107 struct dwarf_reg *reg;
108
109 list_for_each_entry(reg, &frame->reg_list, link) {
110 if (reg->number == reg_num)
111 return reg;
112 }
113
114 return NULL;
115 }
116
117
118
119
120
121
122
123
124
125
126
127
128 static inline int dwarf_read_addr(unsigned long *src, unsigned long *dst)
129 {
130 u32 val = get_unaligned(src);
131 put_unaligned(val, dst);
132 return sizeof(unsigned long *);
133 }
134
135
136
137
138
139
140
141
142
143
144
145 static inline unsigned long dwarf_read_uleb128(char *addr, unsigned int *ret)
146 {
147 unsigned int result;
148 unsigned char byte;
149 int shift, count;
150
151 result = 0;
152 shift = 0;
153 count = 0;
154
155 while (1) {
156 byte = __raw_readb(addr);
157 addr++;
158 count++;
159
160 result |= (byte & 0x7f) << shift;
161 shift += 7;
162
163 if (!(byte & 0x80))
164 break;
165 }
166
167 *ret = result;
168
169 return count;
170 }
171
172
173
174
175
176
177
178
179
180 static inline unsigned long dwarf_read_leb128(char *addr, int *ret)
181 {
182 unsigned char byte;
183 int result, shift;
184 int num_bits;
185 int count;
186
187 result = 0;
188 shift = 0;
189 count = 0;
190
191 while (1) {
192 byte = __raw_readb(addr);
193 addr++;
194 result |= (byte & 0x7f) << shift;
195 shift += 7;
196 count++;
197
198 if (!(byte & 0x80))
199 break;
200 }
201
202
203 num_bits = 8 * sizeof(result);
204
205 if ((shift < num_bits) && (byte & 0x40))
206 result |= (-1 << shift);
207
208 *ret = result;
209
210 return count;
211 }
212
213
214
215
216
217
218
219
220
221
222
223 static int dwarf_read_encoded_value(char *addr, unsigned long *val,
224 char encoding)
225 {
226 unsigned long decoded_addr = 0;
227 int count = 0;
228
229 switch (encoding & 0x70) {
230 case DW_EH_PE_absptr:
231 break;
232 case DW_EH_PE_pcrel:
233 decoded_addr = (unsigned long)addr;
234 break;
235 default:
236 pr_debug("encoding=0x%x\n", (encoding & 0x70));
237 UNWINDER_BUG();
238 }
239
240 if ((encoding & 0x07) == 0x00)
241 encoding |= DW_EH_PE_udata4;
242
243 switch (encoding & 0x0f) {
244 case DW_EH_PE_sdata4:
245 case DW_EH_PE_udata4:
246 count += 4;
247 decoded_addr += get_unaligned((u32 *)addr);
248 __raw_writel(decoded_addr, val);
249 break;
250 default:
251 pr_debug("encoding=0x%x\n", encoding);
252 UNWINDER_BUG();
253 }
254
255 return count;
256 }
257
258
259
260
261
262
263
264
265
266
267 static inline int dwarf_entry_len(char *addr, unsigned long *len)
268 {
269 u32 initial_len;
270 int count;
271
272 initial_len = get_unaligned((u32 *)addr);
273 count = 4;
274
275
276
277
278
279
280
281 if (initial_len >= DW_EXT_LO && initial_len <= DW_EXT_HI) {
282
283
284
285
286 if (initial_len == DW_EXT_DWARF64) {
287 *len = get_unaligned((u64 *)addr + 4);
288 count = 12;
289 } else {
290 printk(KERN_WARNING "Unknown DWARF extension\n");
291 count = 0;
292 }
293 } else
294 *len = initial_len;
295
296 return count;
297 }
298
299
300
301
302
303 static struct dwarf_cie *dwarf_lookup_cie(unsigned long cie_ptr)
304 {
305 struct rb_node **rb_node = &cie_root.rb_node;
306 struct dwarf_cie *cie = NULL;
307 unsigned long flags;
308
309 spin_lock_irqsave(&dwarf_cie_lock, flags);
310
311
312
313
314
315 if (cached_cie && cached_cie->cie_pointer == cie_ptr) {
316 cie = cached_cie;
317 goto out;
318 }
319
320 while (*rb_node) {
321 struct dwarf_cie *cie_tmp;
322
323 cie_tmp = rb_entry(*rb_node, struct dwarf_cie, node);
324 BUG_ON(!cie_tmp);
325
326 if (cie_ptr == cie_tmp->cie_pointer) {
327 cie = cie_tmp;
328 cached_cie = cie_tmp;
329 goto out;
330 } else {
331 if (cie_ptr < cie_tmp->cie_pointer)
332 rb_node = &(*rb_node)->rb_left;
333 else
334 rb_node = &(*rb_node)->rb_right;
335 }
336 }
337
338 out:
339 spin_unlock_irqrestore(&dwarf_cie_lock, flags);
340 return cie;
341 }
342
343
344
345
346
347 struct dwarf_fde *dwarf_lookup_fde(unsigned long pc)
348 {
349 struct rb_node **rb_node = &fde_root.rb_node;
350 struct dwarf_fde *fde = NULL;
351 unsigned long flags;
352
353 spin_lock_irqsave(&dwarf_fde_lock, flags);
354
355 while (*rb_node) {
356 struct dwarf_fde *fde_tmp;
357 unsigned long tmp_start, tmp_end;
358
359 fde_tmp = rb_entry(*rb_node, struct dwarf_fde, node);
360 BUG_ON(!fde_tmp);
361
362 tmp_start = fde_tmp->initial_location;
363 tmp_end = fde_tmp->initial_location + fde_tmp->address_range;
364
365 if (pc < tmp_start) {
366 rb_node = &(*rb_node)->rb_left;
367 } else {
368 if (pc < tmp_end) {
369 fde = fde_tmp;
370 goto out;
371 } else
372 rb_node = &(*rb_node)->rb_right;
373 }
374 }
375
376 out:
377 spin_unlock_irqrestore(&dwarf_fde_lock, flags);
378
379 return fde;
380 }
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396 static int dwarf_cfa_execute_insns(unsigned char *insn_start,
397 unsigned char *insn_end,
398 struct dwarf_cie *cie,
399 struct dwarf_fde *fde,
400 struct dwarf_frame *frame,
401 unsigned long pc)
402 {
403 unsigned char insn;
404 unsigned char *current_insn;
405 unsigned int count, delta, reg, expr_len, offset;
406 struct dwarf_reg *regp;
407
408 current_insn = insn_start;
409
410 while (current_insn < insn_end && frame->pc <= pc) {
411 insn = __raw_readb(current_insn++);
412
413
414
415
416
417 switch (DW_CFA_opcode(insn)) {
418 case DW_CFA_advance_loc:
419 delta = DW_CFA_operand(insn);
420 delta *= cie->code_alignment_factor;
421 frame->pc += delta;
422 continue;
423
424 case DW_CFA_offset:
425 reg = DW_CFA_operand(insn);
426 count = dwarf_read_uleb128(current_insn, &offset);
427 current_insn += count;
428 offset *= cie->data_alignment_factor;
429 regp = dwarf_frame_alloc_reg(frame, reg);
430 regp->addr = offset;
431 regp->flags |= DWARF_REG_OFFSET;
432 continue;
433
434 case DW_CFA_restore:
435 reg = DW_CFA_operand(insn);
436 continue;
437
438 }
439
440
441
442
443
444 switch (insn) {
445 case DW_CFA_nop:
446 continue;
447 case DW_CFA_advance_loc1:
448 delta = *current_insn++;
449 frame->pc += delta * cie->code_alignment_factor;
450 break;
451 case DW_CFA_advance_loc2:
452 delta = get_unaligned((u16 *)current_insn);
453 current_insn += 2;
454 frame->pc += delta * cie->code_alignment_factor;
455 break;
456 case DW_CFA_advance_loc4:
457 delta = get_unaligned((u32 *)current_insn);
458 current_insn += 4;
459 frame->pc += delta * cie->code_alignment_factor;
460 break;
461 case DW_CFA_offset_extended:
462 count = dwarf_read_uleb128(current_insn, ®);
463 current_insn += count;
464 count = dwarf_read_uleb128(current_insn, &offset);
465 current_insn += count;
466 offset *= cie->data_alignment_factor;
467 break;
468 case DW_CFA_restore_extended:
469 count = dwarf_read_uleb128(current_insn, ®);
470 current_insn += count;
471 break;
472 case DW_CFA_undefined:
473 count = dwarf_read_uleb128(current_insn, ®);
474 current_insn += count;
475 regp = dwarf_frame_alloc_reg(frame, reg);
476 regp->flags |= DWARF_UNDEFINED;
477 break;
478 case DW_CFA_def_cfa:
479 count = dwarf_read_uleb128(current_insn,
480 &frame->cfa_register);
481 current_insn += count;
482 count = dwarf_read_uleb128(current_insn,
483 &frame->cfa_offset);
484 current_insn += count;
485
486 frame->flags |= DWARF_FRAME_CFA_REG_OFFSET;
487 break;
488 case DW_CFA_def_cfa_register:
489 count = dwarf_read_uleb128(current_insn,
490 &frame->cfa_register);
491 current_insn += count;
492 frame->flags |= DWARF_FRAME_CFA_REG_OFFSET;
493 break;
494 case DW_CFA_def_cfa_offset:
495 count = dwarf_read_uleb128(current_insn, &offset);
496 current_insn += count;
497 frame->cfa_offset = offset;
498 break;
499 case DW_CFA_def_cfa_expression:
500 count = dwarf_read_uleb128(current_insn, &expr_len);
501 current_insn += count;
502
503 frame->cfa_expr = current_insn;
504 frame->cfa_expr_len = expr_len;
505 current_insn += expr_len;
506
507 frame->flags |= DWARF_FRAME_CFA_REG_EXP;
508 break;
509 case DW_CFA_offset_extended_sf:
510 count = dwarf_read_uleb128(current_insn, ®);
511 current_insn += count;
512 count = dwarf_read_leb128(current_insn, &offset);
513 current_insn += count;
514 offset *= cie->data_alignment_factor;
515 regp = dwarf_frame_alloc_reg(frame, reg);
516 regp->flags |= DWARF_REG_OFFSET;
517 regp->addr = offset;
518 break;
519 case DW_CFA_val_offset:
520 count = dwarf_read_uleb128(current_insn, ®);
521 current_insn += count;
522 count = dwarf_read_leb128(current_insn, &offset);
523 offset *= cie->data_alignment_factor;
524 regp = dwarf_frame_alloc_reg(frame, reg);
525 regp->flags |= DWARF_VAL_OFFSET;
526 regp->addr = offset;
527 break;
528 case DW_CFA_GNU_args_size:
529 count = dwarf_read_uleb128(current_insn, &offset);
530 current_insn += count;
531 break;
532 case DW_CFA_GNU_negative_offset_extended:
533 count = dwarf_read_uleb128(current_insn, ®);
534 current_insn += count;
535 count = dwarf_read_uleb128(current_insn, &offset);
536 offset *= cie->data_alignment_factor;
537
538 regp = dwarf_frame_alloc_reg(frame, reg);
539 regp->flags |= DWARF_REG_OFFSET;
540 regp->addr = -offset;
541 break;
542 default:
543 pr_debug("unhandled DWARF instruction 0x%x\n", insn);
544 UNWINDER_BUG();
545 break;
546 }
547 }
548
549 return 0;
550 }
551
552
553
554
555
556 void dwarf_free_frame(struct dwarf_frame *frame)
557 {
558 dwarf_frame_free_regs(frame);
559 mempool_free(frame, dwarf_frame_pool);
560 }
561
562 extern void ret_from_irq(void);
563
564
565
566
567
568
569
570
571
572
573
574 struct dwarf_frame *dwarf_unwind_stack(unsigned long pc,
575 struct dwarf_frame *prev)
576 {
577 struct dwarf_frame *frame;
578 struct dwarf_cie *cie;
579 struct dwarf_fde *fde;
580 struct dwarf_reg *reg;
581 unsigned long addr;
582
583
584
585
586
587 if (!dwarf_unwinder_ready)
588 return NULL;
589
590
591
592
593
594
595
596
597
598 if (!pc || !prev)
599 pc = _THIS_IP_;
600
601 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
602
603
604
605
606
607 if (pc == (unsigned long)&return_to_handler) {
608 struct ftrace_ret_stack *ret_stack;
609
610 ret_stack = ftrace_graph_get_ret_stack(current, 0);
611 if (ret_stack)
612 pc = ret_stack->ret;
613
614
615
616
617
618
619 WARN_ON(ftrace_graph_get_ret_stack(current, 1));
620 }
621 #endif
622
623 frame = mempool_alloc(dwarf_frame_pool, GFP_ATOMIC);
624 if (!frame) {
625 printk(KERN_ERR "Unable to allocate a dwarf frame\n");
626 UNWINDER_BUG();
627 }
628
629 INIT_LIST_HEAD(&frame->reg_list);
630 frame->flags = 0;
631 frame->prev = prev;
632 frame->return_addr = 0;
633
634 fde = dwarf_lookup_fde(pc);
635 if (!fde) {
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651 goto bail;
652 }
653
654 cie = dwarf_lookup_cie(fde->cie_pointer);
655
656 frame->pc = fde->initial_location;
657
658
659 dwarf_cfa_execute_insns(cie->initial_instructions,
660 cie->instructions_end, cie, fde,
661 frame, pc);
662
663
664 dwarf_cfa_execute_insns(fde->instructions, fde->end, cie,
665 fde, frame, pc);
666
667
668 switch (frame->flags) {
669 case DWARF_FRAME_CFA_REG_OFFSET:
670 if (prev) {
671 reg = dwarf_frame_reg(prev, frame->cfa_register);
672 UNWINDER_BUG_ON(!reg);
673 UNWINDER_BUG_ON(reg->flags != DWARF_REG_OFFSET);
674
675 addr = prev->cfa + reg->addr;
676 frame->cfa = __raw_readl(addr);
677
678 } else {
679
680
681
682
683
684
685
686 frame->cfa = dwarf_read_arch_reg(frame->cfa_register);
687 }
688
689 frame->cfa += frame->cfa_offset;
690 break;
691 default:
692 UNWINDER_BUG();
693 }
694
695 reg = dwarf_frame_reg(frame, DWARF_ARCH_RA_REG);
696
697
698
699
700
701
702 if (!reg || reg->flags == DWARF_UNDEFINED)
703 goto bail;
704
705 UNWINDER_BUG_ON(reg->flags != DWARF_REG_OFFSET);
706
707 addr = frame->cfa + reg->addr;
708 frame->return_addr = __raw_readl(addr);
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725 if (prev && prev->pc == (unsigned long)ret_from_irq)
726 frame->return_addr = 0;
727
728 return frame;
729
730 bail:
731 dwarf_free_frame(frame);
732 return NULL;
733 }
734
735 static int dwarf_parse_cie(void *entry, void *p, unsigned long len,
736 unsigned char *end, struct module *mod)
737 {
738 struct rb_node **rb_node = &cie_root.rb_node;
739 struct rb_node *parent = *rb_node;
740 struct dwarf_cie *cie;
741 unsigned long flags;
742 int count;
743
744 cie = kzalloc(sizeof(*cie), GFP_KERNEL);
745 if (!cie)
746 return -ENOMEM;
747
748 cie->length = len;
749
750
751
752
753
754
755
756 cie->cie_pointer = (unsigned long)entry;
757
758 cie->version = *(char *)p++;
759 UNWINDER_BUG_ON(cie->version != 1);
760
761 cie->augmentation = p;
762 p += strlen(cie->augmentation) + 1;
763
764 count = dwarf_read_uleb128(p, &cie->code_alignment_factor);
765 p += count;
766
767 count = dwarf_read_leb128(p, &cie->data_alignment_factor);
768 p += count;
769
770
771
772
773
774 if (cie->version == 1) {
775 cie->return_address_reg = __raw_readb(p);
776 p++;
777 } else {
778 count = dwarf_read_uleb128(p, &cie->return_address_reg);
779 p += count;
780 }
781
782 if (cie->augmentation[0] == 'z') {
783 unsigned int length, count;
784 cie->flags |= DWARF_CIE_Z_AUGMENTATION;
785
786 count = dwarf_read_uleb128(p, &length);
787 p += count;
788
789 UNWINDER_BUG_ON((unsigned char *)p > end);
790
791 cie->initial_instructions = p + length;
792 cie->augmentation++;
793 }
794
795 while (*cie->augmentation) {
796
797
798
799
800 if (*cie->augmentation == 'L') {
801 p++;
802 cie->augmentation++;
803 } else if (*cie->augmentation == 'R') {
804
805
806
807
808
809 cie->encoding = *(char *)p++;
810 cie->augmentation++;
811 } else if (*cie->augmentation == 'P') {
812
813
814
815
816
817 UNWINDER_BUG();
818 } else if (*cie->augmentation == 'S') {
819 UNWINDER_BUG();
820 } else {
821
822
823
824
825 p = cie->initial_instructions;
826 UNWINDER_BUG_ON(!p);
827 break;
828 }
829 }
830
831 cie->initial_instructions = p;
832 cie->instructions_end = end;
833
834
835 spin_lock_irqsave(&dwarf_cie_lock, flags);
836
837 while (*rb_node) {
838 struct dwarf_cie *cie_tmp;
839
840 cie_tmp = rb_entry(*rb_node, struct dwarf_cie, node);
841
842 parent = *rb_node;
843
844 if (cie->cie_pointer < cie_tmp->cie_pointer)
845 rb_node = &parent->rb_left;
846 else if (cie->cie_pointer >= cie_tmp->cie_pointer)
847 rb_node = &parent->rb_right;
848 else
849 WARN_ON(1);
850 }
851
852 rb_link_node(&cie->node, parent, rb_node);
853 rb_insert_color(&cie->node, &cie_root);
854
855 #ifdef CONFIG_MODULES
856 if (mod != NULL)
857 list_add_tail(&cie->link, &mod->arch.cie_list);
858 #endif
859
860 spin_unlock_irqrestore(&dwarf_cie_lock, flags);
861
862 return 0;
863 }
864
865 static int dwarf_parse_fde(void *entry, u32 entry_type,
866 void *start, unsigned long len,
867 unsigned char *end, struct module *mod)
868 {
869 struct rb_node **rb_node = &fde_root.rb_node;
870 struct rb_node *parent = *rb_node;
871 struct dwarf_fde *fde;
872 struct dwarf_cie *cie;
873 unsigned long flags;
874 int count;
875 void *p = start;
876
877 fde = kzalloc(sizeof(*fde), GFP_KERNEL);
878 if (!fde)
879 return -ENOMEM;
880
881 fde->length = len;
882
883
884
885
886
887 fde->cie_pointer = (unsigned long)(p - entry_type - 4);
888
889 cie = dwarf_lookup_cie(fde->cie_pointer);
890 fde->cie = cie;
891
892 if (cie->encoding)
893 count = dwarf_read_encoded_value(p, &fde->initial_location,
894 cie->encoding);
895 else
896 count = dwarf_read_addr(p, &fde->initial_location);
897
898 p += count;
899
900 if (cie->encoding)
901 count = dwarf_read_encoded_value(p, &fde->address_range,
902 cie->encoding & 0x0f);
903 else
904 count = dwarf_read_addr(p, &fde->address_range);
905
906 p += count;
907
908 if (fde->cie->flags & DWARF_CIE_Z_AUGMENTATION) {
909 unsigned int length;
910 count = dwarf_read_uleb128(p, &length);
911 p += count + length;
912 }
913
914
915 fde->instructions = p;
916 fde->end = end;
917
918
919 spin_lock_irqsave(&dwarf_fde_lock, flags);
920
921 while (*rb_node) {
922 struct dwarf_fde *fde_tmp;
923 unsigned long tmp_start, tmp_end;
924 unsigned long start, end;
925
926 fde_tmp = rb_entry(*rb_node, struct dwarf_fde, node);
927
928 start = fde->initial_location;
929 end = fde->initial_location + fde->address_range;
930
931 tmp_start = fde_tmp->initial_location;
932 tmp_end = fde_tmp->initial_location + fde_tmp->address_range;
933
934 parent = *rb_node;
935
936 if (start < tmp_start)
937 rb_node = &parent->rb_left;
938 else if (start >= tmp_end)
939 rb_node = &parent->rb_right;
940 else
941 WARN_ON(1);
942 }
943
944 rb_link_node(&fde->node, parent, rb_node);
945 rb_insert_color(&fde->node, &fde_root);
946
947 #ifdef CONFIG_MODULES
948 if (mod != NULL)
949 list_add_tail(&fde->link, &mod->arch.fde_list);
950 #endif
951
952 spin_unlock_irqrestore(&dwarf_fde_lock, flags);
953
954 return 0;
955 }
956
957 static void dwarf_unwinder_dump(struct task_struct *task,
958 struct pt_regs *regs,
959 unsigned long *sp,
960 const struct stacktrace_ops *ops,
961 void *data)
962 {
963 struct dwarf_frame *frame, *_frame;
964 unsigned long return_addr;
965
966 _frame = NULL;
967 return_addr = 0;
968
969 while (1) {
970 frame = dwarf_unwind_stack(return_addr, _frame);
971
972 if (_frame)
973 dwarf_free_frame(_frame);
974
975 _frame = frame;
976
977 if (!frame || !frame->return_addr)
978 break;
979
980 return_addr = frame->return_addr;
981 ops->address(data, return_addr, 1);
982 }
983
984 if (frame)
985 dwarf_free_frame(frame);
986 }
987
988 static struct unwinder dwarf_unwinder = {
989 .name = "dwarf-unwinder",
990 .dump = dwarf_unwinder_dump,
991 .rating = 150,
992 };
993
994 static void __init dwarf_unwinder_cleanup(void)
995 {
996 struct dwarf_fde *fde, *next_fde;
997 struct dwarf_cie *cie, *next_cie;
998
999
1000
1001
1002
1003
1004 rbtree_postorder_for_each_entry_safe(fde, next_fde, &fde_root, node)
1005 kfree(fde);
1006
1007 rbtree_postorder_for_each_entry_safe(cie, next_cie, &cie_root, node)
1008 kfree(cie);
1009
1010 mempool_destroy(dwarf_reg_pool);
1011 mempool_destroy(dwarf_frame_pool);
1012 kmem_cache_destroy(dwarf_reg_cachep);
1013 kmem_cache_destroy(dwarf_frame_cachep);
1014 }
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024 static int dwarf_parse_section(char *eh_frame_start, char *eh_frame_end,
1025 struct module *mod)
1026 {
1027 u32 entry_type;
1028 void *p, *entry;
1029 int count, err = 0;
1030 unsigned long len = 0;
1031 unsigned int c_entries, f_entries;
1032 unsigned char *end;
1033
1034 c_entries = 0;
1035 f_entries = 0;
1036 entry = eh_frame_start;
1037
1038 while ((char *)entry < eh_frame_end) {
1039 p = entry;
1040
1041 count = dwarf_entry_len(p, &len);
1042 if (count == 0) {
1043
1044
1045
1046
1047
1048
1049
1050 err = -EINVAL;
1051 goto out;
1052 } else
1053 p += count;
1054
1055
1056 end = p + len;
1057
1058 entry_type = get_unaligned((u32 *)p);
1059 p += 4;
1060
1061 if (entry_type == DW_EH_FRAME_CIE) {
1062 err = dwarf_parse_cie(entry, p, len, end, mod);
1063 if (err < 0)
1064 goto out;
1065 else
1066 c_entries++;
1067 } else {
1068 err = dwarf_parse_fde(entry, entry_type, p, len,
1069 end, mod);
1070 if (err < 0)
1071 goto out;
1072 else
1073 f_entries++;
1074 }
1075
1076 entry = (char *)entry + len + 4;
1077 }
1078
1079 printk(KERN_INFO "DWARF unwinder initialised: read %u CIEs, %u FDEs\n",
1080 c_entries, f_entries);
1081
1082 return 0;
1083
1084 out:
1085 return err;
1086 }
1087
1088 #ifdef CONFIG_MODULES
1089 int module_dwarf_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
1090 struct module *me)
1091 {
1092 unsigned int i, err;
1093 unsigned long start, end;
1094 char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
1095
1096 start = end = 0;
1097
1098 for (i = 1; i < hdr->e_shnum; i++) {
1099
1100 if ((sechdrs[i].sh_flags & SHF_ALLOC)
1101 && !strcmp(secstrings+sechdrs[i].sh_name, ".eh_frame")) {
1102 start = sechdrs[i].sh_addr;
1103 end = start + sechdrs[i].sh_size;
1104 break;
1105 }
1106 }
1107
1108
1109 if (i != hdr->e_shnum) {
1110 INIT_LIST_HEAD(&me->arch.cie_list);
1111 INIT_LIST_HEAD(&me->arch.fde_list);
1112 err = dwarf_parse_section((char *)start, (char *)end, me);
1113 if (err) {
1114 printk(KERN_WARNING "%s: failed to parse DWARF info\n",
1115 me->name);
1116 return err;
1117 }
1118 }
1119
1120 return 0;
1121 }
1122
1123
1124
1125
1126
1127
1128
1129
1130 void module_dwarf_cleanup(struct module *mod)
1131 {
1132 struct dwarf_fde *fde, *ftmp;
1133 struct dwarf_cie *cie, *ctmp;
1134 unsigned long flags;
1135
1136 spin_lock_irqsave(&dwarf_cie_lock, flags);
1137
1138 list_for_each_entry_safe(cie, ctmp, &mod->arch.cie_list, link) {
1139 list_del(&cie->link);
1140 rb_erase(&cie->node, &cie_root);
1141 kfree(cie);
1142 }
1143
1144 spin_unlock_irqrestore(&dwarf_cie_lock, flags);
1145
1146 spin_lock_irqsave(&dwarf_fde_lock, flags);
1147
1148 list_for_each_entry_safe(fde, ftmp, &mod->arch.fde_list, link) {
1149 list_del(&fde->link);
1150 rb_erase(&fde->node, &fde_root);
1151 kfree(fde);
1152 }
1153
1154 spin_unlock_irqrestore(&dwarf_fde_lock, flags);
1155 }
1156 #endif
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167 static int __init dwarf_unwinder_init(void)
1168 {
1169 int err = -ENOMEM;
1170
1171 dwarf_frame_cachep = kmem_cache_create("dwarf_frames",
1172 sizeof(struct dwarf_frame), 0,
1173 SLAB_PANIC | SLAB_HWCACHE_ALIGN, NULL);
1174
1175 dwarf_reg_cachep = kmem_cache_create("dwarf_regs",
1176 sizeof(struct dwarf_reg), 0,
1177 SLAB_PANIC | SLAB_HWCACHE_ALIGN, NULL);
1178
1179 dwarf_frame_pool = mempool_create_slab_pool(DWARF_FRAME_MIN_REQ,
1180 dwarf_frame_cachep);
1181 if (!dwarf_frame_pool)
1182 goto out;
1183
1184 dwarf_reg_pool = mempool_create_slab_pool(DWARF_REG_MIN_REQ,
1185 dwarf_reg_cachep);
1186 if (!dwarf_reg_pool)
1187 goto out;
1188
1189 err = dwarf_parse_section(__start_eh_frame, __stop_eh_frame, NULL);
1190 if (err)
1191 goto out;
1192
1193 err = unwinder_register(&dwarf_unwinder);
1194 if (err)
1195 goto out;
1196
1197 dwarf_unwinder_ready = 1;
1198
1199 return 0;
1200
1201 out:
1202 printk(KERN_ERR "Failed to initialise DWARF unwinder: %d\n", err);
1203 dwarf_unwinder_cleanup();
1204 return err;
1205 }
1206 early_initcall(dwarf_unwinder_init);