162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * Copyright (C) 2009 Matt Fleming <matt@console-pimps.org> 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci#ifndef __ASM_SH_DWARF_H 662306a36Sopenharmony_ci#define __ASM_SH_DWARF_H 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifdef CONFIG_DWARF_UNWINDER 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* 1162306a36Sopenharmony_ci * DWARF expression operations 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci#define DW_OP_addr 0x03 1462306a36Sopenharmony_ci#define DW_OP_deref 0x06 1562306a36Sopenharmony_ci#define DW_OP_const1u 0x08 1662306a36Sopenharmony_ci#define DW_OP_const1s 0x09 1762306a36Sopenharmony_ci#define DW_OP_const2u 0x0a 1862306a36Sopenharmony_ci#define DW_OP_const2s 0x0b 1962306a36Sopenharmony_ci#define DW_OP_const4u 0x0c 2062306a36Sopenharmony_ci#define DW_OP_const4s 0x0d 2162306a36Sopenharmony_ci#define DW_OP_const8u 0x0e 2262306a36Sopenharmony_ci#define DW_OP_const8s 0x0f 2362306a36Sopenharmony_ci#define DW_OP_constu 0x10 2462306a36Sopenharmony_ci#define DW_OP_consts 0x11 2562306a36Sopenharmony_ci#define DW_OP_dup 0x12 2662306a36Sopenharmony_ci#define DW_OP_drop 0x13 2762306a36Sopenharmony_ci#define DW_OP_over 0x14 2862306a36Sopenharmony_ci#define DW_OP_pick 0x15 2962306a36Sopenharmony_ci#define DW_OP_swap 0x16 3062306a36Sopenharmony_ci#define DW_OP_rot 0x17 3162306a36Sopenharmony_ci#define DW_OP_xderef 0x18 3262306a36Sopenharmony_ci#define DW_OP_abs 0x19 3362306a36Sopenharmony_ci#define DW_OP_and 0x1a 3462306a36Sopenharmony_ci#define DW_OP_div 0x1b 3562306a36Sopenharmony_ci#define DW_OP_minus 0x1c 3662306a36Sopenharmony_ci#define DW_OP_mod 0x1d 3762306a36Sopenharmony_ci#define DW_OP_mul 0x1e 3862306a36Sopenharmony_ci#define DW_OP_neg 0x1f 3962306a36Sopenharmony_ci#define DW_OP_not 0x20 4062306a36Sopenharmony_ci#define DW_OP_or 0x21 4162306a36Sopenharmony_ci#define DW_OP_plus 0x22 4262306a36Sopenharmony_ci#define DW_OP_plus_uconst 0x23 4362306a36Sopenharmony_ci#define DW_OP_shl 0x24 4462306a36Sopenharmony_ci#define DW_OP_shr 0x25 4562306a36Sopenharmony_ci#define DW_OP_shra 0x26 4662306a36Sopenharmony_ci#define DW_OP_xor 0x27 4762306a36Sopenharmony_ci#define DW_OP_skip 0x2f 4862306a36Sopenharmony_ci#define DW_OP_bra 0x28 4962306a36Sopenharmony_ci#define DW_OP_eq 0x29 5062306a36Sopenharmony_ci#define DW_OP_ge 0x2a 5162306a36Sopenharmony_ci#define DW_OP_gt 0x2b 5262306a36Sopenharmony_ci#define DW_OP_le 0x2c 5362306a36Sopenharmony_ci#define DW_OP_lt 0x2d 5462306a36Sopenharmony_ci#define DW_OP_ne 0x2e 5562306a36Sopenharmony_ci#define DW_OP_lit0 0x30 5662306a36Sopenharmony_ci#define DW_OP_lit1 0x31 5762306a36Sopenharmony_ci#define DW_OP_lit2 0x32 5862306a36Sopenharmony_ci#define DW_OP_lit3 0x33 5962306a36Sopenharmony_ci#define DW_OP_lit4 0x34 6062306a36Sopenharmony_ci#define DW_OP_lit5 0x35 6162306a36Sopenharmony_ci#define DW_OP_lit6 0x36 6262306a36Sopenharmony_ci#define DW_OP_lit7 0x37 6362306a36Sopenharmony_ci#define DW_OP_lit8 0x38 6462306a36Sopenharmony_ci#define DW_OP_lit9 0x39 6562306a36Sopenharmony_ci#define DW_OP_lit10 0x3a 6662306a36Sopenharmony_ci#define DW_OP_lit11 0x3b 6762306a36Sopenharmony_ci#define DW_OP_lit12 0x3c 6862306a36Sopenharmony_ci#define DW_OP_lit13 0x3d 6962306a36Sopenharmony_ci#define DW_OP_lit14 0x3e 7062306a36Sopenharmony_ci#define DW_OP_lit15 0x3f 7162306a36Sopenharmony_ci#define DW_OP_lit16 0x40 7262306a36Sopenharmony_ci#define DW_OP_lit17 0x41 7362306a36Sopenharmony_ci#define DW_OP_lit18 0x42 7462306a36Sopenharmony_ci#define DW_OP_lit19 0x43 7562306a36Sopenharmony_ci#define DW_OP_lit20 0x44 7662306a36Sopenharmony_ci#define DW_OP_lit21 0x45 7762306a36Sopenharmony_ci#define DW_OP_lit22 0x46 7862306a36Sopenharmony_ci#define DW_OP_lit23 0x47 7962306a36Sopenharmony_ci#define DW_OP_lit24 0x48 8062306a36Sopenharmony_ci#define DW_OP_lit25 0x49 8162306a36Sopenharmony_ci#define DW_OP_lit26 0x4a 8262306a36Sopenharmony_ci#define DW_OP_lit27 0x4b 8362306a36Sopenharmony_ci#define DW_OP_lit28 0x4c 8462306a36Sopenharmony_ci#define DW_OP_lit29 0x4d 8562306a36Sopenharmony_ci#define DW_OP_lit30 0x4e 8662306a36Sopenharmony_ci#define DW_OP_lit31 0x4f 8762306a36Sopenharmony_ci#define DW_OP_reg0 0x50 8862306a36Sopenharmony_ci#define DW_OP_reg1 0x51 8962306a36Sopenharmony_ci#define DW_OP_reg2 0x52 9062306a36Sopenharmony_ci#define DW_OP_reg3 0x53 9162306a36Sopenharmony_ci#define DW_OP_reg4 0x54 9262306a36Sopenharmony_ci#define DW_OP_reg5 0x55 9362306a36Sopenharmony_ci#define DW_OP_reg6 0x56 9462306a36Sopenharmony_ci#define DW_OP_reg7 0x57 9562306a36Sopenharmony_ci#define DW_OP_reg8 0x58 9662306a36Sopenharmony_ci#define DW_OP_reg9 0x59 9762306a36Sopenharmony_ci#define DW_OP_reg10 0x5a 9862306a36Sopenharmony_ci#define DW_OP_reg11 0x5b 9962306a36Sopenharmony_ci#define DW_OP_reg12 0x5c 10062306a36Sopenharmony_ci#define DW_OP_reg13 0x5d 10162306a36Sopenharmony_ci#define DW_OP_reg14 0x5e 10262306a36Sopenharmony_ci#define DW_OP_reg15 0x5f 10362306a36Sopenharmony_ci#define DW_OP_reg16 0x60 10462306a36Sopenharmony_ci#define DW_OP_reg17 0x61 10562306a36Sopenharmony_ci#define DW_OP_reg18 0x62 10662306a36Sopenharmony_ci#define DW_OP_reg19 0x63 10762306a36Sopenharmony_ci#define DW_OP_reg20 0x64 10862306a36Sopenharmony_ci#define DW_OP_reg21 0x65 10962306a36Sopenharmony_ci#define DW_OP_reg22 0x66 11062306a36Sopenharmony_ci#define DW_OP_reg23 0x67 11162306a36Sopenharmony_ci#define DW_OP_reg24 0x68 11262306a36Sopenharmony_ci#define DW_OP_reg25 0x69 11362306a36Sopenharmony_ci#define DW_OP_reg26 0x6a 11462306a36Sopenharmony_ci#define DW_OP_reg27 0x6b 11562306a36Sopenharmony_ci#define DW_OP_reg28 0x6c 11662306a36Sopenharmony_ci#define DW_OP_reg29 0x6d 11762306a36Sopenharmony_ci#define DW_OP_reg30 0x6e 11862306a36Sopenharmony_ci#define DW_OP_reg31 0x6f 11962306a36Sopenharmony_ci#define DW_OP_breg0 0x70 12062306a36Sopenharmony_ci#define DW_OP_breg1 0x71 12162306a36Sopenharmony_ci#define DW_OP_breg2 0x72 12262306a36Sopenharmony_ci#define DW_OP_breg3 0x73 12362306a36Sopenharmony_ci#define DW_OP_breg4 0x74 12462306a36Sopenharmony_ci#define DW_OP_breg5 0x75 12562306a36Sopenharmony_ci#define DW_OP_breg6 0x76 12662306a36Sopenharmony_ci#define DW_OP_breg7 0x77 12762306a36Sopenharmony_ci#define DW_OP_breg8 0x78 12862306a36Sopenharmony_ci#define DW_OP_breg9 0x79 12962306a36Sopenharmony_ci#define DW_OP_breg10 0x7a 13062306a36Sopenharmony_ci#define DW_OP_breg11 0x7b 13162306a36Sopenharmony_ci#define DW_OP_breg12 0x7c 13262306a36Sopenharmony_ci#define DW_OP_breg13 0x7d 13362306a36Sopenharmony_ci#define DW_OP_breg14 0x7e 13462306a36Sopenharmony_ci#define DW_OP_breg15 0x7f 13562306a36Sopenharmony_ci#define DW_OP_breg16 0x80 13662306a36Sopenharmony_ci#define DW_OP_breg17 0x81 13762306a36Sopenharmony_ci#define DW_OP_breg18 0x82 13862306a36Sopenharmony_ci#define DW_OP_breg19 0x83 13962306a36Sopenharmony_ci#define DW_OP_breg20 0x84 14062306a36Sopenharmony_ci#define DW_OP_breg21 0x85 14162306a36Sopenharmony_ci#define DW_OP_breg22 0x86 14262306a36Sopenharmony_ci#define DW_OP_breg23 0x87 14362306a36Sopenharmony_ci#define DW_OP_breg24 0x88 14462306a36Sopenharmony_ci#define DW_OP_breg25 0x89 14562306a36Sopenharmony_ci#define DW_OP_breg26 0x8a 14662306a36Sopenharmony_ci#define DW_OP_breg27 0x8b 14762306a36Sopenharmony_ci#define DW_OP_breg28 0x8c 14862306a36Sopenharmony_ci#define DW_OP_breg29 0x8d 14962306a36Sopenharmony_ci#define DW_OP_breg30 0x8e 15062306a36Sopenharmony_ci#define DW_OP_breg31 0x8f 15162306a36Sopenharmony_ci#define DW_OP_regx 0x90 15262306a36Sopenharmony_ci#define DW_OP_fbreg 0x91 15362306a36Sopenharmony_ci#define DW_OP_bregx 0x92 15462306a36Sopenharmony_ci#define DW_OP_piece 0x93 15562306a36Sopenharmony_ci#define DW_OP_deref_size 0x94 15662306a36Sopenharmony_ci#define DW_OP_xderef_size 0x95 15762306a36Sopenharmony_ci#define DW_OP_nop 0x96 15862306a36Sopenharmony_ci#define DW_OP_push_object_address 0x97 15962306a36Sopenharmony_ci#define DW_OP_call2 0x98 16062306a36Sopenharmony_ci#define DW_OP_call4 0x99 16162306a36Sopenharmony_ci#define DW_OP_call_ref 0x9a 16262306a36Sopenharmony_ci#define DW_OP_form_tls_address 0x9b 16362306a36Sopenharmony_ci#define DW_OP_call_frame_cfa 0x9c 16462306a36Sopenharmony_ci#define DW_OP_bit_piece 0x9d 16562306a36Sopenharmony_ci#define DW_OP_lo_user 0xe0 16662306a36Sopenharmony_ci#define DW_OP_hi_user 0xff 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci/* 16962306a36Sopenharmony_ci * Addresses used in FDE entries in the .eh_frame section may be encoded 17062306a36Sopenharmony_ci * using one of the following encodings. 17162306a36Sopenharmony_ci */ 17262306a36Sopenharmony_ci#define DW_EH_PE_absptr 0x00 17362306a36Sopenharmony_ci#define DW_EH_PE_omit 0xff 17462306a36Sopenharmony_ci#define DW_EH_PE_uleb128 0x01 17562306a36Sopenharmony_ci#define DW_EH_PE_udata2 0x02 17662306a36Sopenharmony_ci#define DW_EH_PE_udata4 0x03 17762306a36Sopenharmony_ci#define DW_EH_PE_udata8 0x04 17862306a36Sopenharmony_ci#define DW_EH_PE_sleb128 0x09 17962306a36Sopenharmony_ci#define DW_EH_PE_sdata2 0x0a 18062306a36Sopenharmony_ci#define DW_EH_PE_sdata4 0x0b 18162306a36Sopenharmony_ci#define DW_EH_PE_sdata8 0x0c 18262306a36Sopenharmony_ci#define DW_EH_PE_signed 0x09 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci#define DW_EH_PE_pcrel 0x10 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci/* 18762306a36Sopenharmony_ci * The architecture-specific register number that contains the return 18862306a36Sopenharmony_ci * address in the .debug_frame table. 18962306a36Sopenharmony_ci */ 19062306a36Sopenharmony_ci#define DWARF_ARCH_RA_REG 17 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci#include <linux/compiler.h> 19562306a36Sopenharmony_ci#include <linux/bug.h> 19662306a36Sopenharmony_ci#include <linux/list.h> 19762306a36Sopenharmony_ci#include <linux/module.h> 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci/* 20062306a36Sopenharmony_ci * Read either the frame pointer (r14) or the stack pointer (r15). 20162306a36Sopenharmony_ci * NOTE: this MUST be inlined. 20262306a36Sopenharmony_ci */ 20362306a36Sopenharmony_cistatic __always_inline unsigned long dwarf_read_arch_reg(unsigned int reg) 20462306a36Sopenharmony_ci{ 20562306a36Sopenharmony_ci unsigned long value = 0; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci switch (reg) { 20862306a36Sopenharmony_ci case 14: 20962306a36Sopenharmony_ci __asm__ __volatile__("mov r14, %0\n" : "=r" (value)); 21062306a36Sopenharmony_ci break; 21162306a36Sopenharmony_ci case 15: 21262306a36Sopenharmony_ci __asm__ __volatile__("mov r15, %0\n" : "=r" (value)); 21362306a36Sopenharmony_ci break; 21462306a36Sopenharmony_ci default: 21562306a36Sopenharmony_ci BUG(); 21662306a36Sopenharmony_ci } 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci return value; 21962306a36Sopenharmony_ci} 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci/** 22262306a36Sopenharmony_ci * dwarf_cie - Common Information Entry 22362306a36Sopenharmony_ci */ 22462306a36Sopenharmony_cistruct dwarf_cie { 22562306a36Sopenharmony_ci unsigned long length; 22662306a36Sopenharmony_ci unsigned long cie_id; 22762306a36Sopenharmony_ci unsigned char version; 22862306a36Sopenharmony_ci const char *augmentation; 22962306a36Sopenharmony_ci unsigned int code_alignment_factor; 23062306a36Sopenharmony_ci int data_alignment_factor; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci /* Which column in the rule table represents return addr of func. */ 23362306a36Sopenharmony_ci unsigned int return_address_reg; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci unsigned char *initial_instructions; 23662306a36Sopenharmony_ci unsigned char *instructions_end; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci unsigned char encoding; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci unsigned long cie_pointer; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci unsigned long flags; 24362306a36Sopenharmony_ci#define DWARF_CIE_Z_AUGMENTATION (1 << 0) 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci /* linked-list entry if this CIE is from a module */ 24662306a36Sopenharmony_ci struct list_head link; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci struct rb_node node; 24962306a36Sopenharmony_ci}; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci/** 25262306a36Sopenharmony_ci * dwarf_fde - Frame Description Entry 25362306a36Sopenharmony_ci */ 25462306a36Sopenharmony_cistruct dwarf_fde { 25562306a36Sopenharmony_ci unsigned long length; 25662306a36Sopenharmony_ci unsigned long cie_pointer; 25762306a36Sopenharmony_ci struct dwarf_cie *cie; 25862306a36Sopenharmony_ci unsigned long initial_location; 25962306a36Sopenharmony_ci unsigned long address_range; 26062306a36Sopenharmony_ci unsigned char *instructions; 26162306a36Sopenharmony_ci unsigned char *end; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci /* linked-list entry if this FDE is from a module */ 26462306a36Sopenharmony_ci struct list_head link; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci struct rb_node node; 26762306a36Sopenharmony_ci}; 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci/** 27062306a36Sopenharmony_ci * dwarf_frame - DWARF information for a frame in the call stack 27162306a36Sopenharmony_ci */ 27262306a36Sopenharmony_cistruct dwarf_frame { 27362306a36Sopenharmony_ci struct dwarf_frame *prev, *next; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci unsigned long pc; 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci struct list_head reg_list; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci unsigned long cfa; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci /* Valid when DW_FRAME_CFA_REG_OFFSET is set in flags */ 28262306a36Sopenharmony_ci unsigned int cfa_register; 28362306a36Sopenharmony_ci unsigned int cfa_offset; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci /* Valid when DW_FRAME_CFA_REG_EXP is set in flags */ 28662306a36Sopenharmony_ci unsigned char *cfa_expr; 28762306a36Sopenharmony_ci unsigned int cfa_expr_len; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci unsigned long flags; 29062306a36Sopenharmony_ci#define DWARF_FRAME_CFA_REG_OFFSET (1 << 0) 29162306a36Sopenharmony_ci#define DWARF_FRAME_CFA_REG_EXP (1 << 1) 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci unsigned long return_addr; 29462306a36Sopenharmony_ci}; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci/** 29762306a36Sopenharmony_ci * dwarf_reg - DWARF register 29862306a36Sopenharmony_ci * @flags: Describes how to calculate the value of this register 29962306a36Sopenharmony_ci */ 30062306a36Sopenharmony_cistruct dwarf_reg { 30162306a36Sopenharmony_ci struct list_head link; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci unsigned int number; 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci unsigned long addr; 30662306a36Sopenharmony_ci unsigned long flags; 30762306a36Sopenharmony_ci#define DWARF_REG_OFFSET (1 << 0) 30862306a36Sopenharmony_ci#define DWARF_VAL_OFFSET (1 << 1) 30962306a36Sopenharmony_ci#define DWARF_UNDEFINED (1 << 2) 31062306a36Sopenharmony_ci}; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci/* 31362306a36Sopenharmony_ci * Call Frame instruction opcodes. 31462306a36Sopenharmony_ci */ 31562306a36Sopenharmony_ci#define DW_CFA_advance_loc 0x40 31662306a36Sopenharmony_ci#define DW_CFA_offset 0x80 31762306a36Sopenharmony_ci#define DW_CFA_restore 0xc0 31862306a36Sopenharmony_ci#define DW_CFA_nop 0x00 31962306a36Sopenharmony_ci#define DW_CFA_set_loc 0x01 32062306a36Sopenharmony_ci#define DW_CFA_advance_loc1 0x02 32162306a36Sopenharmony_ci#define DW_CFA_advance_loc2 0x03 32262306a36Sopenharmony_ci#define DW_CFA_advance_loc4 0x04 32362306a36Sopenharmony_ci#define DW_CFA_offset_extended 0x05 32462306a36Sopenharmony_ci#define DW_CFA_restore_extended 0x06 32562306a36Sopenharmony_ci#define DW_CFA_undefined 0x07 32662306a36Sopenharmony_ci#define DW_CFA_same_value 0x08 32762306a36Sopenharmony_ci#define DW_CFA_register 0x09 32862306a36Sopenharmony_ci#define DW_CFA_remember_state 0x0a 32962306a36Sopenharmony_ci#define DW_CFA_restore_state 0x0b 33062306a36Sopenharmony_ci#define DW_CFA_def_cfa 0x0c 33162306a36Sopenharmony_ci#define DW_CFA_def_cfa_register 0x0d 33262306a36Sopenharmony_ci#define DW_CFA_def_cfa_offset 0x0e 33362306a36Sopenharmony_ci#define DW_CFA_def_cfa_expression 0x0f 33462306a36Sopenharmony_ci#define DW_CFA_expression 0x10 33562306a36Sopenharmony_ci#define DW_CFA_offset_extended_sf 0x11 33662306a36Sopenharmony_ci#define DW_CFA_def_cfa_sf 0x12 33762306a36Sopenharmony_ci#define DW_CFA_def_cfa_offset_sf 0x13 33862306a36Sopenharmony_ci#define DW_CFA_val_offset 0x14 33962306a36Sopenharmony_ci#define DW_CFA_val_offset_sf 0x15 34062306a36Sopenharmony_ci#define DW_CFA_val_expression 0x16 34162306a36Sopenharmony_ci#define DW_CFA_lo_user 0x1c 34262306a36Sopenharmony_ci#define DW_CFA_hi_user 0x3f 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci/* GNU extension opcodes */ 34562306a36Sopenharmony_ci#define DW_CFA_GNU_args_size 0x2e 34662306a36Sopenharmony_ci#define DW_CFA_GNU_negative_offset_extended 0x2f 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci/* 34962306a36Sopenharmony_ci * Some call frame instructions encode their operands in the opcode. We 35062306a36Sopenharmony_ci * need some helper functions to extract both the opcode and operands 35162306a36Sopenharmony_ci * from an instruction. 35262306a36Sopenharmony_ci */ 35362306a36Sopenharmony_cistatic inline unsigned int DW_CFA_opcode(unsigned long insn) 35462306a36Sopenharmony_ci{ 35562306a36Sopenharmony_ci return (insn & 0xc0); 35662306a36Sopenharmony_ci} 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_cistatic inline unsigned int DW_CFA_operand(unsigned long insn) 35962306a36Sopenharmony_ci{ 36062306a36Sopenharmony_ci return (insn & 0x3f); 36162306a36Sopenharmony_ci} 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci#define DW_EH_FRAME_CIE 0 /* .eh_frame CIE IDs are 0 */ 36462306a36Sopenharmony_ci#define DW_CIE_ID 0xffffffff 36562306a36Sopenharmony_ci#define DW64_CIE_ID 0xffffffffffffffffULL 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci/* 36862306a36Sopenharmony_ci * DWARF FDE/CIE length field values. 36962306a36Sopenharmony_ci */ 37062306a36Sopenharmony_ci#define DW_EXT_LO 0xfffffff0 37162306a36Sopenharmony_ci#define DW_EXT_HI 0xffffffff 37262306a36Sopenharmony_ci#define DW_EXT_DWARF64 DW_EXT_HI 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ciextern struct dwarf_frame *dwarf_unwind_stack(unsigned long, 37562306a36Sopenharmony_ci struct dwarf_frame *); 37662306a36Sopenharmony_ciextern void dwarf_free_frame(struct dwarf_frame *); 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ciextern int module_dwarf_finalize(const Elf_Ehdr *, const Elf_Shdr *, 37962306a36Sopenharmony_ci struct module *); 38062306a36Sopenharmony_ciextern void module_dwarf_cleanup(struct module *); 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */ 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci#define CFI_STARTPROC .cfi_startproc 38562306a36Sopenharmony_ci#define CFI_ENDPROC .cfi_endproc 38662306a36Sopenharmony_ci#define CFI_DEF_CFA .cfi_def_cfa 38762306a36Sopenharmony_ci#define CFI_REGISTER .cfi_register 38862306a36Sopenharmony_ci#define CFI_REL_OFFSET .cfi_rel_offset 38962306a36Sopenharmony_ci#define CFI_UNDEFINED .cfi_undefined 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci#else 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci/* 39462306a36Sopenharmony_ci * Use the asm comment character to ignore the rest of the line. 39562306a36Sopenharmony_ci */ 39662306a36Sopenharmony_ci#define CFI_IGNORE ! 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci#define CFI_STARTPROC CFI_IGNORE 39962306a36Sopenharmony_ci#define CFI_ENDPROC CFI_IGNORE 40062306a36Sopenharmony_ci#define CFI_DEF_CFA CFI_IGNORE 40162306a36Sopenharmony_ci#define CFI_REGISTER CFI_IGNORE 40262306a36Sopenharmony_ci#define CFI_REL_OFFSET CFI_IGNORE 40362306a36Sopenharmony_ci#define CFI_UNDEFINED CFI_IGNORE 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 40662306a36Sopenharmony_cistatic inline void dwarf_unwinder_init(void) 40762306a36Sopenharmony_ci{ 40862306a36Sopenharmony_ci} 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci#define module_dwarf_finalize(hdr, sechdrs, me) (0) 41162306a36Sopenharmony_ci#define module_dwarf_cleanup(mod) do { } while (0) 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci#endif 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci#endif /* CONFIG_DWARF_UNWINDER */ 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci#endif /* __ASM_SH_DWARF_H */ 418