* Write bytes to kernel address space for debugger. */
| 149 | * Write bytes to kernel address space for debugger. |
| 150 | */ |
| 151 | int |
| 152 | db_write_bytes(vm_offset_t addr, size_t size, char *data) |
| 153 | { |
| 154 | jmp_buf jb; |
| 155 | void *prev_jb; |
| 156 | char *dst; |
| 157 | int ret; |
| 158 | uint64_t tmp64; |
| 159 | uint32_t tmp32; |
| 160 | uint16_t tmp16; |
| 161 | |
| 162 | prev_jb = kdb_jmpbuf(jb); |
| 163 | ret = setjmp(jb); |
| 164 | if (ret == 0) { |
| 165 | if (size == 8 && (addr & 7) == 0) { |
| 166 | dst = (char *)&tmp64; |
| 167 | while (size-- > 0) |
| 168 | *dst++ = *data++; |
| 169 | *((uint64_t *)addr) = tmp64; |
| 170 | } else if (size == 4 && (addr & 3) == 0) { |
| 171 | dst = (char *)&tmp32; |
| 172 | while (size-- > 0) |
| 173 | *dst++ = *data++; |
| 174 | *((uint32_t *)addr) = tmp32; |
| 175 | } else if (size == 2 && (addr & 1) == 0) { |
| 176 | dst = (char *)&tmp16; |
| 177 | while (size-- > 0) |
| 178 | *dst++ = *data++; |
| 179 | *((uint32_t *)addr) = tmp16; |
| 180 | } else { |
| 181 | dst = (char *)addr; |
| 182 | while (size-- > 0) |
| 183 | *dst++ = *data++; |
| 184 | } |
| 185 | dsb(ish); |
| 186 | |
| 187 | /* Clean D-cache and invalidate I-cache */ |
| 188 | cpu_dcache_wb_range(addr, (vm_size_t)size); |
| 189 | cpu_icache_sync_range(addr, (vm_size_t)size); |
| 190 | } |
| 191 | (void)kdb_jmpbuf(prev_jb); |
| 192 | |
| 193 | return (ret); |
| 194 | } |
nothing calls this directly
no test coverage detected