Home | History | Annotate | Download | only in libdw
      1 /* CFI program execution.
      2    Copyright (C) 2009-2010, 2014 Red Hat, Inc.
      3    This file is part of elfutils.
      4 
      5    This file is free software; you can redistribute it and/or modify
      6    it under the terms of either
      7 
      8      * the GNU Lesser General Public License as published by the Free
      9        Software Foundation; either version 3 of the License, or (at
     10        your option) any later version
     11 
     12    or
     13 
     14      * the GNU General Public License as published by the Free
     15        Software Foundation; either version 2 of the License, or (at
     16        your option) any later version
     17 
     18    or both in parallel, as here.
     19 
     20    elfutils is distributed in the hope that it will be useful, but
     21    WITHOUT ANY WARRANTY; without even the implied warranty of
     22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     23    General Public License for more details.
     24 
     25    You should have received copies of the GNU General Public License and
     26    the GNU Lesser General Public License along with this program.  If
     27    not, see <http://www.gnu.org/licenses/>.  */
     28 
     29 #ifdef HAVE_CONFIG_H
     30 # include <config.h>
     31 #endif
     32 
     33 #include <dwarf.h>
     34 #include "../libebl/libebl.h"
     35 #include "cfi.h"
     36 #include "memory-access.h"
     37 #include "encoded-value.h"
     38 #include "system.h"
     39 #include <assert.h>
     40 #include <stdlib.h>
     41 #include <string.h>
     42 
     43 #define CFI_PRIMARY_MAX	0x3f
     44 
     45 static Dwarf_Frame *
     46 duplicate_frame_state (const Dwarf_Frame *original,
     47 		       Dwarf_Frame *prev)
     48 {
     49   size_t size = offsetof (Dwarf_Frame, regs[original->nregs]);
     50   Dwarf_Frame *copy = malloc (size);
     51   if (likely (copy != NULL))
     52     {
     53       memcpy (copy, original, size);
     54       copy->prev = prev;
     55     }
     56   return copy;
     57 }
     58 
     59 /* Returns a DWARF_E_* error code, usually NOERROR or INVALID_CFI.
     60    Frees *STATE on failure.  */
     61 static int
     62 execute_cfi (Dwarf_CFI *cache,
     63 	     const struct dwarf_cie *cie,
     64 	     Dwarf_Frame **state,
     65 	     const uint8_t *program, const uint8_t *const end, bool abi_cfi,
     66 	     Dwarf_Addr loc, Dwarf_Addr find_pc)
     67 {
     68   /* The caller should not give us anything out of range.  */
     69   assert (loc <= find_pc);
     70 
     71   int result = DWARF_E_NOERROR;
     72 
     73 #define cfi_assert(ok) do {						      \
     74     if (likely (ok)) break;						      \
     75     result = DWARF_E_INVALID_CFI;					      \
     76     goto out;								      \
     77   } while (0)
     78 
     79   Dwarf_Frame *fs = *state;
     80   inline bool enough_registers (Dwarf_Word reg)
     81     {
     82       if (fs->nregs <= reg)
     83 	{
     84 	  size_t size = offsetof (Dwarf_Frame, regs[reg + 1]);
     85 	  Dwarf_Frame *bigger = realloc (fs, size);
     86 	  if (unlikely (bigger == NULL))
     87 	    {
     88 	      result = DWARF_E_NOMEM;
     89 	      return false;
     90 	    }
     91 	  else
     92 	    {
     93 	      eu_static_assert (reg_unspecified == 0);
     94 	      memset (bigger->regs + bigger->nregs, 0,
     95 		      (reg + 1 - bigger->nregs) * sizeof bigger->regs[0]);
     96 	      bigger->nregs = reg + 1;
     97 	      fs = bigger;
     98 	    }
     99 	}
    100       return true;
    101     }
    102 
    103   inline void require_cfa_offset (void)
    104   {
    105     if (unlikely (fs->cfa_rule != cfa_offset))
    106       fs->cfa_rule = cfa_invalid;
    107   }
    108 
    109 #define register_rule(regno, r_rule, r_value) do {	\
    110     if (unlikely (! enough_registers (regno)))		\
    111       goto out;						\
    112     fs->regs[regno].rule = reg_##r_rule;		\
    113     fs->regs[regno].value = (r_value);			\
    114   } while (0)
    115 
    116   while (program < end)
    117     {
    118       uint8_t opcode = *program++;
    119       Dwarf_Word regno;
    120       Dwarf_Word offset;
    121       Dwarf_Word sf_offset;
    122       Dwarf_Word operand = opcode & CFI_PRIMARY_MAX;
    123       switch (opcode)
    124 	{
    125 	  /* These cases move LOC, i.e. "create a new table row".  */
    126 
    127 	case DW_CFA_advance_loc1:
    128 	  operand = *program++;
    129 	case DW_CFA_advance_loc + 0 ... DW_CFA_advance_loc + CFI_PRIMARY_MAX:
    130 	advance_loc:
    131 	  loc += operand * cie->code_alignment_factor;
    132 	  break;
    133 
    134 	case DW_CFA_advance_loc2:
    135 	  cfi_assert (program + 2 <= end);
    136 	  operand = read_2ubyte_unaligned_inc (cache, program);
    137 	  goto advance_loc;
    138 	case DW_CFA_advance_loc4:
    139 	  cfi_assert (program + 4 <= end);
    140 	  operand = read_4ubyte_unaligned_inc (cache, program);
    141 	  goto advance_loc;
    142 	case DW_CFA_MIPS_advance_loc8:
    143 	  cfi_assert (program + 8 <= end);
    144 	  operand = read_8ubyte_unaligned_inc (cache, program);
    145 	  goto advance_loc;
    146 
    147 	case DW_CFA_set_loc:
    148 	  if (likely (!read_encoded_value (cache, cie->fde_encoding,
    149 					   &program, &loc)))
    150 	    break;
    151 	  result = INTUSE(dwarf_errno) ();
    152 	  goto out;
    153 
    154 	  /* Now all following cases affect this row, but do not touch LOC.
    155 	     These cases end with 'continue'.  We only get out of the
    156 	     switch block for the row-copying (LOC-moving) cases above.  */
    157 
    158 	case DW_CFA_def_cfa:
    159 	  get_uleb128 (operand, program, end);
    160 	  cfi_assert (program < end);
    161 	  get_uleb128 (offset, program, end);
    162 	def_cfa:
    163 	  fs->cfa_rule = cfa_offset;
    164 	  fs->cfa_val_reg = operand;
    165 	  fs->cfa_val_offset = offset;
    166 	  /* Prime the rest of the Dwarf_Op so dwarf_frame_cfa can use it.  */
    167 	  fs->cfa_data.offset.atom = DW_OP_bregx;
    168 	  fs->cfa_data.offset.offset = 0;
    169 	  continue;
    170 
    171 	case DW_CFA_def_cfa_register:
    172 	  get_uleb128 (regno, program, end);
    173 	  require_cfa_offset ();
    174 	  fs->cfa_val_reg = regno;
    175 	  continue;
    176 
    177 	case DW_CFA_def_cfa_sf:
    178 	  get_uleb128 (operand, program, end);
    179 	  cfi_assert (program < end);
    180 	  get_sleb128 (sf_offset, program, end);
    181 	  offset = sf_offset * cie->data_alignment_factor;
    182 	  goto def_cfa;
    183 
    184 	case DW_CFA_def_cfa_offset:
    185 	  get_uleb128 (offset, program, end);
    186 	def_cfa_offset:
    187 	  require_cfa_offset ();
    188 	  fs->cfa_val_offset = offset;
    189 	  continue;
    190 
    191 	case DW_CFA_def_cfa_offset_sf:
    192 	  get_sleb128 (sf_offset, program, end);
    193 	  offset = sf_offset * cie->data_alignment_factor;
    194 	  goto def_cfa_offset;
    195 
    196 	case DW_CFA_def_cfa_expression:
    197 	  /* DW_FORM_block is a ULEB128 length followed by that many bytes.  */
    198 	  get_uleb128 (operand, program, end);
    199 	  cfi_assert (operand <= (Dwarf_Word) (end - program));
    200 	  fs->cfa_rule = cfa_expr;
    201 	  fs->cfa_data.expr.data = (unsigned char *) program;
    202 	  fs->cfa_data.expr.length = operand;
    203 	  program += operand;
    204 	  continue;
    205 
    206 	case DW_CFA_undefined:
    207 	  get_uleb128 (regno, program, end);
    208 	  register_rule (regno, undefined, 0);
    209 	  continue;
    210 
    211 	case DW_CFA_same_value:
    212 	  get_uleb128 (regno, program, end);
    213 	  register_rule (regno, same_value, 0);
    214 	  continue;
    215 
    216 	case DW_CFA_offset_extended:
    217 	  get_uleb128 (operand, program, end);
    218 	  cfi_assert (program < end);
    219 	case DW_CFA_offset + 0 ... DW_CFA_offset + CFI_PRIMARY_MAX:
    220 	  get_uleb128 (offset, program, end);
    221 	  offset *= cie->data_alignment_factor;
    222 	offset_extended:
    223 	  register_rule (operand, offset, offset);
    224 	  continue;
    225 
    226 	case DW_CFA_offset_extended_sf:
    227 	  get_uleb128 (operand, program, end);
    228 	  get_sleb128 (sf_offset, program, end);
    229 	offset_extended_sf:
    230 	  offset = sf_offset * cie->data_alignment_factor;
    231 	  goto offset_extended;
    232 
    233 	case DW_CFA_GNU_negative_offset_extended:
    234 	  /* GNU extension obsoleted by DW_CFA_offset_extended_sf.  */
    235 	  get_uleb128 (operand, program, end);
    236 	  cfi_assert (program < end);
    237 	  get_uleb128 (offset, program, end);
    238 	  sf_offset = -offset;
    239 	  goto offset_extended_sf;
    240 
    241 	case DW_CFA_val_offset:
    242 	  get_uleb128 (operand, program, end);
    243 	  cfi_assert (program < end);
    244 	  get_uleb128 (offset, program, end);
    245 	  offset *= cie->data_alignment_factor;
    246 	val_offset:
    247 	  register_rule (operand, val_offset, offset);
    248 	  continue;
    249 
    250 	case DW_CFA_val_offset_sf:
    251 	  get_uleb128 (operand, program, end);
    252 	  cfi_assert (program < end);
    253 	  get_sleb128 (sf_offset, program, end);
    254 	  offset = sf_offset * cie->data_alignment_factor;
    255 	  goto val_offset;
    256 
    257 	case DW_CFA_register:
    258 	  get_uleb128 (regno, program, end);
    259 	  cfi_assert (program < end);
    260 	  get_uleb128 (operand, program, end);
    261 	  register_rule (regno, register, operand);
    262 	  continue;
    263 
    264 	case DW_CFA_expression:
    265 	  /* Expression rule relies on section data, abi_cfi cannot use it.  */
    266 	  assert (! abi_cfi);
    267 	  get_uleb128 (regno, program, end);
    268 	  offset = program - (const uint8_t *) cache->data->d.d_buf;
    269 	  /* DW_FORM_block is a ULEB128 length followed by that many bytes.  */
    270 	  cfi_assert (program < end);
    271 	  get_uleb128 (operand, program, end);
    272 	  cfi_assert (operand <= (Dwarf_Word) (end - program));
    273 	  program += operand;
    274 	  register_rule (regno, expression, offset);
    275 	  continue;
    276 
    277 	case DW_CFA_val_expression:
    278 	  /* Expression rule relies on section data, abi_cfi cannot use it.  */
    279 	  assert (! abi_cfi);
    280 	  get_uleb128 (regno, program, end);
    281 	  /* DW_FORM_block is a ULEB128 length followed by that many bytes.  */
    282 	  offset = program - (const uint8_t *) cache->data->d.d_buf;
    283 	  get_uleb128 (operand, program, end);
    284 	  cfi_assert (operand <= (Dwarf_Word) (end - program));
    285 	  program += operand;
    286 	  register_rule (regno, val_expression, offset);
    287 	  continue;
    288 
    289 	case DW_CFA_restore_extended:
    290 	  get_uleb128 (operand, program, end);
    291 	case DW_CFA_restore + 0 ... DW_CFA_restore + CFI_PRIMARY_MAX:
    292 
    293 	  if (unlikely (abi_cfi) && likely (opcode == DW_CFA_restore))
    294 	    {
    295 	      /* Special case hack to give backend abi_cfi a shorthand.  */
    296 	      cache->default_same_value = true;
    297 	      continue;
    298 	    }
    299 
    300 	  /* This can't be used in the CIE's own initial instructions.  */
    301 	  cfi_assert (cie->initial_state != NULL);
    302 
    303 	  /* Restore the CIE's initial rule for this register.  */
    304 	  if (unlikely (! enough_registers (operand)))
    305 	    goto out;
    306 	  if (cie->initial_state->nregs > operand)
    307 	    fs->regs[operand] = cie->initial_state->regs[operand];
    308 	  else
    309 	    fs->regs[operand].rule = reg_unspecified;
    310 	  continue;
    311 
    312 	case DW_CFA_remember_state:
    313 	  {
    314 	    /* Duplicate the state and chain the copy on.  */
    315 	    Dwarf_Frame *copy = duplicate_frame_state (fs, fs);
    316 	    if (unlikely (copy == NULL))
    317 	      {
    318 		result = DWARF_E_NOMEM;
    319 		goto out;
    320 	      }
    321 	    fs = copy;
    322 	    continue;
    323 	  }
    324 
    325 	case DW_CFA_restore_state:
    326 	  {
    327 	    /* Pop the current state off and use the old one instead.  */
    328 	    Dwarf_Frame *prev = fs->prev;
    329 	    cfi_assert (prev != NULL);
    330 	    free (fs);
    331 	    fs = prev;
    332 	    continue;
    333 	  }
    334 
    335 	case DW_CFA_nop:
    336 	  continue;
    337 
    338 	case DW_CFA_GNU_window_save:
    339 	  /* This is magic shorthand used only by SPARC.  It's equivalent
    340 	     to a bunch of DW_CFA_register and DW_CFA_offset operations.  */
    341 	  if (unlikely (! enough_registers (31)))
    342 	    goto out;
    343 	  for (regno = 8; regno < 16; ++regno)
    344 	    {
    345 	      /* Find each %oN in %iN.  */
    346 	      fs->regs[regno].rule = reg_register;
    347 	      fs->regs[regno].value = regno + 16;
    348 	    }
    349 	  unsigned int address_size = (cache->e_ident[EI_CLASS] == ELFCLASS32
    350 				       ? 4 : 8);
    351 	  for (; regno < 32; ++regno)
    352 	    {
    353 	      /* Find %l0..%l7 and %i0..%i7 in a block at the CFA.  */
    354 	      fs->regs[regno].rule = reg_offset;
    355 	      fs->regs[regno].value = (regno - 16) * address_size;
    356 	    }
    357 	  continue;
    358 
    359 	case DW_CFA_GNU_args_size:
    360 	  /* XXX is this useful for anything? */
    361 	  get_uleb128 (operand, program, end);
    362 	  continue;
    363 
    364 	default:
    365 	  cfi_assert (false);
    366 	  continue;
    367 	}
    368 
    369       /* We get here only for the cases that have just moved LOC.  */
    370       cfi_assert (cie->initial_state != NULL);
    371       if (find_pc >= loc)
    372 	/* This advance has not yet reached FIND_PC.  */
    373 	fs->start = loc;
    374       else
    375 	{
    376 	  /* We have just advanced past the address we're looking for.
    377 	     The state currently described is what we want to see.  */
    378 	  fs->end = loc;
    379 	  break;
    380 	}
    381     }
    382 
    383   /* "The end of the instruction stream can be thought of as a
    384      DW_CFA_set_loc (initial_location + address_range) instruction."
    385      (DWARF 3.0 Section 6.4.3)
    386 
    387      When we fall off the end of the program without an advance_loc/set_loc
    388      that put us past FIND_PC, the final state left by the FDE program
    389      applies to this address (the caller ensured it was inside the FDE).
    390      This address (FDE->end) is already in FS->end as set by the caller.  */
    391 
    392 #undef register_rule
    393 #undef cfi_assert
    394 
    395  out:
    396 
    397   /* Pop any remembered states left on the stack.  */
    398   while (fs->prev != NULL)
    399     {
    400       Dwarf_Frame *prev = fs->prev;
    401       fs->prev = prev->prev;
    402       free (prev);
    403     }
    404 
    405   if (likely (result == DWARF_E_NOERROR))
    406     *state = fs;
    407   else
    408     free (fs);
    409 
    410   return result;
    411 }
    412 
    413 static int
    414 cie_cache_initial_state (Dwarf_CFI *cache, struct dwarf_cie *cie)
    415 {
    416   int result = DWARF_E_NOERROR;
    417 
    418   if (likely (cie->initial_state != NULL))
    419     return result;
    420 
    421   /* This CIE has not been used before.  Play out its initial
    422      instructions and cache the initial state that results.
    423      First we'll let the backend fill in the default initial
    424      state for this machine's ABI.  */
    425 
    426   Dwarf_CIE abi_info = { DW_CIE_ID_64, NULL, NULL, 1, 1, -1, "", NULL, 0, 0 };
    427 
    428   /* Make sure we have a backend handle cached.  */
    429   if (unlikely (cache->ebl == NULL))
    430     {
    431       cache->ebl = ebl_openbackend (cache->data->s->elf);
    432       if (unlikely (cache->ebl == NULL))
    433 	cache->ebl = (void *) -1l;
    434     }
    435 
    436   /* Fetch the ABI's default CFI program.  */
    437   if (likely (cache->ebl != (void *) -1l)
    438       && unlikely (ebl_abi_cfi (cache->ebl, &abi_info) < 0))
    439     return DWARF_E_UNKNOWN_ERROR;
    440 
    441   Dwarf_Frame *cie_fs = calloc (1, sizeof (Dwarf_Frame));
    442   if (unlikely (cie_fs == NULL))
    443     return DWARF_E_NOMEM;
    444 
    445   /* If the default state of any register is not "undefined"
    446      (i.e. call-clobbered), then the backend supplies instructions
    447      for the standard initial state.  */
    448   if (abi_info.initial_instructions_end > abi_info.initial_instructions)
    449     {
    450       /* Dummy CIE for backend's instructions.  */
    451       struct dwarf_cie abi_cie =
    452 	{
    453 	  .code_alignment_factor = abi_info.code_alignment_factor,
    454 	  .data_alignment_factor = abi_info.data_alignment_factor,
    455 	};
    456       result = execute_cfi (cache, &abi_cie, &cie_fs,
    457 			    abi_info.initial_instructions,
    458 			    abi_info.initial_instructions_end, true,
    459 			    0, (Dwarf_Addr) -1l);
    460     }
    461 
    462   /* Now run the CIE's initial instructions.  */
    463   if (cie->initial_instructions_end > cie->initial_instructions
    464       && likely (result == DWARF_E_NOERROR))
    465     result = execute_cfi (cache, cie, &cie_fs,
    466 			  cie->initial_instructions,
    467 			  cie->initial_instructions_end, false,
    468 			  0, (Dwarf_Addr) -1l);
    469 
    470   if (likely (result == DWARF_E_NOERROR))
    471     {
    472       /* Now we have the initial state of things that all
    473 	 FDEs using this CIE will start from.  */
    474       cie_fs->cache = cache;
    475       cie->initial_state = cie_fs;
    476     }
    477 
    478   return result;
    479 }
    480 
    481 int
    482 internal_function
    483 __libdw_frame_at_address (Dwarf_CFI *cache, struct dwarf_fde *fde,
    484 			  Dwarf_Addr address, Dwarf_Frame **frame)
    485 {
    486   int result = cie_cache_initial_state (cache, fde->cie);
    487   if (likely (result == DWARF_E_NOERROR))
    488     {
    489       Dwarf_Frame *fs = duplicate_frame_state (fde->cie->initial_state, NULL);
    490       if (unlikely (fs == NULL))
    491 	return DWARF_E_NOMEM;
    492 
    493       fs->fde = fde;
    494       fs->start = fde->start;
    495       fs->end = fde->end;
    496 
    497       result = execute_cfi (cache, fde->cie, &fs,
    498 			    fde->instructions, fde->instructions_end, false,
    499 			    fde->start, address);
    500       if (likely (result == DWARF_E_NOERROR))
    501 	*frame = fs;
    502     }
    503   return result;
    504 }
    505