static void init_unwind_table()

in kernel/unwind.c [184:215]


static void init_unwind_table(struct unwind_table *table, const char *name,
			      const void *core_start, unsigned long core_size,
			      const void *init_start, unsigned long init_size,
			      const void *table_start, unsigned long table_size,
			      const u8 *header_start, unsigned long header_size)
{
	table->core.pc = (unsigned long)core_start;
	table->core.range = core_size;
	table->init.pc = (unsigned long)init_start;
	table->init.range = init_size;
	table->address = table_start;
	table->size = table_size;
	/* To avoid the pointer addition with NULL pointer.*/
	if (header_start != NULL) {
		const u8 *ptr = header_start + 4;
		const u8 *end = header_start + header_size;
		/* See if the linker provided table looks valid. */
		if (header_size <= 4
		|| header_start[0] != 1
		|| (void *)read_pointer(&ptr, end, header_start[1])
				!= table_start
		|| header_start[2] == DW_EH_PE_omit
		|| read_pointer(&ptr, end, header_start[2]) <= 0
		|| header_start[3] == DW_EH_PE_omit)
			header_start = NULL;
	}
	table->hdrsz = header_size;
	smp_wmb();
	table->header = header_start;
	table->link = NULL;
	table->name = name;
}