From 2a5e482ef4592c1328d7ff88f3fa9b3f593d4d09 Mon Sep 17 00:00:00 2001
From: Hong YANG <hong.yang3@nio.com>
Date: Fri, 19 Nov 2021 18:27:01 +0800
Subject: [PATCH 3/3] arm64: Refine overflow stack checking funcs

Signed-off-by: Hong YANG <hong.yang3@nio.com>
---
 arm64.c | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)

diff --git a/arm64.c b/arm64.c
index 54a1037..af32e2c 100644
--- a/arm64.c
+++ b/arm64.c
@@ -1742,8 +1742,8 @@ arm64_overflow_stack_init(void)
 			fprintf(fp, "overflow_stack: \n");
 			fprintf(fp, "  type: %x, %s\n",
 				(int)req->typecode,
-				(req->typecode == TYPE_CODE_PTR) ?
-						"TYPE_CODE_PTR" : "other");
+				(req->typecode == TYPE_CODE_ARRAY) ?
+						"TYPE_CODE_ARRAY" : "other");
 			fprintf(fp, "  target_typecode: %x, %s\n",
 				(int)req->target_typecode,
 				req->target_typecode == TYPE_CODE_INT ?
@@ -2728,16 +2728,13 @@ arm64_back_trace_cmd(struct bt_info *bt)
 			bt->hp->eip : GET_STACK_ULONG(bt->hp->esp);
 		stackframe.sp = bt->hp->esp + 8;
 		bt->flags &= ~BT_REGS_NOT_FOUND;
-	} else if (arm64_on_overflow_stack(bt->tc->processor, bt->frameptr)) {
-		arm64_set_overflow_stack(bt);
-		bt->flags |= BT_OVERFLOW_STACK;
-		stackframe.sp = bt->stkptr;
-		stackframe.pc = bt->instptr;
-		stackframe.fp = bt->frameptr;
 	} else {
 		if (arm64_on_irq_stack(bt->tc->processor, bt->frameptr)) {
 			arm64_set_irq_stack(bt);
 			bt->flags |= BT_IRQSTACK;
+		} else if (arm64_on_overflow_stack(bt->tc->processor, bt->frameptr)) {
+			arm64_set_overflow_stack(bt);
+			bt->flags |= BT_OVERFLOW_STACK;
 		}
 		stackframe.sp = bt->stkptr;
 		stackframe.pc = bt->instptr;
@@ -3990,16 +3987,10 @@ arm64_on_process_stack(struct bt_info *bt, ulong stkptr)
 	return FALSE;
 }
 
-static int
-arm64_on_irq_stack(int cpu, ulong stkptr)
-{
-	return arm64_in_alternate_stack(cpu, stkptr);
-}
-
 static int
 arm64_in_alternate_stackv(int cpu, ulong stkptr, ulong *stacks, ulong stack_size)
 {
-	if (!stack_size || (cpu >= kt->cpus))
+	if ((cpu >= kt->cpus) || (stacks == NULL) || !stack_size)
 		return FALSE;
 
 	if ((stkptr >= stacks[cpu]) &&
@@ -4011,6 +4002,13 @@ arm64_in_alternate_stackv(int cpu, ulong stkptr, ulong *stacks, ulong stack_size
 
 static int
 arm64_in_alternate_stack(int cpu, ulong stkptr)
+{
+	return (arm64_on_irq_stack(cpu, stkptr) ||
+		arm64_on_overflow_stack(cpu, stkptr));
+}
+
+static int
+arm64_on_irq_stack(int cpu, ulong stkptr)
 {
 	struct machine_specific *ms = machdep->machspec;
 
-- 
2.25.1

