1 // Copyright 2017 The Fuchsia Authors
2 // Use of this source code is governed by a MIT-style
3 // license that can be found in the LICENSE file or at
4 // https://opensource.org/licenses/MIT
5 
6 #include <arch/arm64.h>
7 #include <debug.h>
8 #include <err.h>
9 #include <inttypes.h>
10 #include <platform.h>
11 #include <stdio.h>
12 #include <string.h>
13 
14 #if ARCH_ARM64
15 #include <lib/console.h>
16 
17 #define SYSREG_READ_COMMAND(sysreg_string)                               \
18     if (!strncasecmp(regname, sysreg_string, sizeof(sysreg_string))) {   \
19         printf(sysreg_string " = %016lx\n", __arm_rsr64(sysreg_string)); \
20         return 0;                                                        \
21     } else
22 
read_sysregs(const char * regname)23 static uint64_t read_sysregs(const char* regname) {
24     SYSREG_READ_COMMAND("actlr_el1")
25     SYSREG_READ_COMMAND("ccsidr_el1")
26     SYSREG_READ_COMMAND("clidr_el1")
27     SYSREG_READ_COMMAND("csselr_el1")
28     SYSREG_READ_COMMAND("midr_el1")
29     SYSREG_READ_COMMAND("mpidr_el1")
30     SYSREG_READ_COMMAND("sctlr_el1")
31     SYSREG_READ_COMMAND("spsr_el1")
32     SYSREG_READ_COMMAND("tcr_el1")
33     SYSREG_READ_COMMAND("tpidrro_el0")
34     SYSREG_READ_COMMAND("tpidr_el1")
35     SYSREG_READ_COMMAND("ttbr0_el1")
36     SYSREG_READ_COMMAND("ttbr1_el1")
37     SYSREG_READ_COMMAND("vbar_el1")
38 
39     //Generic Timer regs
40     SYSREG_READ_COMMAND("cntfrq_el0")
41     SYSREG_READ_COMMAND("cntkctl_el1")
42     SYSREG_READ_COMMAND("cntpct_el0")
43     SYSREG_READ_COMMAND("cntps_ctl_el1")
44     SYSREG_READ_COMMAND("cntps_cval_el1")
45     SYSREG_READ_COMMAND("cntps_tval_el1")
46     SYSREG_READ_COMMAND("cntp_ctl_el0")
47     SYSREG_READ_COMMAND("cntp_cval_el0")
48     SYSREG_READ_COMMAND("cntp_tval_el0")
49     SYSREG_READ_COMMAND("cntvct_el0")
50     SYSREG_READ_COMMAND("cntv_ctl_el0")
51     SYSREG_READ_COMMAND("cntv_cval_el0")
52     SYSREG_READ_COMMAND("cntv_tval_el0") {
53         printf("Could not find register %s in list (you may need to add it to kernel/kernel/sysreg.c)\n", regname);
54     }
55     return 0;
56 }
57 
58 static int cmd_sysreg(int argc, const cmd_args* argv, uint32_t flags);
59 
60 STATIC_COMMAND_START
61 STATIC_COMMAND("sysreg", "read armv8 system register", &cmd_sysreg)
62 STATIC_COMMAND_END(kernel);
63 
cmd_sysreg(int argc,const cmd_args * argv,uint32_t flags)64 static int cmd_sysreg(int argc, const cmd_args* argv, uint32_t flags) {
65     if (argc < 2) {
66         printf("not enough arguments\n");
67         return -1;
68     }
69     read_sysregs(argv[1].str);
70     return 0;
71 }
72 
73 #endif // ARCH_ARM64
74