Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2d64affc authored by Vineet Gupta's avatar Vineet Gupta
Browse files

Revert "ARC: dw2 unwind: Ignore CIE version !=1 gracefully instead of bailing"

Blingly ignoring CIE.version != 1 was a bad idea.
It still leaves "desirability" when running perf with callgraphing where libgcc
symbols might show in hotspot.

More importantly, basic CIE.version == 3 support already exists in code:

|
|   retAddrReg = state.version <= 1 ? *ptr++ : get_uleb128(&ptr, end);
|

Next commit with simply add continue-not-bail for CIE.version != 1

This reverts commit 323f41f9.
parent 07fd7d4b
Loading
Loading
Loading
Loading
+4 −9
Original line number Diff line number Diff line
@@ -293,13 +293,13 @@ static void init_unwind_hdr(struct unwind_table *table,
		const u32 *cie = cie_for_fde(fde, table);
		signed ptrType;

		if (cie == &not_fde)	/* only process FDE here */
		if (cie == &not_fde)
			continue;
		if (cie == NULL || cie == &bad_cie)
			continue;	/* say FDE->CIE.version != 1 */
			return;
		ptrType = fde_pointer_type(cie);
		if (ptrType < 0)
			continue;
			return;

		ptr = (const u8 *)(fde + 2);
		if (!read_pointer(&ptr, (const u8 *)(fde + 1) + *fde,
@@ -343,10 +343,6 @@ static void init_unwind_hdr(struct unwind_table *table,

		if (fde[1] == 0xffffffff)
			continue;	/* this is a CIE */

		if (*(u8 *)(cie + 2) != 1)
			continue;	/* FDE->CIE.version not supported */

		ptr = (const u8 *)(fde + 2);
		header->table[n].start = read_pointer(&ptr,
						      (const u8 *)(fde + 1) +
@@ -523,8 +519,7 @@ static const u32 *cie_for_fde(const u32 *fde, const struct unwind_table *table)

	if (*cie <= sizeof(*cie) + 4 || *cie >= fde[1] - sizeof(*fde)
	    || (*cie & (sizeof(*cie) - 1))
	    || (cie[1] != 0xffffffff)
	    || ( *(u8 *)(cie + 2) != 1))   /* version 1 supported */
	    || (cie[1] != 0xffffffff))
		return NULL;	/* this is not a (valid) CIE */
	return cie;
}