From: "Andreas Färber" <afaerber@suse.de>
To: liguang <lig.fnst@cn.fujitsu.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
imammedo@redhat.com, Jan Kiszka <jan.kiszka@siemens.com>,
ehabkost@redhat.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v4 3/3] target-i386:slightly refactor dr7 related function
Date: Fri, 11 Jan 2013 17:30:21 +0100 [thread overview]
Message-ID: <50F03E1D.2030408@suse.de> (raw)
In-Reply-To: <1355106144-30846-3-git-send-email-lig.fnst@cn.fujitsu.com>
This is lacking a proper description of the slight refactoring.
Am 10.12.2012 03:22, schrieb liguang:
> Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
> ---
> target-i386/helper.c | 74 +++++++++++++++++++++++++++++---------------
> target-i386/machine.c | 5 ++-
> target-i386/misc_helper.c | 4 +-
> target-i386/seg_helper.c | 7 ++--
> 4 files changed, 58 insertions(+), 32 deletions(-)
>
> diff --git a/target-i386/helper.c b/target-i386/helper.c
> index bf206cf..62746c5 100644
> --- a/target-i386/helper.c
> +++ b/target-i386/helper.c
> @@ -966,30 +966,33 @@ hwaddr cpu_get_phys_page_debug(CPUX86State *env, target_ulong addr)
>
> void hw_breakpoint_insert(CPUX86State *env, int index)
> {
> - int type, err = 0;
> + int type = 0, err = 0;
>
> switch (hw_breakpoint_type(env->dr[7], index)) {
> - case 0:
> - if (hw_breakpoint_enabled(env->dr[7], index))
> + case DR7_TYPE_BP_INST:
> + if (hw_breakpoint_enabled(env->dr[7], index)) {
> err = cpu_breakpoint_insert(env, env->dr[index], BP_CPU,
> &env->cpu_breakpoint[index]);
> + }
> break;
> - case 1:
> + case DR7_TYPE_DATA_WR:
> type = BP_CPU | BP_MEM_WRITE;
> - goto insert_wp;
> - case 2:
> - /* No support for I/O watchpoints yet */
> break;
> - case 3:
> + case DR7_TYPE_DATA_RW:
> type = BP_CPU | BP_MEM_ACCESS;
> - insert_wp:
> + break;
> + case DR7_TYPE_IO_RW:
Tab should be four spaces.
> + /* No support for I/O watchpoints yet */
> + break;
> + }
> + if (type) {
Another tab.
> err = cpu_watchpoint_insert(env, env->dr[index],
> hw_breakpoint_len(env->dr[7], index),
> type, &env->cpu_watchpoint[index]);
> - break;
> }
> - if (err)
> + if (err) {
> env->cpu_breakpoint[index] = NULL;
> + }
> }
>
> void hw_breakpoint_remove(CPUX86State *env, int index)
> @@ -997,15 +1000,16 @@ void hw_breakpoint_remove(CPUX86State *env, int index)
> if (!env->cpu_breakpoint[index])
> return;
> switch (hw_breakpoint_type(env->dr[7], index)) {
> - case 0:
> - if (hw_breakpoint_enabled(env->dr[7], index))
> + case DR7_TYPE_BP_INST:
> + if (hw_breakpoint_enabled(env->dr[7], index)) {
> cpu_breakpoint_remove_by_ref(env, env->cpu_breakpoint[index]);
> + }
> break;
> - case 1:
> - case 3:
> + case DR7_TYPE_DATA_RW:
> + case DR7_TYPE_DATA_WR:
> cpu_watchpoint_remove_by_ref(env, env->cpu_watchpoint[index]);
> break;
> - case 2:
> + case DR7_TYPE_IO_RW:
> /* No support for I/O watchpoints yet */
> break;
> }
> @@ -1014,22 +1018,42 @@ void hw_breakpoint_remove(CPUX86State *env, int index)
> int check_hw_breakpoints(CPUX86State *env, int force_dr6_update)
> {
> target_ulong dr6;
> - int reg, type;
> + int index;
> int hit_enabled = 0;
> + bool bp_match = false;
> + bool wp_match = false;
>
> dr6 = env->dr[6] & ~0xf;
> - for (reg = 0; reg < 4; reg++) {
> - type = hw_breakpoint_type(env->dr[7], reg);
> - if ((type == 0 && env->dr[reg] == env->eip) ||
> - ((type & 1) && env->cpu_watchpoint[reg] &&
> - (env->cpu_watchpoint[reg]->flags & BP_WATCHPOINT_HIT))) {
> - dr6 |= 1 << reg;
> - if (hw_breakpoint_enabled(env->dr[7], reg))
> + for (index = 0; index < DR7_MAX_BP; index++) {
> + switch (hw_breakpoint_type(env->dr[7], index)) {
> + case DR7_TYPE_BP_INST:
> + if (env->dr[index] == env->eip) {
> + bp_match = true;
> + }
> + break;
> + case DR7_TYPE_DATA_WR:
> + case DR7_TYPE_DATA_RW:
> + if (env->cpu_watchpoint[index] &&
> + env->cpu_watchpoint[index]->flags & BP_WATCHPOINT_HIT) {
> + wp_match = true;
> + }
> + break;
> + case DR7_TYPE_IO_RW:
> + break;
> + }
> + if (bp_match || wp_match) {
> + dr6 |= 1 << index;
> + if (hw_breakpoint_enabled(env->dr[7], index)) {
> hit_enabled = 1;
> + }
> + bp_match = false;
> + wp_match = false;
> }
> }
> - if (hit_enabled || force_dr6_update)
> + if (hit_enabled || force_dr6_update) {
> env->dr[6] = dr6;
> + }
> +
> return hit_enabled;
> }
>
> diff --git a/target-i386/machine.c b/target-i386/machine.c
> index 4771508..67131a4 100644
> --- a/target-i386/machine.c
> +++ b/target-i386/machine.c
> @@ -265,10 +265,11 @@ static int cpu_post_load(void *opaque, int version_id)
>
> cpu_breakpoint_remove_all(env, BP_CPU);
> cpu_watchpoint_remove_all(env, BP_CPU);
> - for (i = 0; i < 4; i++)
> + for (i = 0; i < DR7_MAX_BP; i++) {
This trivial change could be in 1/3.
> hw_breakpoint_insert(env, i);
> -
> + }
Tab.
> tlb_flush(env, 1);
> +
> return 0;
> }
>
> diff --git a/target-i386/misc_helper.c b/target-i386/misc_helper.c
> index a020379..5ee0863 100644
> --- a/target-i386/misc_helper.c
> +++ b/target-i386/misc_helper.c
> @@ -197,11 +197,11 @@ void helper_movl_drN_T0(CPUX86State *env, int reg, target_ulong t0)
> env->dr[reg] = t0;
> hw_breakpoint_insert(env, reg);
> } else if (reg == 7) {
> - for (i = 0; i < 4; i++) {
> + for (i = 0; i < DR7_MAX_BP; i++) {
> hw_breakpoint_remove(env, i);
> }
> env->dr[7] = t0;
> - for (i = 0; i < 4; i++) {
> + for (i = 0; i < DR7_MAX_BP; i++) {
> hw_breakpoint_insert(env, i);
> }
> } else {
Move both into 1/3?
> diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c
> index ff93374..306e9d1 100644
> --- a/target-i386/seg_helper.c
> +++ b/target-i386/seg_helper.c
> @@ -465,9 +465,10 @@ static void switch_tss(CPUX86State *env, int tss_selector,
>
> #ifndef CONFIG_USER_ONLY
> /* reset local breakpoints */
> - if (env->dr[7] & 0x55) {
> - for (i = 0; i < 4; i++) {
> - if (hw_breakpoint_enabled(env->dr[7], i) == 0x1) {
> + if (env->dr[7] & DR7_LOCAL_BP_MASK) {
> + for (i = 0; i < DR7_MAX_BP; i++) {
1/3?
> + if (hw_local_breakpoint_enabled(env->dr[7], i) &&
> + !hw_global_breakpoint_enabled(env->dr[7], i)) {
> hw_breakpoint_remove(env, i);
> }
> }
Regards,
Andreas
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
next prev parent reply other threads:[~2013-01-11 16:30 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-10 2:22 [Qemu-devel] [PATCH v4 1/3] target-i386:define name of breakpoint bit in dr7 liguang
2012-12-10 2:22 ` [Qemu-devel] [PATCH v4 2/3] target-i386:define hw_{global, local}breakpoint_enabled function liguang
2013-01-11 16:16 ` Andreas Färber
2012-12-10 2:22 ` [Qemu-devel] [PATCH v4 3/3] target-i386:slightly refactor dr7 related function liguang
2013-01-11 16:30 ` Andreas Färber [this message]
2012-12-14 1:32 ` [Qemu-devel] [PATCH v4 1/3] target-i386:define name of breakpoint bit in dr7 li guang
2013-01-11 1:47 ` li guang
2013-01-11 16:00 ` Andreas Färber
2013-01-11 16:10 ` Andreas Färber
2013-01-14 2:39 ` li guang
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=50F03E1D.2030408@suse.de \
--to=afaerber@suse.de \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=jan.kiszka@siemens.com \
--cc=lig.fnst@cn.fujitsu.com \
--cc=peter.maydell@linaro.org \
--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.