All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@web.de>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH 04/13] Respect length of watchpoints
Date: Tue, 14 Oct 2008 20:26:39 +0200	[thread overview]
Message-ID: <48F4E45F.1060300@web.de> (raw)
In-Reply-To: <5d6222a80810141050p1de281e1r7738434b7127d638@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 6228 bytes --]

Glauber Costa wrote:
> On Tue, Oct 14, 2008 at 7:12 AM, Jan Kiszka <jan.kiszka@siemens.com> wrote:
>> This adds length support for watchpoints. To keep things simple, only
>> aligned watchpoints are accepted.
> 
> why? It does not seem that much complicated to handle unaligned watchpoints.
> Unless I'm totally wrong, we should just store the value as-is, and
> then check for it.
> As a matter of fact, because we're masking and testing for the mask,
> it seems even more
> complicated to require that. I agree a full aligned world would be a
> happier world, but unfortunately,
> unaligned accesses are quite common in x86.

Unaligned watchpoints also means multi-page watchpoints - and this
introduces some complexity. I think the fact that real x86 hw
watchpoints require alignment as well motivated the simplification. But
if there is a real need for it (e.g. some other arch using the
infrastructure for hw watchpoint emulation), I could rethink this.
However, I would prefer to apply such extension on top of the proposed
implementation.

> 
>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>> ---
>>  cpu-defs.h |    2 +-
>>  exec.c     |   30 ++++++++++++++++++++----------
>>  2 files changed, 21 insertions(+), 11 deletions(-)
>>
>> Index: b/exec.c
>> ===================================================================
>> --- a/exec.c
>> +++ b/exec.c
>> @@ -1313,14 +1313,21 @@ static void breakpoint_invalidate(CPUSta
>>  int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
>>                           int flags, CPUWatchpoint **watchpoint)
>>  {
>> +    target_ulong len_mask = ~(len - 1);
>>     CPUWatchpoint *wp;
>>
>> +    /* sanity checks: allow power-of-2 lengths, deny unaligned watchpoints */
>> +    if ((len != 1 && len != 2 && len != 4 && len != 8) || (addr & ~len_mask)) {
>> +        fprintf(stderr, "qemu: tried to set invalid watchpoint at "
>> +                TARGET_FMT_lx ", len=" TARGET_FMT_lu "\n", addr, len);
>> +        return -EINVAL;
>> +    }
>>     wp = qemu_malloc(sizeof(*wp));
>>     if (!wp)
>>         return -ENOBUFS;
>>
>>     wp->vaddr = addr;
>> -    wp->len = len;
>> +    wp->len_mask = len_mask;
>>     wp->flags = flags;
>>
>>     wp->next = env->watchpoints;
>> @@ -1344,10 +1351,12 @@ int cpu_watchpoint_insert(CPUState *env,
>>  int cpu_watchpoint_remove(CPUState *env, target_ulong addr, target_ulong len,
>>                           int flags)
>>  {
>> +    target_ulong len_mask = ~(len - 1);
>>     CPUWatchpoint *wp;
>>
>>     for (wp = env->watchpoints; wp != NULL; wp = wp->next) {
>> -        if (addr == wp->vaddr && len == wp->len && flags == wp->flags) {
>> +        if (addr == wp->vaddr && len_mask == wp->len_mask
>> +                && flags == wp->flags) {
>>             cpu_watchpoint_remove_by_ref(env, wp);
>>             return 0;
>>         }
>> @@ -2502,7 +2511,7 @@ static CPUWriteMemoryFunc *notdirty_mem_
>>  };
>>
>>  /* Generate a debug exception if a watchpoint has been hit.  */
>> -static void check_watchpoint(int offset, int flags)
>> +static void check_watchpoint(int offset, int len_mask, int flags)
>>  {
>>     CPUState *env = cpu_single_env;
>>     target_ulong vaddr;
>> @@ -2510,7 +2519,8 @@ static void check_watchpoint(int offset,
>>
>>     vaddr = (env->mem_io_vaddr & TARGET_PAGE_MASK) + offset;
>>     for (wp = env->watchpoints; wp != NULL; wp = wp->next) {
>> -        if (vaddr == wp->vaddr && (wp->flags & flags)) {
>> +        if ((vaddr == (wp->vaddr & len_mask) ||
>> +             (vaddr & wp->len_mask) == wp->vaddr) && (wp->flags & flags)) {
>>             env->watchpoint_hit = wp;
>>             cpu_interrupt(env, CPU_INTERRUPT_DEBUG);
>>             break;
>> @@ -2523,40 +2533,40 @@ static void check_watchpoint(int offset,
>>    phys routines.  */
>>  static uint32_t watch_mem_readb(void *opaque, target_phys_addr_t addr)
>>  {
>> -    check_watchpoint(addr & ~TARGET_PAGE_MASK, BP_MEM_READ);
>> +    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x0, BP_MEM_READ);
>>     return ldub_phys(addr);
>>  }
>>
>>  static uint32_t watch_mem_readw(void *opaque, target_phys_addr_t addr)
>>  {
>> -    check_watchpoint(addr & ~TARGET_PAGE_MASK, BP_MEM_READ);
>> +    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x1, BP_MEM_READ);
>>     return lduw_phys(addr);
>>  }
>>
>>  static uint32_t watch_mem_readl(void *opaque, target_phys_addr_t addr)
>>  {
>> -    check_watchpoint(addr & ~TARGET_PAGE_MASK, BP_MEM_READ);
>> +    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x3, BP_MEM_READ);
>>     return ldl_phys(addr);
>>  }
>>
>>  static void watch_mem_writeb(void *opaque, target_phys_addr_t addr,
>>                              uint32_t val)
>>  {
>> -    check_watchpoint(addr & ~TARGET_PAGE_MASK, BP_MEM_WRITE);
>> +    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x0, BP_MEM_WRITE);
>>     stb_phys(addr, val);
>>  }
>>
>>  static void watch_mem_writew(void *opaque, target_phys_addr_t addr,
>>                              uint32_t val)
>>  {
>> -    check_watchpoint(addr & ~TARGET_PAGE_MASK, BP_MEM_WRITE);
>> +    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x1, BP_MEM_WRITE);
>>     stw_phys(addr, val);
>>  }
>>
>>  static void watch_mem_writel(void *opaque, target_phys_addr_t addr,
>>                              uint32_t val)
>>  {
>> -    check_watchpoint(addr & ~TARGET_PAGE_MASK, BP_MEM_WRITE);
>> +    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x3, BP_MEM_WRITE);
>>     stl_phys(addr, val);
>>  }
>>
>> Index: b/cpu-defs.h
>> ===================================================================
>> --- a/cpu-defs.h
>> +++ b/cpu-defs.h
>> @@ -148,7 +148,7 @@ typedef struct CPUBreakpoint {
>>
>>  typedef struct CPUWatchpoint {
>>     target_ulong vaddr;
>> -    target_ulong len;
>> +    target_ulong len_mask;
>>     int flags; /* BP_* */
>>     struct CPUWatchpoint *prev, *next;
>>  } CPUWatchpoint;
> 
> It's less confusing if you call it len_mask from the beginning,
> instead of changing your own patch for that purpose.

OK. If I have to update the involved patches, I will merge this over.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]

  reply	other threads:[~2008-10-14 18:26 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-10-14  9:12 [Qemu-devel] [PATCH 00/13] Enhance debugging support - 3rd take Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 01/13] Return appropriate watch message to gdb Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 02/13] Refactor and enhance break/watchpoint API Jan Kiszka
2008-10-14 17:24   ` Glauber Costa
2008-10-14 17:45     ` [Qemu-devel] " Jan Kiszka
2008-10-14 17:51       ` Glauber Costa
2008-10-14 17:35   ` [Qemu-devel] " Glauber Costa
2008-10-14 17:53     ` [Qemu-devel] " Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 03/13] Set mem_io_vaddr on io_read Jan Kiszka
2008-10-14 17:39   ` Glauber Costa
2008-10-14 17:49     ` [Qemu-devel] " Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 04/13] Respect length of watchpoints Jan Kiszka
2008-10-14 17:50   ` Glauber Costa
2008-10-14 18:26     ` Jan Kiszka [this message]
2008-10-14  9:12 ` [Qemu-devel] [PATCH 05/13] Introduce next_cflags Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 06/13] Switch self-modified code recompilation to next_cflags Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 07/13] Restore pc on watchpoint hits Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 08/13] Remove premature memop TB terminations Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 09/13] qemu: gdbstub: manage CPUs as threads Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 10/13] Introduce BP_WATCHPOINT_HIT flag Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 11/13] Add debug exception hook Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 12/13] Introduce BP_CPU as a breakpoint type Jan Kiszka
2008-10-14  9:12 ` [Qemu-devel] [PATCH 13/13] x86: Debug register emulation Jan Kiszka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48F4E45F.1060300@web.de \
    --to=jan.kiszka@web.de \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.