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