diff options
author | Andrew Donnellan <andrew.donnellan@au1.ibm.com> | 2019-03-18 15:28:55 +1100 |
---|---|---|
committer | Stewart Smith <stewart@linux.ibm.com> | 2019-03-28 15:24:12 +1100 |
commit | b971b67ac2e10880c490e73be99fdeb9731bd395 (patch) | |
tree | 043f7923785503a96f82fd737f2b69504e9b3ddc /core | |
parent | c9bc52a250a0f15e75b10670165f8e518a845b68 (diff) | |
download | skiboot-b971b67ac2e10880c490e73be99fdeb9731bd395.zip skiboot-b971b67ac2e10880c490e73be99fdeb9731bd395.tar.gz skiboot-b971b67ac2e10880c490e73be99fdeb9731bd395.tar.bz2 |
core/stack: Define a backtrace metadata struct
Every time we take a backtrace, we have to store the number of entries, the
OPAL API token, r1 caller and PIR values. Rather than defining these and
passing them around all over the place, let's throw them in a struct.
Define a struct, struct bt_metadata, to store these details, and convert
___backtrace() and ___print_backtrace() to use it.
We change the wrapper functions __backtrace() and __print_backtrace() to
call ___backtrace()/___print_backtrace() with struct bt_metadata, but don't
change their parameter profiles for now - we'll do that later.
Signed-off-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'core')
-rw-r--r-- | core/stack.c | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/core/stack.c b/core/stack.c index 5e4cf4b..773d91e 100644 --- a/core/stack.c +++ b/core/stack.c @@ -27,10 +27,9 @@ static struct bt_entry bt_buf[STACK_BUF_ENTRIES]; /* Dumps backtrace to buffer */ -void __nomcount ___backtrace(struct bt_entry *entries, unsigned int *count, - unsigned long *token, unsigned long *r1_caller) +void __nomcount ___backtrace(struct bt_entry *entries, unsigned int max_ents, + struct bt_metadata *metadata) { - unsigned int room = *count; unsigned long *fp = __builtin_frame_address(0); unsigned long top_adj = top_of_ram; struct stack_frame *eframe = (struct stack_frame *)fp; @@ -39,8 +38,8 @@ void __nomcount ___backtrace(struct bt_entry *entries, unsigned int *count, if (top_of_ram == SKIBOOT_BASE + SKIBOOT_SIZE) top_adj = top_of_ram + STACK_SIZE; - *count = 0; - while(room) { + metadata->ents = 0; + while (max_ents) { fp = (unsigned long *)fp[0]; if (!fp || (unsigned long)fp > top_adj) break; @@ -48,22 +47,20 @@ void __nomcount ___backtrace(struct bt_entry *entries, unsigned int *count, entries->sp = (unsigned long)fp; entries->pc = fp[2]; entries++; - *count = (*count) + 1; - room--; + metadata->ents++; + max_ents--; } - *r1_caller = eframe->gpr[1]; + metadata->r1_caller = eframe->gpr[1]; if (fp) - *token = eframe->gpr[0]; + metadata->token = eframe->gpr[0]; else - *token = -1UL; + metadata->token = -1UL; } -void ___print_backtrace(unsigned int pir, struct bt_entry *entries, - unsigned int count, unsigned long token, - unsigned long r1_caller, char *out_buf, - unsigned int *len, bool symbols) +void ___print_backtrace(struct bt_entry *entries, struct bt_metadata *metadata, + char *out_buf, unsigned int *len, bool symbols) { static char bt_text_buf[4096]; int i, l = 0, max; @@ -77,14 +74,14 @@ void ___print_backtrace(unsigned int pir, struct bt_entry *entries, } else max = *len - 1; - bottom = cpu_stack_bottom(pir); - normal_top = cpu_stack_top(pir); - top = cpu_emergency_stack_top(pir); + bottom = cpu_stack_bottom(metadata->pir); + normal_top = cpu_stack_top(metadata->pir); + top = cpu_emergency_stack_top(metadata->pir); tbot = SKIBOOT_BASE; ttop = (unsigned long)&_etext; - l += snprintf(buf, max, "CPU %04x Backtrace:\n", pir); - for (i = 0; i < count && l < max; i++) { + l += snprintf(buf, max, "CPU %04lx Backtrace:\n", metadata->pir); + for (i = 0; i < metadata->ents && l < max; i++) { if (entries->sp < bottom || entries->sp > top) mark = '!'; else if (entries->sp > normal_top) @@ -101,9 +98,11 @@ void ___print_backtrace(unsigned int pir, struct bt_entry *entries, l += snprintf(buf + l, max - l, "\n"); entries++; } - if (token <= OPAL_LAST) - l += snprintf(buf + l, max - l, " --- OPAL call token: 0x%lx caller R1: 0x%016lx ---\n", token, r1_caller); - else if (token == -1UL) + if (metadata->token <= OPAL_LAST) + l += snprintf(buf + l, max - l, + " --- OPAL call token: 0x%lx caller R1: 0x%016lx ---\n", + metadata->token, metadata->r1_caller); + else if (metadata->token == -1UL) l += snprintf(buf + l, max - l, " --- OPAL boot ---\n"); if (!out_buf) write(stdout->fd, bt_text_buf, l); @@ -122,14 +121,14 @@ struct lock bt_lock = LOCK_UNLOCKED; void backtrace(void) { - unsigned int ents = STACK_BUF_ENTRIES; - unsigned long token, r1_caller; + struct bt_metadata metadata = { + .pir = mfspr(SPR_PIR), + }; lock(&bt_lock); - ___backtrace(bt_buf, &ents, &token, &r1_caller); - ___print_backtrace(mfspr(SPR_PIR), bt_buf, ents, token, r1_caller, - NULL, NULL, true); + ___backtrace(bt_buf, STACK_BUF_ENTRIES, &metadata); + ___print_backtrace(bt_buf, &metadata, NULL, NULL, true); unlock(&bt_lock); } |