Use native-sized accesses when accessing memory from kdb.

Not all MMIO mapped devices supports byte access.

MFC after:	4 weeks
This commit is contained in:
Michal Meloun 2020-06-19 16:26:42 +00:00
parent 1f446a117e
commit a67687fcd8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=362388

View File

@ -118,12 +118,25 @@ db_read_bytes(vm_offset_t addr, size_t size, char *data)
void *prev_jb;
const char *src;
int ret;
uint64_t tmp64;
uint32_t tmp32;
uint16_t tmp16;
prev_jb = kdb_jmpbuf(jb);
ret = setjmp(jb);
if (ret == 0) {
src = (const char *)addr;
if (size == 8 && (addr & 7) == 0) {
tmp64 = *((const int *)src);
src = (const char *)&tmp64;
} else if (size == 4 && (addr & 3) == 0) {
tmp32 = *((const int *)src);
src = (const char *)&tmp32;
} else if (size == 2 && (addr & 1) == 0) {
tmp16 = *((const short *)src);
src = (const char *)&tmp16;
}
while (size-- > 0)
*data++ = *src++;
}
@ -142,14 +155,33 @@ db_write_bytes(vm_offset_t addr, size_t size, char *data)
void *prev_jb;
char *dst;
int ret;
uint64_t tmp64;
uint32_t tmp32;
uint16_t tmp16;
prev_jb = kdb_jmpbuf(jb);
ret = setjmp(jb);
if (ret == 0) {
dst = (char *)addr;
while (size-- > 0)
*dst++ = *data++;
if (size == 8 && (addr & 7) == 0) {
dst = (char *)&tmp64;
while (size-- > 0)
*dst++ = *data++;
*((uint64_t *)addr) = tmp64;
} else if (size == 4 && (addr & 3) == 0) {
dst = (char *)&tmp32;
while (size-- > 0)
*dst++ = *data++;
*((uint32_t *)addr) = tmp32;
} else if (size == 2 && (addr & 1) == 0) {
dst = (char *)&tmp16;
while (size-- > 0)
*dst++ = *data++;
*((uint32_t *)addr) = tmp16;
} else {
dst = (char *)addr;
while (size-- > 0)
*dst++ = *data++;
}
dsb(ish);
/* Clean D-cache and invalidate I-cache */