5 #include "sw/device/silicon_creator/lib/dbg_print.h"
14 #include "sw/device/silicon_creator/lib/drivers/uart.h"
15 #include "sw/device/silicon_creator/lib/epmp_defs.h"
17 static const char kHexTable[16] =
"0123456789abcdef";
19 static void print_integer(
unsigned value,
bool is_signed) {
21 char *b = buf +
sizeof(buf);
22 if (is_signed && (
int)value < 0) {
24 value = (unsigned)(-(
int)value);
28 *--b =
'0' + value % 10;
36 void dbg_puts(
const char *str) {
42 void dbg_printf(
const char *format, ...) {
44 va_start(args, format);
46 for (; *format !=
'\0'; ++format) {
48 uart_putchar(*format);
55 uart_putchar(*format);
58 int ch = va_arg(args,
int);
59 uart_putchar((
char)ch);
63 uint32_t val = va_arg(args, uint32_t);
64 for (
size_t i = 0; i <
sizeof(uint32_t); ++i, val >>= 8) {
65 uint8_t ch = (uint8_t)val;
66 if (ch >= 32 && ch < 127) {
67 uart_putchar((
char)ch);
71 uart_putchar(kHexTable[ch >> 4]);
72 uart_putchar(kHexTable[ch & 15]);
79 const char *str = va_arg(args,
const char *);
80 while (*str !=
'\0') {
87 print_integer(va_arg(args,
unsigned),
true);
90 print_integer(va_arg(args,
unsigned),
false);
96 unsigned int v = va_arg(args,
unsigned int);
97 for (
int i = 0; i <
sizeof(v) * 2; ++i) {
98 int shift =
sizeof(v) * 8 - 4;
99 uart_putchar(kHexTable[v >> shift]);
114 void dbg_print_epmp(
void) {
115 uint32_t pmpaddr[16];
118 uint8_t *cfg = (uint8_t *)pmpcfg;
121 CSR_READ(CSR_REG_PMPADDR0, &pmpaddr[0]);
122 CSR_READ(CSR_REG_PMPADDR1, &pmpaddr[1]);
123 CSR_READ(CSR_REG_PMPADDR2, &pmpaddr[2]);
124 CSR_READ(CSR_REG_PMPADDR3, &pmpaddr[3]);
125 CSR_READ(CSR_REG_PMPADDR4, &pmpaddr[4]);
126 CSR_READ(CSR_REG_PMPADDR5, &pmpaddr[5]);
127 CSR_READ(CSR_REG_PMPADDR6, &pmpaddr[6]);
128 CSR_READ(CSR_REG_PMPADDR7, &pmpaddr[7]);
129 CSR_READ(CSR_REG_PMPADDR8, &pmpaddr[8]);
130 CSR_READ(CSR_REG_PMPADDR9, &pmpaddr[9]);
131 CSR_READ(CSR_REG_PMPADDR10, &pmpaddr[10]);
132 CSR_READ(CSR_REG_PMPADDR11, &pmpaddr[11]);
133 CSR_READ(CSR_REG_PMPADDR12, &pmpaddr[12]);
134 CSR_READ(CSR_REG_PMPADDR13, &pmpaddr[13]);
135 CSR_READ(CSR_REG_PMPADDR14, &pmpaddr[14]);
136 CSR_READ(CSR_REG_PMPADDR15, &pmpaddr[15]);
139 CSR_READ(CSR_REG_PMPCFG0, &pmpcfg[0]);
140 CSR_READ(CSR_REG_PMPCFG1, &pmpcfg[1]);
141 CSR_READ(CSR_REG_PMPCFG2, &pmpcfg[2]);
142 CSR_READ(CSR_REG_PMPCFG3, &pmpcfg[3]);
145 CSR_READ(CSR_REG_MSECCFG, &mseccfg);
147 for (
int i = 0; i < 16; ++i) {
148 uint32_t mode = cfg[i] & EPMP_CFG_A_MASK;
149 uint32_t addr = pmpaddr[i];
151 if (mode == EPMP_CFG_A_NAPOT) {
153 addr = addr & ~(size - 1);
155 }
else if (mode == EPMP_CFG_A_TOR) {
156 size = (addr - pmpaddr[i - 1]) << 2;
157 }
else if (mode == EPMP_CFG_A_NA4) {
161 dbg_printf(
"%d: %x %s %c%c%c%c sz=%x\r\n", i, addr,
162 (mode == EPMP_CFG_A_TOR) ?
" TOR"
163 : (mode == EPMP_CFG_A_NA4) ?
" NA4"
164 : (mode == EPMP_CFG_A_NAPOT) ?
"NAPOT"
166 cfg[i] & EPMP_CFG_L ?
'L' :
'-', cfg[i] & EPMP_CFG_X ?
'X' :
'-',
167 cfg[i] & EPMP_CFG_W ?
'W' :
'-', cfg[i] & EPMP_CFG_R ?
'R' :
'-',
170 dbg_printf(
"mseccfg = %x\r\n", mseccfg);
173 void dbg_hexdump(
const void *data,
size_t len) {
174 const uint8_t *p = (
const uint8_t *)data;
184 dbg_printf(
"%p: ", p);
185 for (
size_t i = 0; i < 16 && j < len; ++p, ++i, ++j) {
187 hexbuf[i * 3 + 0] = kHexTable[val >> 4];
188 hexbuf[i * 3 + 1] = kHexTable[val & 15];
189 ascii[i] = (val >= 32 && val < 127) ? (
char)val :
'.';
191 dbg_printf(
"%s %s\r\n", hexbuf, ascii);