summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHsin-Yi Wang <hsinyi@chromium.org>2023-03-09 19:20:02 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-03-14 09:43:33 +0000
commit7b039ce808f49503e56a92f57e2482237bce6141 (patch)
tree2b71a66e79e426d9d4170cb11ffca219f5ca7cca
parentccddaa03e8e2e9654de30eee8a87db5c98c9f61e (diff)
downloadchrome-ec-7b039ce808f49503e56a92f57e2482237bce6141.tar.gz
util: Remove ec_panicinfo
ec_panicinfo is moved to libec. BUG=b:172222556 BRANCH=None TEST=`BOARD=host make utils-host` TEST=test with CL:4322820 and parse a sample eccrash and check result Cq-Depend: chromium:4318210 Change-Id: Ib9770932f4555600bd3487757809bfb046f0bad8 Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4318306 Reviewed-by: Tom Hughes <tomhughes@chromium.org>
-rw-r--r--util/build.mk4
-rw-r--r--util/ec_panicinfo.cc246
-rw-r--r--util/ec_panicinfo.h30
-rw-r--r--util/ec_panicinfo_fuzzer.cc2
-rw-r--r--util/ec_parse_panicinfo.cc24
-rw-r--r--util/ectool.cc15
-rw-r--r--zephyr/shim/src/panic.c2
7 files changed, 34 insertions, 289 deletions
diff --git a/util/build.mk b/util/build.mk
index 12479d4a7c..38801d2f77 100644
--- a/util/build.mk
+++ b/util/build.mk
@@ -31,7 +31,7 @@ comm-objs=$(util-lock-objs:%=lock/%) comm-host.o comm-dev.o
comm-objs+=comm-lpc.o comm-i2c.o misc_util.o comm-usb.o
iteflash-objs = iteflash.o usb_if.o
-ectool-objs=ectool.o ectool_keyscan.o ec_flash.o ec_panicinfo.o $(comm-objs)
+ectool-objs=ectool.o ectool_keyscan.o ec_flash.o $(comm-objs)
ectool-objs+=ectool_i2c.o
ectool-objs+=../common/crc.o
ectool_servo-objs=$(ectool-objs) comm-servo-spi.o
@@ -41,7 +41,7 @@ lbplay-objs=lbplay.o $(comm-objs)
util/ectool.cc: $(out)/ec_version.h
-ec_parse_panicinfo-objs=ec_parse_panicinfo.o ec_panicinfo.o
+ec_parse_panicinfo-objs=ec_parse_panicinfo.o
# USB type-C Vendor Information File generation
ifeq ($(CONFIG_USB_POWER_DELIVERY),y)
diff --git a/util/ec_panicinfo.cc b/util/ec_panicinfo.cc
deleted file mode 100644
index 308cd0e641..0000000000
--- a/util/ec_panicinfo.cc
+++ /dev/null
@@ -1,246 +0,0 @@
-/* Copyright 2016 The ChromiumOS Authors
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <cstddef>
-
-/* Helpers from ec/include/compile_time_macros.h */
-#ifndef CONFIG_ZEPHYR
-#define BIT(nr) (1U << (nr))
-#endif
-
-#include "ec_panicinfo.h"
-
-static void print_panic_reg(int regnum, const uint32_t *regs, int index)
-{
- static const char *const regname[] = { "r0 ", "r1 ", "r2 ", "r3 ",
- "r4 ", "r5 ", "r6 ", "r7 ",
- "r8 ", "r9 ", "r10", "r11",
- "r12", "sp ", "lr ", "pc " };
-
- printf("%s:", regname[regnum]);
- if (regs)
- printf("%08x", regs[index]);
- else
- printf(" ");
- printf((regnum & 3) == 3 ? "\n" : " ");
-}
-
-static void panic_show_extra_cm(const struct panic_data *pdata)
-{
- enum {
- CPU_NVIC_CFSR_BFARVALID = BIT(15),
- CPU_NVIC_CFSR_MFARVALID = BIT(7),
- };
-
- printf("\n");
- if (pdata->cm.cfsr & CPU_NVIC_CFSR_BFARVALID)
- printf("bfar=%08x, ", pdata->cm.bfar);
- if (pdata->cm.cfsr & CPU_NVIC_CFSR_MFARVALID)
- printf("mfar=%08x, ", pdata->cm.mfar);
- printf("cfsr=%08x, ", pdata->cm.cfsr);
- printf("shcsr=%08x, ", pdata->cm.shcsr);
- printf("hfsr=%08x, ", pdata->cm.hfsr);
- printf("dfsr=%08x, ", pdata->cm.dfsr);
- printf("ipsr=%08x", pdata->cm.regs[CORTEX_PANIC_REGISTER_IPSR]);
- printf("\n");
-}
-
-static int parse_panic_info_cm(const struct panic_data *pdata)
-{
- const uint32_t *lregs = pdata->cm.regs;
- const uint32_t *sregs = NULL;
- enum {
- ORIG_UNKNOWN = 0,
- ORIG_PROCESS,
- ORIG_HANDLER
- } origin = ORIG_UNKNOWN;
- int i;
- const char *panic_origins[3] = { "", "PROCESS", "HANDLER" };
-
- printf("Saved panic data:%s\n",
- (pdata->flags & PANIC_DATA_FLAG_OLD_HOSTCMD ? "" : " (NEW)"));
-
- if (pdata->struct_version == 2)
- origin = ((lregs[11] & 0xf) == 1 || (lregs[11] & 0xf) == 9) ?
- ORIG_HANDLER :
- ORIG_PROCESS;
-
- /*
- * In pdata struct, 'regs', which is allocated before 'frame', has
- * one less elements in version 1. Therefore, if the data is from
- * version 1, shift 'sregs' by one element to align with 'frame' in
- * version 1.
- */
- if (pdata->flags & PANIC_DATA_FLAG_FRAME_VALID)
- sregs = pdata->cm.frame - (pdata->struct_version == 1 ? 1 : 0);
-
- printf("=== %s EXCEPTION: %02x ====== xPSR: %08x ===\n",
- panic_origins[origin], lregs[1] & 0xff, sregs ? sregs[7] : -1);
- for (i = 0; i < 4; ++i)
- print_panic_reg(i, sregs, i);
- for (i = 4; i < 10; ++i)
- print_panic_reg(i, lregs, i - 1);
- print_panic_reg(10, lregs, 9);
- print_panic_reg(11, lregs, 10);
- print_panic_reg(12, sregs, 4);
- print_panic_reg(13, lregs, origin == ORIG_HANDLER ? 2 : 0);
- print_panic_reg(14, sregs, 5);
- print_panic_reg(15, sregs, 6);
-
- panic_show_extra_cm(pdata);
-
- return 0;
-}
-
-static int parse_panic_info_nds32(const struct panic_data *pdata)
-{
- const uint32_t *regs = pdata->nds_n8.regs;
- uint32_t itype = pdata->nds_n8.itype;
- uint32_t ipc = pdata->nds_n8.ipc;
- uint32_t ipsw = pdata->nds_n8.ipsw;
-
- printf("Saved panic data:%s\n",
- (pdata->flags & PANIC_DATA_FLAG_OLD_HOSTCMD ? "" : " (NEW)"));
-
- printf("=== EXCEP: ITYPE=%x ===\n", itype);
- printf("R0 %08x R1 %08x R2 %08x R3 %08x\n", regs[0], regs[1],
- regs[2], regs[3]);
- printf("R4 %08x R5 %08x R6 %08x R7 %08x\n", regs[4], regs[5],
- regs[6], regs[7]);
- printf("R8 %08x R9 %08x R10 %08x R15 %08x\n", regs[8], regs[9],
- regs[10], regs[11]);
- printf("FP %08x GP %08x LP %08x SP %08x\n", regs[12], regs[13],
- regs[14], regs[15]);
- printf("IPC %08x IPSW %05x\n", ipc, ipsw);
- printf("SWID of ITYPE: %x\n", ((itype >> 16) & 0x7fff));
-
- return 0;
-}
-
-static int parse_panic_info_rv32i(const struct panic_data *pdata)
-{
- uint32_t *regs, mcause, mepc;
-
- regs = (uint32_t *)pdata->riscv.regs;
- mcause = pdata->riscv.mcause;
- mepc = pdata->riscv.mepc;
-
- printf("=== EXCEPTION: MCAUSE=%x ===\n", mcause);
- printf("S11 %08x S10 %08x S9 %08x S8 %08x\n", regs[0], regs[1],
- regs[2], regs[3]);
- printf("S7 %08x S6 %08x S5 %08x S4 %08x\n", regs[4], regs[5],
- regs[6], regs[7]);
- printf("S3 %08x S2 %08x S1 %08x S0 %08x\n", regs[8], regs[9],
- regs[10], regs[11]);
- printf("T6 %08x T5 %08x T4 %08x T3 %08x\n", regs[12], regs[13],
- regs[14], regs[15]);
- printf("T2 %08x T1 %08x T0 %08x A7 %08x\n", regs[16], regs[17],
- regs[18], regs[19]);
- printf("A6 %08x A5 %08x A4 %08x A3 %08x\n", regs[20], regs[21],
- regs[22], regs[23]);
- printf("A2 %08x A1 %08x A0 %08x TP %08x\n", regs[24], regs[25],
- regs[26], regs[27]);
- printf("GP %08x RA %08x SP %08x MEPC %08x\n", regs[28], regs[29],
- regs[30], mepc);
-
- return 0;
-}
-
-int get_panic_input(char *data, size_t max_size)
-{
- size_t size = 0;
- size_t read;
-
- while (1) {
- read = fread(&data[size], 1, max_size - size, stdin);
- if (read < 0) {
- fprintf(stderr, "Cannot read panicinfo from stdin.\n");
- return -1;
- }
- if (read == 0)
- break;
-
- size += read;
- if (size >= max_size) {
- fprintf(stderr, "Too much panicinfo data in stdin.\n");
- return -1;
- }
- }
-
- return size;
-}
-
-int parse_panic_info(const char *data, size_t size)
-{
- /* Size of the panic information "header". */
- const size_t header_size = 4;
- /* Size of the panic information "trailer" (struct_size and magic). */
- const size_t trailer_size = sizeof(struct panic_data) -
- offsetof(struct panic_data, struct_size);
-
- struct panic_data pdata = { 0 };
- size_t copy_size;
-
- if (size < (header_size + trailer_size)) {
- fprintf(stderr, "ERROR: Panic data too short (%zd).\n", size);
- return -1;
- }
-
- if (size > sizeof(pdata)) {
- fprintf(stderr,
- "WARNING: Panic data too large (%zd > %zd). "
- "Following data may be incorrect!\n",
- size, sizeof(pdata));
- copy_size = sizeof(pdata);
- } else {
- copy_size = size;
- }
- /* Copy the data into pdata, as the struct size may have changed. */
- memcpy(&pdata, data, copy_size);
- /* Then copy the trailer in position. */
- memcpy((char *)&pdata + (sizeof(struct panic_data) - trailer_size),
- data + (size - trailer_size), trailer_size);
-
- /*
- * We only understand panic data with version <= 2. Warn the user
- * of higher versions.
- */
- if (pdata.struct_version > 2)
- fprintf(stderr,
- "WARNING: Unknown panic data version (%d). "
- "Following data may be incorrect!\n",
- pdata.struct_version);
-
- /* Validate magic number */
- if (pdata.magic != PANIC_DATA_MAGIC)
- fprintf(stderr,
- "WARNING: Incorrect panic magic (%d). "
- "Following data may be incorrect!\n",
- pdata.magic);
-
- if (pdata.struct_size != size)
- fprintf(stderr,
- "WARNING: Panic struct size inconsistent (%u vs %zd). "
- "Following data may be incorrect!\n",
- pdata.struct_size, size);
-
- switch (pdata.arch) {
- case PANIC_ARCH_CORTEX_M:
- return parse_panic_info_cm(&pdata);
- case PANIC_ARCH_NDS32_N8:
- return parse_panic_info_nds32(&pdata);
- case PANIC_ARCH_RISCV_RV32I:
- return parse_panic_info_rv32i(&pdata);
- default:
- fprintf(stderr, "ERROR: Unknown architecture (%d).\n",
- pdata.arch);
- break;
- }
- return -1;
-}
diff --git a/util/ec_panicinfo.h b/util/ec_panicinfo.h
deleted file mode 100644
index cb968b968f..0000000000
--- a/util/ec_panicinfo.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright 2016 The ChromiumOS Authors
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef EC_PANICINFO_H
-#define EC_PANICINFO_H
-
-#include "panic_defs.h"
-
-#include <stdio.h>
-
-/**
- * Prints panic information to stdout.
- *
- * @param pdata Panic information to print
- * @return 0 if success or non-zero error code if error.
- */
-int parse_panic_info(const char *data, size_t size);
-
-/**
- * Read stdin to data.
- *
- * @param data Raw information to store.
- * @param max_size Maximum size can be stored to data.
- * @return data length if success or -1 on error.
- */
-int get_panic_input(char *data, size_t max_size);
-
-#endif /* EC_PANICINFO_H */
diff --git a/util/ec_panicinfo_fuzzer.cc b/util/ec_panicinfo_fuzzer.cc
index 95f1871837..7767afa2e2 100644
--- a/util/ec_panicinfo_fuzzer.cc
+++ b/util/ec_panicinfo_fuzzer.cc
@@ -3,7 +3,7 @@
* found in the LICENSE file.
*/
-#include "ec_panicinfo.h"
+#include <libec/ec_panicinfo.h>
/* Fuzzing Build command:
* $ clang++ ec_panicinfo_fuzzer.cc ec_panicinfo.cc -g -fsanitize=address,fuzzer
diff --git a/util/ec_parse_panicinfo.cc b/util/ec_parse_panicinfo.cc
index c278b3c4f1..1937d9a7a4 100644
--- a/util/ec_parse_panicinfo.cc
+++ b/util/ec_parse_panicinfo.cc
@@ -8,7 +8,8 @@
#include <stdint.h>
#include <stdio.h>
#include "compile_time_macros.h"
-#include "ec_panicinfo.h"
+
+#include <libec/ec_panicinfo.h>
int main(int argc, char *argv[])
{
@@ -16,10 +17,9 @@ int main(int argc, char *argv[])
* panic_data size could change with time, as new architecture are
* added (or, less likely, removed).
*/
- char pdata[4096];
- size_t size = 0;
+ const size_t max_size = 4096;
- BUILD_ASSERT(sizeof(pdata) > sizeof(struct panic_data) * 2);
+ BUILD_ASSERT(max_size > sizeof(struct panic_data) * 2);
/*
* Provide a minimal help message.
@@ -34,9 +34,19 @@ int main(int argc, char *argv[])
return 1;
}
- size = get_panic_input(pdata, sizeof(pdata));
- if (size < 0)
+ auto data = ec::GetPanicInput(4096);
+ if (!data.has_value()) {
+ fprintf(stderr, "%s", data.error().c_str());
+ return 1;
+ }
+
+ auto result = ec::ParsePanicInfo(data.value());
+
+ if (!result.has_value()) {
+ fprintf(stderr, "%s", result.error().c_str());
return 1;
+ }
+ printf("%s", result.value().c_str());
- return parse_panic_info(pdata, size) ? 1 : 0;
+ return 0;
}
diff --git a/util/ectool.cc b/util/ectool.cc
index bd9759080a..0f632413d2 100644
--- a/util/ectool.cc
+++ b/util/ectool.cc
@@ -14,6 +14,7 @@
#include <string.h>
#include <time.h>
#include <unistd.h>
+#include <vector>
#include <signal.h>
#include <stdbool.h>
@@ -24,7 +25,6 @@
#include "compile_time_macros.h"
#include "crc.h"
#include "cros_ec_dev.h"
-#include "ec_panicinfo.h"
#include "ec_flash.h"
#include "ec_version.h"
#include "ectool.h"
@@ -37,6 +37,7 @@
#include "usb_pd.h"
#include <libec/add_entropy_command.h>
+#include <libec/ec_panicinfo.h>
/* Maximum flash size (16 MB, conservative) */
#define MAX_FLASH_SIZE 0x1000000
@@ -6880,7 +6881,17 @@ int cmd_panic_info(int argc, char *argv[])
return 0;
}
- return parse_panic_info((char *)(ec_inbuf), rv);
+ std::vector<uint8_t> data(static_cast<uint8_t *>(ec_inbuf),
+ static_cast<uint8_t *>(ec_inbuf) + rv);
+ auto result = ec::ParsePanicInfo(data);
+
+ if (!result.has_value()) {
+ fprintf(stderr, "%s", result.error().c_str());
+ return 1;
+ }
+ printf("%s", result.value().c_str());
+
+ return 0;
}
int cmd_power_info(int argc, char *argv[])
diff --git a/zephyr/shim/src/panic.c b/zephyr/shim/src/panic.c
index 2e9068078b..28bb045fde 100644
--- a/zephyr/shim/src/panic.c
+++ b/zephyr/shim/src/panic.c
@@ -68,7 +68,7 @@
* Not all registers are passed in the context from Zephyr
* (see include/zephyr/arch/riscv/exp.h), in particular
* the mcause register is not saved (mstatus is saved instead).
- * The assignments must match util/ec_panicinfo.c
+ * The assignments must match include/panic_defs.h
*/
#define PANIC_ARCH PANIC_ARCH_RISCV_RV32I
#define PANIC_REG_LIST(M) \