static void panic_init(void) { #ifdef CONFIG_HOSTCMD_EVENTS struct panic_data *addr = panic_get_data(); /* Notify host of new panic event */ if (addr && !(addr->flags & PANIC_DATA_FLAG_OLD_HOSTEVENT)) { host_set_single_event(EC_HOST_EVENT_PANIC); addr->flags |= PANIC_DATA_FLAG_OLD_HOSTEVENT; } #endif }
void system_common_pre_init(void) { uintptr_t addr; /* * Put the jump data before the panic data, or at the end of RAM if * panic data is not present. */ addr = (uintptr_t)panic_get_data(); if (!addr) addr = CONFIG_RAM_BASE + CONFIG_RAM_SIZE; jdata = (struct jump_data *)(addr - sizeof(struct jump_data)); /* * Check jump data if this is a jump between images. Jumps all show up * as an unknown reset reason, because we jumped directly from one * image to another without actually triggering a chip reset. */ if (jdata->magic == JUMP_DATA_MAGIC && jdata->version >= 1 && reset_flags == 0) { /* Change in jump data struct size between the previous image * and this one. */ int delta; /* Yes, we jumped to this image */ jumped_to_image = 1; /* Restore the reset flags */ reset_flags = jdata->reset_flags | RESET_FLAG_SYSJUMP; /* * If the jump data structure isn't the same size as the * current one, shift the jump tags to immediately before the * current jump data structure, to make room for initalizing * the new fields below. */ if (jdata->version == 1) delta = 0; /* No tags in v1, so no need for move */ else if (jdata->version == 2) delta = sizeof(struct jump_data) - JUMP_DATA_SIZE_V2; else delta = sizeof(struct jump_data) - jdata->struct_size; if (delta && jdata->jump_tag_total) { uint8_t *d = (uint8_t *)system_usable_ram_end(); memmove(d, d + delta, jdata->jump_tag_total); } /* Initialize fields added after version 1 */ if (jdata->version < 2) jdata->jump_tag_total = 0; /* Initialize fields added after version 2 */ if (jdata->version < 3) jdata->reserved0 = 0; /* Struct size is now the current struct size */ jdata->struct_size = sizeof(struct jump_data); /* * Clear the jump struct's magic number. This prevents * accidentally detecting a jump when there wasn't one, and * disallows use of system_add_jump_tag(). */ jdata->magic = 0; } else { /* Clear the whole jump_data struct */ memset(jdata, 0, sizeof(struct jump_data)); } }