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 <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() @@ -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; }