diff options
Diffstat (limited to 'sys/arm64/arm64/db_interface.c')
-rw-r--r-- | sys/arm64/arm64/db_interface.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/sys/arm64/arm64/db_interface.c b/sys/arm64/arm64/db_interface.c index dc0fa8ac5e1e..79e81b210f49 100644 --- a/sys/arm64/arm64/db_interface.c +++ b/sys/arm64/arm64/db_interface.c @@ -26,8 +26,6 @@ * SUCH DAMAGE. */ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/proc.h> #include <vm/vm.h> @@ -126,14 +124,20 @@ db_read_bytes(vm_offset_t addr, size_t size, char *data) if (ret == 0) { src = (const char *)addr; + + /* + * Perform a native-sized memory access, if possible. This + * enables reading from MMIO devices that don't support single + * byte access. + */ if (size == 8 && (addr & 7) == 0) { - tmp64 = *((const int *)src); + tmp64 = *((const uint64_t *)src); src = (const char *)&tmp64; } else if (size == 4 && (addr & 3) == 0) { - tmp32 = *((const int *)src); + tmp32 = *((const uint32_t *)src); src = (const char *)&tmp32; } else if (size == 2 && (addr & 1) == 0) { - tmp16 = *((const short *)src); + tmp16 = *((const uint16_t *)src); src = (const char *)&tmp16; } while (size-- > 0) @@ -151,7 +155,7 @@ int db_write_bytes(vm_offset_t addr, size_t size, char *data) { jmp_buf jb; - void *prev_jb; + void *prev_jb, *kaddr; char *dst; size_t i; int ret; @@ -159,7 +163,7 @@ db_write_bytes(vm_offset_t addr, size_t size, char *data) prev_jb = kdb_jmpbuf(jb); ret = setjmp(jb); if (ret == 0) { - if (!arm64_get_writable_addr(addr, &addr)) { + if (!arm64_get_writable_addr((void *)addr, &kaddr)) { ret = 1; } else { dst = (char *)addr; @@ -167,9 +171,11 @@ db_write_bytes(vm_offset_t addr, size_t size, char *data) *dst++ = *data++; dsb(ish); - /* Clean D-cache and invalidate I-cache */ - cpu_dcache_wb_range(addr, (vm_size_t)size); - cpu_icache_sync_range(addr, (vm_size_t)size); + /* + * Ensure the I & D cache are in sync if we wrote + * to executable memory. + */ + cpu_icache_sync_range(kaddr, size); } } (void)kdb_jmpbuf(prev_jb); |