54 lines
1.4 KiB
C
54 lines
1.4 KiB
C
/*
|
|
* Copyright (c) 2020 Institute of Parallel And Distributed Systems (IPADS), Shanghai Jiao Tong University (SJTU)
|
|
* OS-Lab-2020 (i.e., ChCore) is licensed under the Mulan PSL v1.
|
|
* You can use this software according to the terms and conditions of the Mulan PSL v1.
|
|
* You may obtain a copy of Mulan PSL v1 at:
|
|
* http://license.coscl.org.cn/MulanPSL
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
|
|
* PURPOSE.
|
|
* See the Mulan PSL v1 for more details.
|
|
*/
|
|
|
|
// Simple command-line kernel monitor useful for
|
|
// controlling the kernel and exploring the system interactively.
|
|
|
|
#include <common/printk.h>
|
|
#include <common/types.h>
|
|
#include <common/machine.h>
|
|
|
|
extern char kernel_stack[PLAT_CPU_NUM][KERNEL_STACK_SIZE];
|
|
|
|
static inline __attribute__ ((always_inline))
|
|
u64 read_fp()
|
|
{
|
|
u64 fp;
|
|
__asm __volatile("mov %0, x29":"=r"(fp));
|
|
return fp;
|
|
}
|
|
|
|
__attribute__ ((optimize("O1")))
|
|
int stack_backtrace()
|
|
{
|
|
printk("Stack backtrace:\n");
|
|
|
|
// Your code here.
|
|
u64 *fp, *preFp;
|
|
fp = (u64 *) read_fp();
|
|
// until stack end
|
|
while (true) {
|
|
preFp = (u64 *) *fp;
|
|
// entry frame
|
|
if (preFp == 0)
|
|
break;
|
|
printk("LR %lx FP %lx Args", *(preFp + 1), preFp);
|
|
for (int i = 0; i < 5; i++) {
|
|
printk(" %lx", *(fp + 2 + i));
|
|
}
|
|
printk("\n");
|
|
fp = preFp;
|
|
}
|
|
|
|
return 0;
|
|
}
|