Page MenuHomeFreeBSD

D32053.id95470.diff
No OneTemporary

D32053.id95470.diff

Index: sys/arm64/arm64/db_interface.c
===================================================================
--- sys/arm64/arm64/db_interface.c
+++ sys/arm64/arm64/db_interface.c
@@ -150,43 +150,38 @@
int
db_write_bytes(vm_offset_t addr, size_t size, char *data)
{
+ vm_paddr_t pa;
jmp_buf jb;
void *prev_jb;
char *dst;
+ size_t i;
int ret;
- uint64_t tmp64;
- uint32_t tmp32;
- uint16_t tmp16;
prev_jb = kdb_jmpbuf(jb);
ret = setjmp(jb);
if (ret == 0) {
- 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++;
+ dst = (char *)addr;
+ /* Check if the page is writable */
+ if (!PAR_SUCCESS(arm64_address_translate_s1e1w(addr))) {
+ /*
+ * The page is either not mapped or is read-only.
+ * Try via the DMAP region.
+ */
+ if (!pmap_klookup(addr, &pa) || !PHYS_IN_DMAP(pa)) {
+ ret = 1;
+ goto out;
+ }
+ dst = (char *)PHYS_TO_DMAP(pa);
}
+ for (i = 0; i < size; i++)
+ *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);
}
+out:
(void)kdb_jmpbuf(prev_jb);
return (ret);

File Metadata

Mime Type
text/plain
Expires
Sun, Feb 8, 10:39 PM (3 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28506449
Default Alt Text
D32053.id95470.diff (1 KB)

Event Timeline