quark_x10xx: add new target quark_x10xx
[openocd.git] / src / target / x86_32_common.c
1 /*
2 * Copyright(c) 2013 Intel Corporation.
3 *
4 * Adrian Burns (adrian.burns@intel.com)
5 * Thomas Faust (thomas.faust@intel.com)
6 * Ivan De Cesaris (ivan.de.cesaris@intel.com)
7 * Julien Carreno (julien.carreno@intel.com)
8 * Jeffrey Maxwell (jeffrey.r.maxwell@intel.com)
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of version 2 of the GNU General Public License as
12 * published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
22 *
23 * Contact Information:
24 * Intel Corporation
25 */
26
27 /*
28 * @file
29 * This implements generic x86 32 bit memory and breakpoint operations.
30 */
31
32 #ifdef HAVE_CONFIG_H
33 #include "config.h"
34 #endif
35
36 #include <helper/log.h>
37
38 #include "target.h"
39 #include "target_type.h"
40 #include "register.h"
41 #include "breakpoints.h"
42 #include "x86_32_common.h"
43
44 static int set_debug_regs(struct target *t, uint32_t address,
45 uint8_t bp_num, uint8_t bp_type, uint8_t bp_length);
46 static int unset_debug_regs(struct target *t, uint8_t bp_num);
47 static int read_mem(struct target *t, uint32_t size,
48 uint32_t addr, uint8_t *buf);
49 static int write_mem(struct target *t, uint32_t size,
50 uint32_t addr, const uint8_t *buf);
51 static int calcaddr_pyhsfromlin(struct target *t, uint32_t addr,
52 uint32_t *physaddr);
53 static int read_phys_mem(struct target *t, uint32_t phys_address,
54 uint32_t size, uint32_t count, uint8_t *buffer);
55 static int write_phys_mem(struct target *t, uint32_t phys_address,
56 uint32_t size, uint32_t count, const uint8_t *buffer);
57 static int set_breakpoint(struct target *target,
58 struct breakpoint *breakpoint);
59 static int unset_breakpoint(struct target *target,
60 struct breakpoint *breakpoint);
61 static int set_watchpoint(struct target *target,
62 struct watchpoint *watchpoint);
63 static int unset_watchpoint(struct target *target,
64 struct watchpoint *watchpoint);
65 static int read_hw_reg_to_cache(struct target *t, int num);
66 static int write_hw_reg_from_cache(struct target *t, int num);
67
68 int x86_32_get_gdb_reg_list(struct target *t,
69 struct reg **reg_list[], int *reg_list_size,
70 enum target_register_class reg_class)
71 {
72
73 struct x86_32_common *x86_32 = target_to_x86_32(t);
74 int i;
75 *reg_list_size = x86_32->cache->num_regs;
76 LOG_DEBUG("num_regs=%d, reg_class=%d", (*reg_list_size), reg_class);
77 *reg_list = malloc(sizeof(struct reg *) * (*reg_list_size));
78 if (*reg_list == NULL) {
79 LOG_ERROR("%s out of memory", __func__);
80 return ERROR_FAIL;
81 }
82 /* this will copy the values from our reg list to gdbs */
83 for (i = 0; i < (*reg_list_size); i++) {
84 (*reg_list)[i] = &x86_32->cache->reg_list[i];
85 LOG_DEBUG("value %s = %08" PRIx32, x86_32->cache->reg_list[i].name,
86 buf_get_u32(x86_32->cache->reg_list[i].value, 0, 32));
87 }
88 return ERROR_OK;
89 }
90
91 int x86_32_common_init_arch_info(struct target *t, struct x86_32_common *x86_32)
92 {
93 t->arch_info = x86_32;
94 x86_32->common_magic = X86_32_COMMON_MAGIC;
95 x86_32->num_hw_bpoints = MAX_DEBUG_REGS;
96 x86_32->hw_break_list = calloc(x86_32->num_hw_bpoints,
97 sizeof(struct x86_32_dbg_reg));
98 if (x86_32->hw_break_list == NULL) {
99 LOG_ERROR("%s out of memory", __func__);
100 return ERROR_FAIL;
101 }
102 x86_32->curr_tap = t->tap;
103 x86_32->fast_data_area = NULL;
104 x86_32->flush = 1;
105 x86_32->read_hw_reg_to_cache = read_hw_reg_to_cache;
106 x86_32->write_hw_reg_from_cache = write_hw_reg_from_cache;
107 return ERROR_OK;
108 }
109
110 int x86_32_common_mmu(struct target *t, int *enabled)
111 {
112 *enabled = true;
113 return ERROR_OK;
114 }
115
116 int x86_32_common_virt2phys(struct target *t, uint32_t address, uint32_t *physical)
117 {
118 struct x86_32_common *x86_32 = target_to_x86_32(t);
119
120 /*
121 * We need to ignore 'segmentation' for now, as OpenOCD can't handle
122 * segmented addresses.
123 * In protected mode that is almost OK, as (almost) any known OS is using
124 * flat segmentation. In real mode we use use the base of the DS segment,
125 * as we don't know better ...
126 */
127
128 uint32_t cr0 = buf_get_u32(x86_32->cache->reg_list[CR0].value, 0, 32);
129 if (!(cr0 & CR0_PG)) {
130 /* target halted in real mode */
131 /* TODO: needs validation !!! */
132 uint32_t dsb = buf_get_u32(x86_32->cache->reg_list[DSB].value, 0, 32);
133 *physical = dsb + address;
134
135 } else {
136 /* target halted in protected mode */
137 if (calcaddr_pyhsfromlin(t, address, physical) != ERROR_OK) {
138 LOG_ERROR("%s failed to calculate physical address from 0x%08" PRIx32,
139 __func__, address);
140 return ERROR_FAIL;
141 }
142 }
143 return ERROR_OK;
144 }
145
146 int x86_32_common_read_phys_mem(struct target *t, uint32_t phys_address,
147 uint32_t size, uint32_t count, uint8_t *buffer)
148 {
149 struct x86_32_common *x86_32 = target_to_x86_32(t);
150 int error;
151
152 error = read_phys_mem(t, phys_address, size, count, buffer);
153 if (error != ERROR_OK)
154 return error;
155
156 /* After reading memory from target, we must replace software breakpoints
157 * with the original instructions again.
158 */
159 struct swbp_mem_patch *iter = x86_32->swbbp_mem_patch_list;
160 while (iter != NULL) {
161 if (iter->physaddr >= phys_address && iter->physaddr < phys_address+(size*count)) {
162 uint32_t offset = iter->physaddr - phys_address;
163 buffer[offset] = iter->orig_byte;
164 }
165 iter = iter->next;
166 }
167 return ERROR_OK;
168 }
169
170 static int read_phys_mem(struct target *t, uint32_t phys_address,
171 uint32_t size, uint32_t count, uint8_t *buffer)
172 {
173 int retval = ERROR_OK;
174 bool pg_disabled = false;
175 LOG_DEBUG("addr=%08" PRIx32 ", size=%d, count=%d, buf=%p",
176 phys_address, size, count, buffer);
177 struct x86_32_common *x86_32 = target_to_x86_32(t);
178
179 if (check_not_halted(t))
180 return ERROR_TARGET_NOT_HALTED;
181 if (!count || !buffer || !phys_address) {
182 LOG_ERROR("%s invalid params count=%d, buf=%p, addr=%08" PRIx32,
183 __func__, count, buffer, phys_address);
184 return ERROR_COMMAND_ARGUMENT_INVALID;
185 }
186
187 /* to access physical memory, switch off the CR0.PG bit */
188 if (x86_32->is_paging_enabled(t)) {
189 retval = x86_32->disable_paging(t);
190 if (retval != ERROR_OK)
191 return retval;
192 pg_disabled = true;
193 }
194
195 for (uint32_t i = 0; i < count; i++) {
196 switch (size) {
197 case BYTE:
198 retval = read_mem(t, size, phys_address + i, buffer + i);
199 break;
200 case WORD:
201 retval = read_mem(t, size, phys_address + i * 2, buffer + i * 2);
202 break;
203 case DWORD:
204 retval = read_mem(t, size, phys_address + i * 4, buffer + i * 4);
205 break;
206 default:
207 LOG_ERROR("%s invalid read size", __func__);
208 break;
209 }
210 }
211 /* restore CR0.PG bit if needed (regardless of retval) */
212 if (pg_disabled) {
213 retval = x86_32->enable_paging(t);
214 if (retval != ERROR_OK)
215 return retval;
216 pg_disabled = true;
217 }
218 /* TODO: After reading memory from target, we must replace
219 * software breakpoints with the original instructions again.
220 * Solve this with the breakpoint fix
221 */
222 return retval;
223 }
224
225 int x86_32_common_write_phys_mem(struct target *t, uint32_t phys_address,
226 uint32_t size, uint32_t count, const uint8_t *buffer)
227 {
228 struct x86_32_common *x86_32 = target_to_x86_32(t);
229 int error = ERROR_OK;
230 uint8_t *newbuffer = NULL;
231
232 check_not_halted(t);
233 if (!count || !buffer || !phys_address) {
234 LOG_ERROR("%s invalid params count=%d, buf=%p, addr=%08" PRIx32,
235 __func__, count, buffer, phys_address);
236 return ERROR_COMMAND_ARGUMENT_INVALID;
237 }
238 /* Before writing memory to target, we must update software breakpoints
239 * with the new instructions and patch the memory buffer with the
240 * breakpoint instruction.
241 */
242 newbuffer = malloc(size*count);
243 if (newbuffer == NULL) {
244 LOG_ERROR("%s out of memory", __func__);
245 return ERROR_FAIL;
246 }
247 memcpy(newbuffer, buffer, size*count);
248 struct swbp_mem_patch *iter = x86_32->swbbp_mem_patch_list;
249 while (iter != NULL) {
250 if (iter->physaddr >= phys_address && iter->physaddr < phys_address+(size*count)) {
251 uint32_t offset = iter->physaddr - phys_address;
252 newbuffer[offset] = SW_BP_OPCODE;
253
254 /* update the breakpoint */
255 struct breakpoint *pbiter = t->breakpoints;
256 while (pbiter != NULL && pbiter->unique_id != iter->swbp_unique_id)
257 pbiter = pbiter->next;
258 if (pbiter)
259 pbiter->orig_instr[0] = buffer[offset];
260 }
261 iter = iter->next;
262 }
263
264 error = write_phys_mem(t, phys_address, size, count, newbuffer);
265 free(newbuffer);
266 return error;
267 }
268
269 static int write_phys_mem(struct target *t, uint32_t phys_address,
270 uint32_t size, uint32_t count, const uint8_t *buffer)
271 {
272 int retval = ERROR_OK;
273 bool pg_disabled = false;
274 struct x86_32_common *x86_32 = target_to_x86_32(t);
275 LOG_DEBUG("addr=%08" PRIx32 ", size=%d, count=%d, buf=%p",
276 phys_address, size, count, buffer);
277
278 check_not_halted(t);
279 if (!count || !buffer || !phys_address) {
280 LOG_ERROR("%s invalid params count=%d, buf=%p, addr=%08" PRIx32,
281 __func__, count, buffer, phys_address);
282 return ERROR_COMMAND_ARGUMENT_INVALID;
283 }
284 /* TODO: Before writing memory to target, we must update
285 * software breakpoints with the new instructions and
286 * patch the memory buffer with the breakpoint instruction.
287 * Solve this with the breakpoint fix
288 */
289
290 /* to access physical memory, switch off the CR0.PG bit */
291 if (x86_32->is_paging_enabled(t)) {
292 retval = x86_32->disable_paging(t);
293 if (retval != ERROR_OK)
294 return retval;
295 pg_disabled = true;
296 }
297 for (uint32_t i = 0; i < count; i++) {
298 switch (size) {
299 case BYTE:
300 retval = write_mem(t, size, phys_address + i, buffer + i);
301 break;
302 case WORD:
303 retval = write_mem(t, size, phys_address + i * 2, buffer + i * 2);
304 break;
305 case DWORD:
306 retval = write_mem(t, size, phys_address + i * 4, buffer + i * 4);
307 break;
308 default:
309 LOG_DEBUG("invalid read size");
310 break;
311 }
312 }
313 /* restore CR0.PG bit if needed (regardless of retval) */
314 if (pg_disabled) {
315 retval = x86_32->enable_paging(t);
316 if (retval != ERROR_OK)
317 return retval;
318 }
319 return retval;
320 }
321
322 static int read_mem(struct target *t, uint32_t size,
323 uint32_t addr, uint8_t *buf)
324 {
325 struct x86_32_common *x86_32 = target_to_x86_32(t);
326
327 /* if CS.D bit=1 then its a 32 bit code segment, else 16 */
328 bool use32 = (buf_get_u32(x86_32->cache->reg_list[CSAR].value, 0, 32)) & CSAR_D;
329 int retval = x86_32->write_hw_reg(t, EAX, addr, 0);
330 if (retval != ERROR_OK) {
331 LOG_ERROR("%s error write EAX", __func__);
332 return retval;
333 }
334
335 switch (size) {
336 case BYTE:
337 if (use32)
338 retval = x86_32->submit_instruction(t, MEMRDB32);
339 else
340 retval = x86_32->submit_instruction(t, MEMRDB16);
341 break;
342 case WORD:
343 if (use32)
344 retval = x86_32->submit_instruction(t, MEMRDH32);
345 else
346 retval = x86_32->submit_instruction(t, MEMRDH16);
347 break;
348 case DWORD:
349 if (use32)
350 retval = x86_32->submit_instruction(t, MEMRDW32);
351 else
352 retval = x86_32->submit_instruction(t, MEMRDW16);
353 break;
354 default:
355 LOG_ERROR("%s invalid read mem size", __func__);
356 break;
357 }
358
359 /* read_hw_reg() will write to 4 bytes (uint32_t)
360 * Watch out, the buffer passed into read_mem() might be 1 or 2 bytes.
361 */
362 uint32_t regval;
363 retval = x86_32->read_hw_reg(t, EDX, &regval, 0);
364
365 if (retval != ERROR_OK) {
366 LOG_ERROR("%s error read EDX", __func__);
367 return retval;
368 }
369 for (uint8_t i = 0; i < size; i++)
370 buf[i] = (regval >> (i*8)) & 0x000000FF;
371
372 retval = x86_32->transaction_status(t);
373 if (retval != ERROR_OK) {
374 LOG_ERROR("%s error on mem read", __func__);
375 return retval;
376 }
377 return retval;
378 }
379
380 static int write_mem(struct target *t, uint32_t size,
381 uint32_t addr, const uint8_t *buf)
382 {
383 uint32_t i = 0;
384 uint32_t buf4bytes = 0;
385 int retval = ERROR_OK;
386 struct x86_32_common *x86_32 = target_to_x86_32(t);
387
388 for (i = 0; i < size; ++i) {
389 buf4bytes = buf4bytes << 8; /* first time we only shift 0s */
390 buf4bytes += buf[(size-1)-i]; /* it was hard to write, should be hard to read! */
391 }
392 /* if CS.D bit=1 then its a 32 bit code segment, else 16 */
393 bool use32 = (buf_get_u32(x86_32->cache->reg_list[CSAR].value, 0, 32)) & CSAR_D;
394 retval = x86_32->write_hw_reg(t, EAX, addr, 0);
395 if (retval != ERROR_OK) {
396 LOG_ERROR("%s error write EAX", __func__);
397 return retval;
398 }
399
400 /* write_hw_reg() will write to 4 bytes (uint32_t)
401 * Watch out, the buffer passed into write_mem() might be 1 or 2 bytes.
402 */
403 retval = x86_32->write_hw_reg(t, EDX, buf4bytes, 0);
404 if (retval != ERROR_OK) {
405 LOG_ERROR("%s error write EDX", __func__);
406 return retval;
407 }
408 switch (size) {
409 case BYTE:
410 if (use32)
411 retval = x86_32->submit_instruction(t, MEMWRB32);
412 else
413 retval = x86_32->submit_instruction(t, MEMWRB16);
414 break;
415 case WORD:
416 if (use32)
417 retval = x86_32->submit_instruction(t, MEMWRH32);
418 else
419 retval = x86_32->submit_instruction(t, MEMWRH16);
420 break;
421 case DWORD:
422 if (use32)
423 retval = x86_32->submit_instruction(t, MEMWRW32);
424 else
425 retval = x86_32->submit_instruction(t, MEMWRW16);
426 break;
427 default:
428 LOG_ERROR("%s invalid write mem size", __func__);
429 return ERROR_FAIL;
430 }
431 retval = x86_32->transaction_status(t);
432 if (retval != ERROR_OK) {
433 LOG_ERROR("%s error on mem write", __func__);
434 return retval;
435 }
436 return retval;
437 }
438
439 int calcaddr_pyhsfromlin(struct target *t, uint32_t addr, uint32_t *physaddr)
440 {
441 uint8_t entry_buffer[8];
442
443 if (physaddr == NULL || t == NULL)
444 return ERROR_FAIL;
445
446 struct x86_32_common *x86_32 = target_to_x86_32(t);
447
448 /* The 'user-visible' CR0.PG should be set - otherwise the function shouldn't be called
449 * (Don't check the CR0.PG on the target, this might be temporally disabled at this point)
450 */
451 uint32_t cr0 = buf_get_u32(x86_32->cache->reg_list[CR0].value, 0, 32);
452 if (!(cr0 & CR0_PG)) {
453 /* you are wrong in this function, never mind */
454 *physaddr = addr;
455 return ERROR_OK;
456 }
457
458 uint32_t cr4 = buf_get_u32(x86_32->cache->reg_list[CR4].value, 0, 32);
459 bool isPAE = cr4 & 0x00000020; /* PAE - Physical Address Extension */
460
461 uint32_t cr3 = buf_get_u32(x86_32->cache->reg_list[CR3].value, 0, 32);
462 if (isPAE) {
463 uint32_t pdpt_base = cr3 & 0xFFFFF000; /* lower 12 bits of CR3 must always be 0 */
464 uint32_t pdpt_index = (addr & 0xC0000000) >> 30; /* A[31:30] index to PDPT */
465 uint32_t pdpt_addr = pdpt_base + (8 * pdpt_index);
466 if (x86_32_common_read_phys_mem(t, pdpt_addr, 4, 2, entry_buffer) != ERROR_OK) {
467 LOG_ERROR("%s couldn't read page directory pointer table entry at 0x%08" PRIx32,
468 __func__, pdpt_addr);
469 return ERROR_FAIL;
470 }
471 uint64_t pdpt_entry = target_buffer_get_u64(t, entry_buffer);
472 if (!(pdpt_entry & 0x0000000000000001)) {
473 LOG_ERROR("%s page directory pointer table entry at 0x%08" PRIx32 " is not present",
474 __func__, pdpt_addr);
475 return ERROR_FAIL;
476 }
477
478 uint32_t pd_base = pdpt_entry & 0xFFFFF000; /* A[31:12] is PageTable/Page Base Address */
479 uint32_t pd_index = (addr & 0x3FE00000) >> 21; /* A[29:21] index to PD entry with PAE */
480 uint32_t pd_addr = pd_base + (8 * pd_index);
481 if (x86_32_common_read_phys_mem(t, pd_addr, 4, 2, entry_buffer) != ERROR_OK) {
482 LOG_ERROR("%s couldn't read page directory entry at 0x%08" PRIx32,
483 __func__, pd_addr);
484 return ERROR_FAIL;
485 }
486 uint64_t pd_entry = target_buffer_get_u64(t, entry_buffer);
487 if (!(pd_entry & 0x0000000000000001)) {
488 LOG_ERROR("%s page directory entry at 0x%08" PRIx32 " is not present",
489 __func__, pd_addr);
490 return ERROR_FAIL;
491 }
492
493 /* PS bit in PD entry is indicating 4KB or 2MB page size */
494 if (pd_entry & 0x0000000000000080) {
495
496 uint32_t page_base = (uint32_t)(pd_entry & 0x00000000FFE00000); /* [31:21] */
497 uint32_t offset = addr & 0x001FFFFF; /* [20:0] */
498 *physaddr = page_base + offset;
499 return ERROR_OK;
500
501 } else {
502
503 uint32_t pt_base = (uint32_t)(pd_entry & 0x00000000FFFFF000); /*[31:12]*/
504 uint32_t pt_index = (addr & 0x001FF000) >> 12; /*[20:12]*/
505 uint32_t pt_addr = pt_base + (8 * pt_index);
506 if (x86_32_common_read_phys_mem(t, pt_addr, 4, 2, entry_buffer) != ERROR_OK) {
507 LOG_ERROR("%s couldn't read page table entry at 0x%08" PRIx32, __func__, pt_addr);
508 return ERROR_FAIL;
509 }
510 uint64_t pt_entry = target_buffer_get_u64(t, entry_buffer);
511 if (!(pt_entry & 0x0000000000000001)) {
512 LOG_ERROR("%s page table entry at 0x%08" PRIx32 " is not present", __func__, pt_addr);
513 return ERROR_FAIL;
514 }
515
516 uint32_t page_base = (uint32_t)(pt_entry & 0x00000000FFFFF000); /*[31:12]*/
517 uint32_t offset = addr & 0x00000FFF; /*[11:0]*/
518 *physaddr = page_base + offset;
519 return ERROR_OK;
520 }
521 } else {
522 uint32_t pd_base = cr3 & 0xFFFFF000; /* lower 12 bits of CR3 must always be 0 */
523 uint32_t pd_index = (addr & 0xFFC00000) >> 22; /* A[31:22] index to PD entry */
524 uint32_t pd_addr = pd_base + (4 * pd_index);
525 if (x86_32_common_read_phys_mem(t, pd_addr, 4, 1, entry_buffer) != ERROR_OK) {
526 LOG_ERROR("%s couldn't read page directory entry at 0x%08" PRIx32, __func__, pd_addr);
527 return ERROR_FAIL;
528 }
529 uint32_t pd_entry = target_buffer_get_u32(t, entry_buffer);
530 if (!(pd_entry & 0x00000001)) {
531 LOG_ERROR("%s page directory entry at 0x%08" PRIx32 " is not present", __func__, pd_addr);
532 return ERROR_FAIL;
533 }
534
535 /* Bit 7 in page directory entry is page size.
536 */
537 if (pd_entry & 0x00000080) {
538 /* 4MB pages */
539 uint32_t page_base = pd_entry & 0xFFC00000;
540 *physaddr = page_base + (addr & 0x003FFFFF);
541
542 } else {
543 /* 4KB pages */
544 uint32_t pt_base = pd_entry & 0xFFFFF000; /* A[31:12] is PageTable/Page Base Address */
545 uint32_t pt_index = (addr & 0x003FF000) >> 12; /* A[21:12] index to page table entry */
546 uint32_t pt_addr = pt_base + (4 * pt_index);
547 if (x86_32_common_read_phys_mem(t, pt_addr, 4, 1, entry_buffer) != ERROR_OK) {
548 LOG_ERROR("%s couldn't read page table entry at 0x%08" PRIx32, __func__, pt_addr);
549 return ERROR_FAIL;
550 }
551 uint32_t pt_entry = target_buffer_get_u32(t, entry_buffer);
552 if (!(pt_entry & 0x00000001)) {
553 LOG_ERROR("%s page table entry at 0x%08" PRIx32 " is not present", __func__, pt_addr);
554 return ERROR_FAIL;
555 }
556 uint32_t page_base = pt_entry & 0xFFFFF000; /* A[31:12] is PageTable/Page Base Address */
557 *physaddr = page_base + (addr & 0x00000FFF); /* A[11:0] offset to 4KB page in linear address */
558 }
559 }
560 return ERROR_OK;
561 }
562
563 int x86_32_common_read_memory(struct target *t, uint32_t addr,
564 uint32_t size, uint32_t count, uint8_t *buf)
565 {
566 int retval = ERROR_OK;
567 struct x86_32_common *x86_32 = target_to_x86_32(t);
568 LOG_DEBUG("addr=%08" PRIx32 ", size=%d, count=%d, buf=%p",
569 addr, size, count, buf);
570 check_not_halted(t);
571 if (!count || !buf || !addr) {
572 LOG_ERROR("%s invalid params count=%d, buf=%p, addr=%08" PRIx32,
573 __func__, count, buf, addr);
574 return ERROR_COMMAND_ARGUMENT_INVALID;
575 }
576
577 if (x86_32->is_paging_enabled(t)) {
578 /* all memory accesses from debugger must be physical (CR0.PG == 0)
579 * conversion to physical address space needed
580 */
581 retval = x86_32->disable_paging(t);
582 if (retval != ERROR_OK)
583 return retval;
584 uint32_t physaddr = 0;
585 if (calcaddr_pyhsfromlin(t, addr, &physaddr) != ERROR_OK) {
586 LOG_ERROR("%s failed to calculate physical address from 0x%08" PRIx32, __func__, addr);
587 retval = ERROR_FAIL;
588 }
589 /* TODO: !!! Watch out for page boundaries
590 * for every 4kB, the physical address has to be re-calculated
591 * This should be fixed together with bulk memory reads
592 */
593
594 if (retval == ERROR_OK
595 && x86_32_common_read_phys_mem(t, physaddr, size, count, buf) != ERROR_OK) {
596 LOG_ERROR("%s failed to read memory from physical address 0x%08" PRIx32, __func__, physaddr);
597 retval = ERROR_FAIL;
598 }
599 /* restore PG bit if it was cleared prior (regardless of retval) */
600 retval = x86_32->enable_paging(t);
601 if (retval != ERROR_OK)
602 return retval;
603 } else {
604 /* paging is off - linear address is physical address */
605 if (x86_32_common_read_phys_mem(t, addr, size, count, buf) != ERROR_OK) {
606 LOG_ERROR("%s failed to read memory from address 0%08" PRIx32, __func__, addr);
607 retval = ERROR_FAIL;
608 }
609 }
610
611 return retval;
612 }
613
614 int x86_32_common_write_memory(struct target *t, uint32_t addr,
615 uint32_t size, uint32_t count, const uint8_t *buf)
616 {
617 int retval = ERROR_OK;
618 struct x86_32_common *x86_32 = target_to_x86_32(t);
619 LOG_DEBUG("addr=%08" PRIx32 ", size=%d, count=%d, buf=%p",
620 addr, size, count, buf);
621 check_not_halted(t);
622 if (!count || !buf || !addr) {
623 LOG_ERROR("%s invalid params count=%d, buf=%p, addr=%08" PRIx32,
624 __func__, count, buf, addr);
625 return ERROR_COMMAND_ARGUMENT_INVALID;
626 }
627 if (x86_32->is_paging_enabled(t)) {
628 /* all memory accesses from debugger must be physical (CR0.PG == 0)
629 * conversion to physical address space needed
630 */
631 retval = x86_32->disable_paging(t);
632 if (retval != ERROR_OK)
633 return retval;
634 uint32_t physaddr = 0;
635 if (calcaddr_pyhsfromlin(t, addr, &physaddr) != ERROR_OK) {
636 LOG_ERROR("%s failed to calculate physical address from 0x%08" PRIx32,
637 __func__, addr);
638 retval = ERROR_FAIL;
639 }
640 /* TODO: !!! Watch out for page boundaries
641 * for every 4kB, the physical address has to be re-calculated
642 * This should be fixed together with bulk memory reads
643 */
644 if (retval == ERROR_OK
645 && x86_32_common_write_phys_mem(t, physaddr, size, count, buf) != ERROR_OK) {
646 LOG_ERROR("%s failed to write memory to physical address 0x%08" PRIx32,
647 __func__, physaddr);
648 retval = ERROR_FAIL;
649 }
650 /* restore PG bit if it was cleared prior (regardless of retval) */
651 retval = x86_32->enable_paging(t);
652 if (retval != ERROR_OK)
653 return retval;
654 } else {
655
656 /* paging is off - linear address is physical address */
657 if (x86_32_common_write_phys_mem(t, addr, size, count, buf) != ERROR_OK) {
658 LOG_ERROR("%s failed to write memory to address 0x%08" PRIx32,
659 __func__, addr);
660 retval = ERROR_FAIL;
661 }
662 }
663 return retval;
664 }
665
666 int x86_32_common_read_io(struct target *t, uint32_t addr,
667 uint32_t size, uint8_t *buf)
668 {
669 struct x86_32_common *x86_32 = target_to_x86_32(t);
670 /* if CS.D bit=1 then its a 32 bit code segment, else 16 */
671 bool use32 = (buf_get_u32(x86_32->cache->reg_list[CSAR].value, 0, 32)) & CSAR_D;
672 int retval = ERROR_FAIL;
673 LOG_DEBUG("addr=%08" PRIx32 ", size=%d, buf=%p", addr, size, buf);
674 check_not_halted(t);
675 if (!buf || !addr) {
676 LOG_ERROR("%s invalid params buf=%p, addr=%08" PRIx32, __func__, buf, addr);
677 return retval;
678 }
679 retval = x86_32->write_hw_reg(t, EDX, addr, 0);
680 if (retval != ERROR_OK) {
681 LOG_ERROR("%s error EDX write", __func__);
682 return retval;
683 }
684 switch (size) {
685 case BYTE:
686 if (use32)
687 retval = x86_32->submit_instruction(t, IORDB32);
688 else
689 retval = x86_32->submit_instruction(t, IORDB16);
690 break;
691 case WORD:
692 if (use32)
693 retval = x86_32->submit_instruction(t, IORDH32);
694 else
695 retval = x86_32->submit_instruction(t, IORDH16);
696 break;
697 case DWORD:
698 if (use32)
699 retval = x86_32->submit_instruction(t, IORDW32);
700 else
701 retval = x86_32->submit_instruction(t, IORDW16);
702 break;
703 default:
704 LOG_ERROR("%s invalid read io size", __func__);
705 return ERROR_FAIL;
706 }
707 uint32_t regval = 0;
708 retval = x86_32->read_hw_reg(t, EAX, &regval, 0);
709 if (retval != ERROR_OK) {
710 LOG_ERROR("%s error on read EAX", __func__);
711 return retval;
712 }
713 for (uint8_t i = 0; i < size; i++)
714 buf[i] = (regval >> (i*8)) & 0x000000FF;
715 retval = x86_32->transaction_status(t);
716 if (retval != ERROR_OK) {
717 LOG_ERROR("%s error on io read", __func__);
718 return retval;
719 }
720 return retval;
721 }
722
723 int x86_32_common_write_io(struct target *t, uint32_t addr,
724 uint32_t size, const uint8_t *buf)
725 {
726 struct x86_32_common *x86_32 = target_to_x86_32(t);
727 /* if CS.D bit=1 then its a 32 bit code segment, else 16 */
728 bool use32 = (buf_get_u32(x86_32->cache->reg_list[CSAR].value, 0, 32)) & CSAR_D;
729 LOG_DEBUG("addr=%08" PRIx32 ", size=%d, buf=%p", addr, size, buf);
730 check_not_halted(t);
731 int retval = ERROR_FAIL;
732 if (!buf || !addr) {
733 LOG_ERROR("%s invalid params buf=%p, addr=%08" PRIx32, __func__, buf, addr);
734 return retval;
735 }
736 /* no do the write */
737 retval = x86_32->write_hw_reg(t, EDX, addr, 0);
738 if (retval != ERROR_OK) {
739 LOG_ERROR("%s error on EDX write", __func__);
740 return retval;
741 }
742 uint32_t regval = 0;
743 for (uint8_t i = 0; i < size; i++)
744 regval += (buf[i] << (i*8));
745 retval = x86_32->write_hw_reg(t, EAX, regval, 0);
746 if (retval != ERROR_OK) {
747 LOG_ERROR("%s error on EAX write", __func__);
748 return retval;
749 }
750 switch (size) {
751 case BYTE:
752 if (use32)
753 retval = x86_32->submit_instruction(t, IOWRB32);
754 else
755 retval = x86_32->submit_instruction(t, IOWRB16);
756 break;
757 case WORD:
758 if (use32)
759 retval = x86_32->submit_instruction(t, IOWRH32);
760 else
761 retval = x86_32->submit_instruction(t, IOWRH16);
762 break;
763 case DWORD:
764 if (use32)
765 retval = x86_32->submit_instruction(t, IOWRW32);
766 else
767 retval = x86_32->submit_instruction(t, IOWRW16);
768 break;
769 default:
770 LOG_ERROR("%s invalid write io size", __func__);
771 return ERROR_FAIL;
772 }
773 retval = x86_32->transaction_status(t);
774 if (retval != ERROR_OK) {
775 LOG_ERROR("%s error on io write", __func__);
776 return retval;
777 }
778 return retval;
779 }
780
781 int x86_32_common_add_watchpoint(struct target *t, struct watchpoint *wp)
782 {
783 check_not_halted(t);
784 /* set_watchpoint() will return ERROR_TARGET_RESOURCE_NOT_AVAILABLE if all
785 * hardware registers are gone
786 */
787 return set_watchpoint(t, wp);
788 }
789
790 int x86_32_common_remove_watchpoint(struct target *t, struct watchpoint *wp)
791 {
792 if (check_not_halted(t))
793 return ERROR_TARGET_NOT_HALTED;
794 if (wp->set)
795 unset_watchpoint(t, wp);
796 return ERROR_OK;
797 }
798
799 int x86_32_common_add_breakpoint(struct target *t, struct breakpoint *bp)
800 {
801 LOG_DEBUG("type=%d, addr=%08" PRIx32, bp->type, bp->address);
802 if (check_not_halted(t))
803 return ERROR_TARGET_NOT_HALTED;
804 /* set_breakpoint() will return ERROR_TARGET_RESOURCE_NOT_AVAILABLE if all
805 * hardware registers are gone (for hardware breakpoints)
806 */
807 return set_breakpoint(t, bp);
808 }
809
810 int x86_32_common_remove_breakpoint(struct target *t, struct breakpoint *bp)
811 {
812 LOG_DEBUG("type=%d, addr=%08" PRIx32, bp->type, bp->address);
813 if (check_not_halted(t))
814 return ERROR_TARGET_NOT_HALTED;
815 if (bp->set)
816 unset_breakpoint(t, bp);
817
818 return ERROR_OK;
819 }
820
821 static int set_debug_regs(struct target *t, uint32_t address,
822 uint8_t bp_num, uint8_t bp_type, uint8_t bp_length)
823 {
824 struct x86_32_common *x86_32 = target_to_x86_32(t);
825 LOG_DEBUG("addr=%08" PRIx32 ", bp_num=%d, bp_type=%d, pb_length=%d",
826 address, bp_num, bp_type, bp_length);
827
828 /* DR7 - set global enable */
829 uint32_t dr7 = buf_get_u32(x86_32->cache->reg_list[DR7].value, 0, 32);
830
831 if (bp_length != 1 && bp_length != 2 && bp_length != 4)
832 return ERROR_FAIL;
833
834 if (DR7_BP_FREE(dr7, bp_num))
835 DR7_GLOBAL_ENABLE(dr7, bp_num);
836 else {
837 LOG_ERROR("%s dr7 error, already enabled, val=%08" PRIx32, __func__, dr7);
838 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
839 }
840
841 switch (bp_type) {
842 case 0:
843 /* 00 - only on instruction execution */
844 DR7_SET_EXE(dr7, bp_num);
845 DR7_SET_LENGTH(dr7, bp_num, bp_length);
846 break;
847 case 1:
848 /* 01 - only on data writes */
849 DR7_SET_WRITE(dr7, bp_num);
850 DR7_SET_LENGTH(dr7, bp_num, bp_length);
851 break;
852 case 2:
853 /* 10 UNSUPPORTED - an I/O read and I/O write */
854 LOG_ERROR("%s unsupported feature bp_type=%d", __func__, bp_type);
855 return ERROR_FAIL;
856 break;
857 case 3:
858 /* on data read or data write */
859 DR7_SET_ACCESS(dr7, bp_num);
860 DR7_SET_LENGTH(dr7, bp_num, bp_length);
861 break;
862 default:
863 LOG_ERROR("%s invalid request [only 0-3] bp_type=%d", __func__, bp_type);
864 return ERROR_FAIL;
865 }
866
867 /* update regs in the reg cache ready to be written to hardware
868 * when we exit PM
869 */
870 buf_set_u32(x86_32->cache->reg_list[bp_num+DR0].value, 0, 32, address);
871 x86_32->cache->reg_list[bp_num+DR0].dirty = 1;
872 x86_32->cache->reg_list[bp_num+DR0].valid = 1;
873 buf_set_u32(x86_32->cache->reg_list[DR6].value, 0, 32, PM_DR6);
874 x86_32->cache->reg_list[DR6].dirty = 1;
875 x86_32->cache->reg_list[DR6].valid = 1;
876 buf_set_u32(x86_32->cache->reg_list[DR7].value, 0, 32, dr7);
877 x86_32->cache->reg_list[DR7].dirty = 1;
878 x86_32->cache->reg_list[DR7].valid = 1;
879 return ERROR_OK;
880 }
881
882 static int unset_debug_regs(struct target *t, uint8_t bp_num)
883 {
884 struct x86_32_common *x86_32 = target_to_x86_32(t);
885 LOG_DEBUG("bp_num=%d", bp_num);
886
887 uint32_t dr7 = buf_get_u32(x86_32->cache->reg_list[DR7].value, 0, 32);
888
889 if (!(DR7_BP_FREE(dr7, bp_num))) {
890 DR7_GLOBAL_DISABLE(dr7, bp_num);
891 } else {
892 LOG_ERROR("%s dr7 error, not enabled, val=%08" PRIx32, __func__, dr7);
893 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
894 }
895 /* this will clear rw and len bits */
896 DR7_RESET_RWLEN_BITS(dr7, bp_num);
897
898 /* update regs in the reg cache ready to be written to hardware
899 * when we exit PM
900 */
901 buf_set_u32(x86_32->cache->reg_list[bp_num+DR0].value, 0, 32, 0);
902 x86_32->cache->reg_list[bp_num+DR0].dirty = 1;
903 x86_32->cache->reg_list[bp_num+DR0].valid = 1;
904 buf_set_u32(x86_32->cache->reg_list[DR6].value, 0, 32, PM_DR6);
905 x86_32->cache->reg_list[DR6].dirty = 1;
906 x86_32->cache->reg_list[DR6].valid = 1;
907 buf_set_u32(x86_32->cache->reg_list[DR7].value, 0, 32, dr7);
908 x86_32->cache->reg_list[DR7].dirty = 1;
909 x86_32->cache->reg_list[DR7].valid = 1;
910 return ERROR_OK;
911 }
912
913 static int set_hwbp(struct target *t, struct breakpoint *bp)
914 {
915 struct x86_32_common *x86_32 = target_to_x86_32(t);
916 struct x86_32_dbg_reg *debug_reg_list = x86_32->hw_break_list;
917 uint8_t hwbp_num = 0;
918
919 while (debug_reg_list[hwbp_num].used && (hwbp_num < x86_32->num_hw_bpoints))
920 hwbp_num++;
921 if (hwbp_num >= x86_32->num_hw_bpoints) {
922 LOG_ERROR("%s no free hw breakpoint bpid=%d", __func__, bp->unique_id);
923 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
924 }
925 if (set_debug_regs(t, bp->address, hwbp_num, DR7_BP_EXECUTE, 1) != ERROR_OK)
926 return ERROR_FAIL;
927 bp->set = hwbp_num + 1;
928 debug_reg_list[hwbp_num].used = 1;
929 debug_reg_list[hwbp_num].bp_value = bp->address;
930 LOG_USER("%s hardware breakpoint %d set at 0x%08" PRIx32 " (hwreg=%d)", __func__,
931 bp->unique_id, debug_reg_list[hwbp_num].bp_value, hwbp_num);
932 return ERROR_OK;
933 }
934
935 static int unset_hwbp(struct target *t, struct breakpoint *bp)
936 {
937 struct x86_32_common *x86_32 = target_to_x86_32(t);
938 struct x86_32_dbg_reg *debug_reg_list = x86_32->hw_break_list;
939 int hwbp_num = bp->set - 1;
940
941 if ((hwbp_num < 0) || (hwbp_num >= x86_32->num_hw_bpoints)) {
942 LOG_ERROR("%s invalid breakpoint number=%d, bpid=%d",
943 __func__, hwbp_num, bp->unique_id);
944 return ERROR_OK;
945 }
946
947 if (unset_debug_regs(t, hwbp_num) != ERROR_OK)
948 return ERROR_FAIL;
949 debug_reg_list[hwbp_num].used = 0;
950 debug_reg_list[hwbp_num].bp_value = 0;
951
952 LOG_USER("%s hardware breakpoint %d removed from 0x%08" PRIx32 " (hwreg=%d)",
953 __func__, bp->unique_id, bp->address, hwbp_num);
954 return ERROR_OK;
955 }
956
957 static int set_swbp(struct target *t, struct breakpoint *bp)
958 {
959 struct x86_32_common *x86_32 = target_to_x86_32(t);
960 LOG_DEBUG("id %d", bp->unique_id);
961 uint32_t physaddr;
962 uint8_t opcode = SW_BP_OPCODE;
963 uint8_t readback;
964
965 if (calcaddr_pyhsfromlin(t, bp->address, &physaddr) != ERROR_OK)
966 return ERROR_FAIL;
967 if (read_phys_mem(t, physaddr, 1, 1, bp->orig_instr))
968 return ERROR_FAIL;
969
970 LOG_DEBUG("set software breakpoint - orig byte=%02" PRIx8 "", *bp->orig_instr);
971
972 /* just write the instruction trap byte */
973 if (write_phys_mem(t, physaddr, 1, 1, &opcode))
974 return ERROR_FAIL;
975
976 /* verify that this is not invalid/read-only memory */
977 if (read_phys_mem(t, physaddr, 1, 1, &readback))
978 return ERROR_FAIL;
979
980 if (readback != SW_BP_OPCODE) {
981 LOG_ERROR("%s software breakpoint error at 0x%08" PRIx32 ", check memory",
982 __func__, bp->address);
983 LOG_ERROR("%s readback=%02" PRIx8 " orig=%02" PRIx8 "",
984 __func__, readback, *bp->orig_instr);
985 return ERROR_FAIL;
986 }
987 bp->set = SW_BP_OPCODE; /* just non 0 */
988
989 /* add the memory patch */
990 struct swbp_mem_patch *new_patch = malloc(sizeof(struct swbp_mem_patch));
991 if (new_patch == NULL) {
992 LOG_ERROR("%s out of memory", __func__);
993 return ERROR_FAIL;
994 }
995 new_patch->next = NULL;
996 new_patch->orig_byte = *bp->orig_instr;
997 new_patch->physaddr = physaddr;
998 new_patch->swbp_unique_id = bp->unique_id;
999
1000 struct swbp_mem_patch *addto = x86_32->swbbp_mem_patch_list;
1001 if (addto == NULL)
1002 x86_32->swbbp_mem_patch_list = new_patch;
1003 else {
1004 while (addto->next != NULL)
1005 addto = addto->next;
1006 addto->next = new_patch;
1007 }
1008 LOG_USER("%s software breakpoint %d set at 0x%08" PRIx32,
1009 __func__, bp->unique_id, bp->address);
1010 return ERROR_OK;
1011 }
1012
1013 static int unset_swbp(struct target *t, struct breakpoint *bp)
1014 {
1015 struct x86_32_common *x86_32 = target_to_x86_32(t);
1016 LOG_DEBUG("id %d", bp->unique_id);
1017 uint32_t physaddr;
1018 uint8_t current_instr;
1019
1020 /* check that user program has not modified breakpoint instruction */
1021 if (calcaddr_pyhsfromlin(t, bp->address, &physaddr) != ERROR_OK)
1022 return ERROR_FAIL;
1023 if (read_phys_mem(t, physaddr, 1, 1, &current_instr))
1024 return ERROR_FAIL;
1025
1026 if (current_instr == SW_BP_OPCODE) {
1027 if (write_phys_mem(t, physaddr, 1, 1, bp->orig_instr))
1028 return ERROR_FAIL;
1029 } else {
1030 LOG_ERROR("%s software breakpoint remove error at 0x%08" PRIx32 ", check memory",
1031 __func__, bp->address);
1032 LOG_ERROR("%s current=%02" PRIx8 " orig=%02" PRIx8 "",
1033 __func__, current_instr, *bp->orig_instr);
1034 return ERROR_FAIL;
1035 }
1036
1037 /* remove from patch */
1038 struct swbp_mem_patch *iter = x86_32->swbbp_mem_patch_list;
1039 if (iter != NULL) {
1040 if (iter->swbp_unique_id == bp->unique_id) {
1041 /* it's the first item */
1042 x86_32->swbbp_mem_patch_list = iter->next;
1043 free(iter);
1044 } else {
1045 while (iter->next != NULL && iter->next->swbp_unique_id != bp->unique_id)
1046 iter = iter->next;
1047 if (iter->next != NULL) {
1048 /* it's the next one */
1049 struct swbp_mem_patch *freeme = iter->next;
1050 iter->next = iter->next->next;
1051 free(freeme);
1052 }
1053 }
1054 }
1055
1056 LOG_USER("%s software breakpoint %d removed from 0x%08" PRIx32,
1057 __func__, bp->unique_id, bp->address);
1058 return ERROR_OK;
1059 }
1060
1061 static int set_breakpoint(struct target *t, struct breakpoint *bp)
1062 {
1063 int error = ERROR_OK;
1064 struct x86_32_common *x86_32 = target_to_x86_32(t);
1065 LOG_DEBUG("type=%d, addr=%08" PRIx32, bp->type, bp->address);
1066 if (bp->set) {
1067 LOG_ERROR("breakpoint already set");
1068 return error;
1069 }
1070 if (bp->type == BKPT_HARD) {
1071 error = set_hwbp(t, bp);
1072 if (error != ERROR_OK) {
1073 LOG_ERROR("%s error setting hardware breakpoint at 0x%08" PRIx32,
1074 __func__, bp->address);
1075 return error;
1076 }
1077 } else {
1078 if (x86_32->sw_bpts_supported(t)) {
1079 error = set_swbp(t, bp);
1080 if (error != ERROR_OK) {
1081 LOG_ERROR("%s error setting software breakpoint at 0x%08" PRIx32,
1082 __func__, bp->address);
1083 return error;
1084 }
1085 } else {
1086 LOG_ERROR("%s core doesn't support SW breakpoints", __func__);
1087 error = ERROR_FAIL;
1088 return ERROR_FAIL;
1089 }
1090 }
1091 return error;
1092 }
1093
1094 static int unset_breakpoint(struct target *t, struct breakpoint *bp)
1095 {
1096 LOG_DEBUG("type=%d, addr=%08" PRIx32, bp->type, bp->address);
1097 if (!bp->set) {
1098 LOG_WARNING("breakpoint not set");
1099 return ERROR_OK;
1100 }
1101
1102 if (bp->type == BKPT_HARD) {
1103 if (unset_hwbp(t, bp) != ERROR_OK) {
1104 LOG_ERROR("%s error removing hardware breakpoint at 0x%08" PRIx32,
1105 __func__, bp->address);
1106 return ERROR_FAIL;
1107 }
1108 } else {
1109 if (unset_swbp(t, bp) != ERROR_OK) {
1110 LOG_ERROR("%s error removing software breakpoint at 0x%08" PRIx32,
1111 __func__, bp->address);
1112 return ERROR_FAIL;
1113 }
1114 }
1115 bp->set = 0;
1116 return ERROR_OK;
1117 }
1118
1119 static int set_watchpoint(struct target *t, struct watchpoint *wp)
1120 {
1121 struct x86_32_common *x86_32 = target_to_x86_32(t);
1122 struct x86_32_dbg_reg *debug_reg_list = x86_32->hw_break_list;
1123 int wp_num = 0;
1124 LOG_DEBUG("type=%d, addr=%08" PRIx32, wp->rw, wp->address);
1125
1126 if (wp->set) {
1127 LOG_ERROR("%s watchpoint already set", __func__);
1128 return ERROR_OK;
1129 }
1130
1131 if (wp->rw == WPT_READ) {
1132 LOG_ERROR("%s no support for 'read' watchpoints, use 'access' or 'write'"
1133 , __func__);
1134 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1135 }
1136
1137 while (debug_reg_list[wp_num].used && (wp_num < x86_32->num_hw_bpoints))
1138 wp_num++;
1139 if (wp_num >= x86_32->num_hw_bpoints) {
1140 LOG_ERROR("%s no debug registers left", __func__);
1141 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1142 }
1143
1144 if (wp->length != 4 && wp->length != 2 && wp->length != 1) {
1145 LOG_ERROR("%s only watchpoints of length 1, 2 or 4 are supported", __func__);
1146 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1147 }
1148
1149 switch (wp->rw) {
1150 case WPT_WRITE:
1151 if (set_debug_regs(t, wp->address, wp_num,
1152 DR7_BP_WRITE, wp->length) != ERROR_OK) {
1153 return ERROR_FAIL;
1154 }
1155 break;
1156 case WPT_ACCESS:
1157 if (set_debug_regs(t, wp->address, wp_num, DR7_BP_READWRITE,
1158 wp->length) != ERROR_OK) {
1159 return ERROR_FAIL;
1160 }
1161 break;
1162 default:
1163 LOG_ERROR("%s only 'access' or 'write' watchpoints are supported", __func__);
1164 break;
1165 }
1166 wp->set = wp_num + 1;
1167 debug_reg_list[wp_num].used = 1;
1168 debug_reg_list[wp_num].bp_value = wp->address;
1169 LOG_USER("'%s' watchpoint %d set at 0x%08" PRIx32 " with length %d (hwreg=%d)",
1170 wp->rw == WPT_READ ? "read" : wp->rw == WPT_WRITE ?
1171 "write" : wp->rw == WPT_ACCESS ? "access" : "?",
1172 wp->unique_id, wp->address, wp->length, wp_num);
1173 return ERROR_OK;
1174 }
1175
1176 static int unset_watchpoint(struct target *t, struct watchpoint *wp)
1177 {
1178 struct x86_32_common *x86_32 = target_to_x86_32(t);
1179 struct x86_32_dbg_reg *debug_reg_list = x86_32->hw_break_list;
1180 LOG_DEBUG("type=%d, addr=%08" PRIx32, wp->rw, wp->address);
1181 if (!wp->set) {
1182 LOG_WARNING("watchpoint not set");
1183 return ERROR_OK;
1184 }
1185
1186 int wp_num = wp->set - 1;
1187 if ((wp_num < 0) || (wp_num >= x86_32->num_hw_bpoints)) {
1188 LOG_DEBUG("Invalid FP Comparator number in watchpoint");
1189 return ERROR_OK;
1190 }
1191 if (unset_debug_regs(t, wp_num) != ERROR_OK)
1192 return ERROR_FAIL;
1193
1194 debug_reg_list[wp_num].used = 0;
1195 debug_reg_list[wp_num].bp_value = 0;
1196 wp->set = 0;
1197
1198 LOG_USER("'%s' watchpoint %d removed from 0x%08" PRIx32 " with length %d (hwreg=%d)",
1199 wp->rw == WPT_READ ? "read" : wp->rw == WPT_WRITE ?
1200 "write" : wp->rw == WPT_ACCESS ? "access" : "?",
1201 wp->unique_id, wp->address, wp->length, wp_num);
1202
1203 return ERROR_OK;
1204 }
1205
1206 static int read_hw_reg_to_cache(struct target *t, int num)
1207 {
1208 uint32_t reg_value;
1209 struct x86_32_common *x86_32 = target_to_x86_32(t);
1210
1211 if (check_not_halted(t))
1212 return ERROR_TARGET_NOT_HALTED;
1213 if ((num < 0) || (num >= x86_32->get_num_user_regs(t)))
1214 return ERROR_COMMAND_SYNTAX_ERROR;
1215 if (x86_32->read_hw_reg(t, num, &reg_value, 1) != ERROR_OK) {
1216 LOG_ERROR("%s fail for %s", x86_32->cache->reg_list[num].name, __func__);
1217 return ERROR_FAIL;
1218 }
1219 LOG_DEBUG("reg %s value 0x%08" PRIx32,
1220 x86_32->cache->reg_list[num].name, reg_value);
1221 return ERROR_OK;
1222 }
1223
1224 static int write_hw_reg_from_cache(struct target *t, int num)
1225 {
1226 struct x86_32_common *x86_32 = target_to_x86_32(t);
1227 if (check_not_halted(t))
1228 return ERROR_TARGET_NOT_HALTED;
1229 if ((num < 0) || (num >= x86_32->get_num_user_regs(t)))
1230 return ERROR_COMMAND_SYNTAX_ERROR;
1231 if (x86_32->write_hw_reg(t, num, 0, 1) != ERROR_OK) {
1232 LOG_ERROR("%s fail for %s", x86_32->cache->reg_list[num].name, __func__);
1233 return ERROR_FAIL;
1234 }
1235 LOG_DEBUG("reg %s value 0x%08" PRIx32, x86_32->cache->reg_list[num].name,
1236 buf_get_u32(x86_32->cache->reg_list[num].value, 0, 32));
1237 return ERROR_OK;
1238 }
1239
1240 /* x86 32 commands */
1241 static void handle_iod_output(struct command_context *cmd_ctx,
1242 struct target *target, uint32_t address, unsigned size,
1243 unsigned count, const uint8_t *buffer)
1244 {
1245 const unsigned line_bytecnt = 32;
1246 unsigned line_modulo = line_bytecnt / size;
1247
1248 char output[line_bytecnt * 4 + 1];
1249 unsigned output_len = 0;
1250
1251 const char *value_fmt;
1252 switch (size) {
1253 case 4:
1254 value_fmt = "%8.8x ";
1255 break;
1256 case 2:
1257 value_fmt = "%4.4x ";
1258 break;
1259 case 1:
1260 value_fmt = "%2.2x ";
1261 break;
1262 default:
1263 /* "can't happen", caller checked */
1264 LOG_ERROR("%s invalid memory read size: %u", __func__, size);
1265 return;
1266 }
1267
1268 for (unsigned i = 0; i < count; i++) {
1269 if (i % line_modulo == 0) {
1270 output_len += snprintf(output + output_len,
1271 sizeof(output) - output_len,
1272 "0x%8.8x: ",
1273 (unsigned)(address + (i*size)));
1274 }
1275
1276 uint32_t value = 0;
1277 const uint8_t *value_ptr = buffer + i * size;
1278 switch (size) {
1279 case 4:
1280 value = target_buffer_get_u32(target, value_ptr);
1281 break;
1282 case 2:
1283 value = target_buffer_get_u16(target, value_ptr);
1284 break;
1285 case 1:
1286 value = *value_ptr;
1287 }
1288 output_len += snprintf(output + output_len,
1289 sizeof(output) - output_len,
1290 value_fmt, value);
1291
1292 if ((i % line_modulo == line_modulo - 1) || (i == count - 1)) {
1293 command_print(cmd_ctx, "%s", output);
1294 output_len = 0;
1295 }
1296 }
1297 }
1298
1299 COMMAND_HANDLER(handle_iod_command)
1300 {
1301 if (CMD_ARGC != 1)
1302 return ERROR_COMMAND_SYNTAX_ERROR;
1303
1304 uint32_t address;
1305 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], address);
1306 if (address > 0xffff) {
1307 LOG_ERROR("%s IA-32 I/O space is 2^16, %08" PRIx32 " exceeds max", __func__, address);
1308 return ERROR_COMMAND_SYNTAX_ERROR;
1309 }
1310
1311 unsigned size = 0;
1312 switch (CMD_NAME[2]) {
1313 case 'w':
1314 size = 4;
1315 break;
1316 case 'h':
1317 size = 2;
1318 break;
1319 case 'b':
1320 size = 1;
1321 break;
1322 default:
1323 return ERROR_COMMAND_SYNTAX_ERROR;
1324 }
1325 unsigned count = 1;
1326 uint8_t *buffer = calloc(count, size);
1327 struct target *target = get_current_target(CMD_CTX);
1328 int retval = x86_32_common_read_io(target, address, size, buffer);
1329 if (ERROR_OK == retval)
1330 handle_iod_output(CMD_CTX, target, address, size, count, buffer);
1331 free(buffer);
1332 return retval;
1333 }
1334
1335 static int target_fill_io(struct target *target,
1336 uint32_t address,
1337 unsigned data_size,
1338 /* value */
1339 uint32_t b)
1340 {
1341 LOG_DEBUG("address=%08X, data_size=%d, b=%08X",
1342 address, data_size, b);
1343 uint8_t target_buf[data_size];
1344 switch (data_size) {
1345 case 4:
1346 target_buffer_set_u32(target, target_buf, b);
1347 break;
1348 case 2:
1349 target_buffer_set_u16(target, target_buf, b);
1350 break;
1351 case 1:
1352 target_buf[0] = (b & 0x0ff);
1353 break;
1354 default:
1355 exit(-1);
1356 }
1357 return x86_32_common_write_io(target, address, data_size, target_buf);
1358 }
1359
1360 COMMAND_HANDLER(handle_iow_command)
1361 {
1362 if (CMD_ARGC != 2)
1363 return ERROR_COMMAND_SYNTAX_ERROR;
1364 uint32_t address;
1365 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], address);
1366 uint32_t value;
1367 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], value);
1368 struct target *target = get_current_target(CMD_CTX);
1369
1370 unsigned wordsize;
1371 switch (CMD_NAME[2]) {
1372 case 'w':
1373 wordsize = 4;
1374 break;
1375 case 'h':
1376 wordsize = 2;
1377 break;
1378 case 'b':
1379 wordsize = 1;
1380 break;
1381 default:
1382 return ERROR_COMMAND_SYNTAX_ERROR;
1383 }
1384 return target_fill_io(target, address, wordsize, value);
1385 }
1386
1387 static const struct command_registration x86_32_exec_command_handlers[] = {
1388 {
1389 .name = "iww",
1390 .mode = COMMAND_EXEC,
1391 .handler = handle_iow_command,
1392 .help = "write I/O port word",
1393 .usage = "port data[word]",
1394 },
1395 {
1396 .name = "iwh",
1397 .mode = COMMAND_EXEC,
1398 .handler = handle_iow_command,
1399 .help = "write I/O port halfword",
1400 .usage = "port data[halfword]",
1401 },
1402 {
1403 .name = "iwb",
1404 .mode = COMMAND_EXEC,
1405 .handler = handle_iow_command,
1406 .help = "write I/O port byte",
1407 .usage = "port data[byte]",
1408 },
1409 {
1410 .name = "idw",
1411 .mode = COMMAND_EXEC,
1412 .handler = handle_iod_command,
1413 .help = "display I/O port word",
1414 .usage = "port",
1415 },
1416 {
1417 .name = "idh",
1418 .mode = COMMAND_EXEC,
1419 .handler = handle_iod_command,
1420 .help = "display I/O port halfword",
1421 .usage = "port",
1422 },
1423 {
1424 .name = "idb",
1425 .mode = COMMAND_EXEC,
1426 .handler = handle_iod_command,
1427 .help = "display I/O port byte",
1428 .usage = "port",
1429 },
1430
1431 COMMAND_REGISTRATION_DONE
1432 };
1433
1434 const struct command_registration x86_32_command_handlers[] = {
1435 {
1436 .name = "x86_32",
1437 .mode = COMMAND_ANY,
1438 .help = "x86_32 target commands",
1439 .usage = "",
1440 .chain = x86_32_exec_command_handlers,
1441 },
1442 COMMAND_REGISTRATION_DONE
1443 };

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)