ARC: dw2 unwind: Catch Dwarf SNAFUs early
authorVineet Gupta <vgupta@synopsys.com>
Mon, 21 Dec 2015 08:22:01 +0000 (13:52 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Mon, 21 Dec 2015 08:31:49 +0000 (14:01 +0530)
Instead of seeing empty stack traces, let kernel fail early so dwarf
issues can be fixed sooner

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/kernel/unwind.c

index f34599a..5eb7076 100644 (file)
@@ -296,10 +296,10 @@ static void init_unwind_hdr(struct unwind_table *table,
                if (cie == &not_fde)
                        continue;
                if (cie == NULL || cie == &bad_cie)
                if (cie == &not_fde)
                        continue;
                if (cie == NULL || cie == &bad_cie)
-                       return;
+                       goto ret_err;
                ptrType = fde_pointer_type(cie);
                if (ptrType < 0)
                ptrType = fde_pointer_type(cie);
                if (ptrType < 0)
-                       return;
+                       goto ret_err;
 
                ptr = (const u8 *)(fde + 2);
                if (!read_pointer(&ptr, (const u8 *)(fde + 1) + *fde,
 
                ptr = (const u8 *)(fde + 2);
                if (!read_pointer(&ptr, (const u8 *)(fde + 1) + *fde,
@@ -315,14 +315,14 @@ static void init_unwind_hdr(struct unwind_table *table,
        }
 
        if (tableSize || !n)
        }
 
        if (tableSize || !n)
-               return;
+               goto ret_err;
 
        hdrSize = 4 + sizeof(unsigned long) + sizeof(unsigned int)
            + 2 * n * sizeof(unsigned long);
 
        header = alloc(hdrSize);
        if (!header)
 
        hdrSize = 4 + sizeof(unsigned long) + sizeof(unsigned int)
            + 2 * n * sizeof(unsigned long);
 
        header = alloc(hdrSize);
        if (!header)
-               return;
+               goto ret_err;
 
        header->version = 1;
        header->eh_frame_ptr_enc = DW_EH_PE_abs | DW_EH_PE_native;
 
        header->version = 1;
        header->eh_frame_ptr_enc = DW_EH_PE_abs | DW_EH_PE_native;
@@ -361,6 +361,10 @@ static void init_unwind_hdr(struct unwind_table *table,
        table->hdrsz = hdrSize;
        smp_wmb();
        table->header = (const void *)header;
        table->hdrsz = hdrSize;
        smp_wmb();
        table->header = (const void *)header;
+       return;
+
+ret_err:
+       panic("Attention !!! Dwarf FDE parsing errors\n");;
 }
 
 #ifdef CONFIG_MODULES
 }
 
 #ifdef CONFIG_MODULES