From fd018168a9a143afefe5cc725664d0a46ad79863 Mon Sep 17 00:00:00 2001 From: KAAAsS Date: Wed, 12 May 2021 22:56:57 +0800 Subject: [PATCH] =?UTF-8?q?lab2=20=E5=A2=9E=E5=8A=A0=20lab1=20=E5=8F=98?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab2/.gitignore | 2 ++ lab2/kernel/common/printk.c | 20 +++++++++++++++++++- lab2/kernel/monitor.c | 18 ++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/lab2/.gitignore b/lab2/.gitignore index fbdc48c..298fb7e 100644 --- a/lab2/.gitignore +++ b/lab2/.gitignore @@ -14,3 +14,5 @@ build *.out *.pyc chcore.out + +.idea \ No newline at end of file diff --git a/lab2/kernel/common/printk.c b/lab2/kernel/common/printk.c index 29ebc95..4c2ca6e 100644 --- a/lab2/kernel/common/printk.c +++ b/lab2/kernel/common/printk.c @@ -119,7 +119,25 @@ static int printk_write_num(char **out, long long i, int base, int sign, // store the digitals in the buffer `print_buf`: // 1. the last postion of this buffer must be '\0' // 2. the format is only decided by `base` and `letbase` here - + int len = 0; + s = print_buf + 1; + while (u > 0) { + t = u % base; + u /= base; + if (t <= 9) + s[len++] = t + '0'; + else + s[len++] = t - 10 + (letbase ? 'a': 'A'); + } + s[len] = '\0'; + // swap print_buf + char ch; + for (int i = 0; i < len / 2; i++) { + ch = s[i]; + s[i] = s[len - 1 - i]; + s[len - 1 - i] = ch; + } + if (neg) { if (width && (flags & PAD_ZERO)) { simple_outputchar(out, '-'); diff --git a/lab2/kernel/monitor.c b/lab2/kernel/monitor.c index 00dd7b5..0f951b9 100644 --- a/lab2/kernel/monitor.c +++ b/lab2/kernel/monitor.c @@ -15,6 +15,9 @@ #include #include +#include + +extern char kernel_stack[PLAT_CPU_NUM][KERNEL_STACK_SIZE]; static inline __attribute__ ((always_inline)) u64 read_fp() @@ -30,6 +33,21 @@ int stack_backtrace() printk("Stack backtrace:\n"); // Your code here. + u64 *fp, *preFp; + fp = read_fp(); + // until stack end + while (true) { + preFp = *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; }