All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Graf <agraf@suse.de>
To: Aurelien Jarno <aurelien@aurel32.net>, qemu-devel@nongnu.org
Cc: Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PATCH 15/15] target-s390x: PER: add Breaking-Event-Address register
Date: Tue, 16 Jun 2015 18:44:15 +0200	[thread overview]
Message-ID: <5580525F.3010001@suse.de> (raw)
In-Reply-To: <1434149163-16639-16-git-send-email-aurelien@aurel32.net>

On 06/13/15 00:46, Aurelien Jarno wrote:
> This patch adds support for PER Breaking-Event-Address register. Like
> real hardware, it save the current PSW address when the PSW address is
> changed by an instruction. We have to take care of optimizations QEMU
> does, a branch to the next instruction is still a branch.
>
> This register is copied to low core memory when a program exception
> happens.
>
> Cc: Richard Henderson <rth@twiddle.net>
> Cc: Alexander Graf <agraf@suse.de>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> ---
>   target-s390x/cpu.c       |  6 ++++++
>   target-s390x/cpu.h       | 12 +++++++-----
>   target-s390x/helper.c    |  1 +
>   target-s390x/translate.c | 29 +++++++++++++++++++++++------
>   4 files changed, 37 insertions(+), 11 deletions(-)
>
> diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c
> index 67579e7..98d2081 100644
> --- a/target-s390x/cpu.c
> +++ b/target-s390x/cpu.c
> @@ -116,6 +116,9 @@ static void s390_cpu_initial_reset(CPUState *s)
>       env->cregs[0] = CR0_RESET;
>       env->cregs[14] = CR14_RESET;
>   
> +    /* architectured initial value for Breaking-Event-Address register */
> +    env->gbea = 1;
> +
>       env->pfault_token = -1UL;
>   
>       /* tininess for underflow is detected before rounding */
> @@ -145,6 +148,9 @@ static void s390_cpu_full_reset(CPUState *s)
>       env->cregs[0] = CR0_RESET;
>       env->cregs[14] = CR14_RESET;
>   
> +    /* architectured initial value for Breaking-Event-Address register */
> +    env->gbea = 1;
> +
>       env->pfault_token = -1UL;
>   
>       /* tininess for underflow is detected before rounding */
> diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
> index 61cc5b4..519cef9 100644
> --- a/target-s390x/cpu.h
> +++ b/target-s390x/cpu.h
> @@ -788,14 +788,16 @@ typedef struct LowCore
>       uint8_t         pad5[0xf4-0xf0];          /* 0x0f0 */
>       uint32_t        external_damage_code;     /* 0x0f4 */
>       uint64_t        failing_storage_address;  /* 0x0f8 */
> -    uint8_t         pad6[0x120-0x100];        /* 0x100 */
> +    uint8_t         pad6[0x110-0x100];        /* 0x100 */
> +    uint64_t        per_breaking_event_addr;  /* 0x110 */
> +    uint8_t         pad7[0x120-0x118];        /* 0x118 */
>       PSW             restart_old_psw;          /* 0x120 */
>       PSW             external_old_psw;         /* 0x130 */
>       PSW             svc_old_psw;              /* 0x140 */
>       PSW             program_old_psw;          /* 0x150 */
>       PSW             mcck_old_psw;             /* 0x160 */
>       PSW             io_old_psw;               /* 0x170 */
> -    uint8_t         pad7[0x1a0-0x180];        /* 0x180 */
> +    uint8_t         pad8[0x1a0-0x180];        /* 0x180 */
>       PSW             restart_new_psw;          /* 0x1a0 */
>       PSW             external_new_psw;         /* 0x1b0 */
>       PSW             svc_new_psw;              /* 0x1c0 */
> @@ -813,10 +815,10 @@ typedef struct LowCore
>       uint64_t        last_update_clock;        /* 0x280 */
>       uint64_t        steal_clock;              /* 0x288 */
>       PSW             return_mcck_psw;          /* 0x290 */
> -    uint8_t         pad8[0xc00-0x2a0];        /* 0x2a0 */
> +    uint8_t         pad9[0xc00-0x2a0];        /* 0x2a0 */
>       /* System info area */
>       uint64_t        save_area[16];            /* 0xc00 */
> -    uint8_t         pad9[0xd40-0xc80];        /* 0xc80 */
> +    uint8_t         pad10[0xd40-0xc80];       /* 0xc80 */
>       uint64_t        kernel_stack;             /* 0xd40 */
>       uint64_t        thread_info;              /* 0xd48 */
>       uint64_t        async_stack;              /* 0xd50 */
> @@ -824,7 +826,7 @@ typedef struct LowCore
>       uint64_t        user_asce;                /* 0xd60 */
>       uint64_t        panic_stack;              /* 0xd68 */
>       uint64_t        user_exec_asce;           /* 0xd70 */
> -    uint8_t         pad10[0xdc0-0xd78];       /* 0xd78 */
> +    uint8_t         pad11[0xdc0-0xd78];       /* 0xd78 */
>   
>       /* SMP info area: defined by DJB */
>       uint64_t        clock_comparator;         /* 0xdc0 */
> diff --git a/target-s390x/helper.c b/target-s390x/helper.c
> index 615cccf..d887006 100644
> --- a/target-s390x/helper.c
> +++ b/target-s390x/helper.c
> @@ -293,6 +293,7 @@ static void do_program_interrupt(CPUS390XState *env)
>       lowcore->program_old_psw.addr = cpu_to_be64(env->psw.addr);
>       mask = be64_to_cpu(lowcore->program_new_psw.mask);
>       addr = be64_to_cpu(lowcore->program_new_psw.addr);
> +    lowcore->per_breaking_event_addr = cpu_to_be64(env->gbea);
>   
>       cpu_unmap_lowcore(lowcore);
>   
> diff --git a/target-s390x/translate.c b/target-s390x/translate.c
> index 98e8224..2fde815 100644
> --- a/target-s390x/translate.c
> +++ b/target-s390x/translate.c
> @@ -150,6 +150,7 @@ void s390_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
>   
>   static TCGv_i64 psw_addr;
>   static TCGv_i64 psw_mask;
> +static TCGv_i64 gbea;
>   
>   static TCGv_i32 cc_op;
>   static TCGv_i64 cc_src;
> @@ -173,6 +174,9 @@ void s390x_translate_init(void)
>       psw_mask = tcg_global_mem_new_i64(TCG_AREG0,
>                                         offsetof(CPUS390XState, psw.mask),
>                                         "psw_mask");
> +    gbea = tcg_global_mem_new_i64(TCG_AREG0,
> +                                  offsetof(CPUS390XState, gbea),
> +                                  "gbea");
>   
>       cc_op = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUS390XState, cc_op),
>                                      "cc_op");
> @@ -252,14 +256,14 @@ static void update_psw_addr(DisasContext *s)
>   static void per_branch(DisasContext *s, bool to_next)
>   {
>   #ifndef CONFIG_USER_ONLY
> +    tcg_gen_movi_i64(gbea, s->pc);

This should probably be a call to per_breaking_event(), no?

Also, is there no flag to control this register? I'd assume it to be 
quite some performance penalty to always store the last branched register.


Alex

> +
>       if (s->tb->flags & FLAG_MASK_PER) {
> -        TCGv_i64 pc = tcg_const_i64(s->pc);
>           TCGv_i64 next_pc = to_next ? tcg_const_i64(s->next_pc) : psw_addr;
> -        gen_helper_per_branch(cpu_env, pc, next_pc);
> +        gen_helper_per_branch(cpu_env, gbea, next_pc);
>           if (to_next) {
>               tcg_temp_free_i64(next_pc);
>           }
> -        tcg_temp_free_i64(pc);
>       }
>   #endif
>   }
> @@ -272,15 +276,23 @@ static void per_branch_cond(DisasContext *s, TCGCond cond,
>           TCGLabel *lab = gen_new_label();
>           tcg_gen_brcond_i64(tcg_invert_cond(cond), arg1, arg2, lab);
>   
> -        TCGv_i64 pc = tcg_const_i64(s->pc);
> -        gen_helper_per_branch(cpu_env, pc, psw_addr);
> -        tcg_temp_free_i64(pc);
> +        tcg_gen_movi_i64(gbea, s->pc);
> +        gen_helper_per_branch(cpu_env, gbea, psw_addr);
>   
>           gen_set_label(lab);
> +    } else {
> +        TCGv_i64 pc = tcg_const_i64(s->pc);
> +        tcg_gen_movcond_i64(cond, gbea, arg1, arg2, gbea, pc);
> +        tcg_temp_free_i64(pc);
>       }
>   #endif
>   }
>   
> +static void per_breaking_event(DisasContext *s)
> +{
> +    tcg_gen_movi_i64(gbea, s->pc);
> +}
> +
>   static void update_cc_op(DisasContext *s)
>   {
>       if (s->cc_op != CC_OP_DYNAMIC && s->cc_op != CC_OP_STATIC) {
> @@ -1219,6 +1231,7 @@ static ExitStatus help_goto_direct(DisasContext *s, uint64_t dest)
>       }
>       if (use_goto_tb(s, dest)) {
>           update_cc_op(s);
> +        per_breaking_event(s);
>           tcg_gen_goto_tb(0);
>           tcg_gen_movi_i64(psw_addr, dest);
>           tcg_gen_exit_tb((uintptr_t)s->tb);
> @@ -1286,6 +1299,7 @@ static ExitStatus help_branch(DisasContext *s, DisasCompare *c,
>   
>               /* Branch taken.  */
>               gen_set_label(lab);
> +            per_breaking_event(s);
>               tcg_gen_goto_tb(1);
>               tcg_gen_movi_i64(psw_addr, dest);
>               tcg_gen_exit_tb((uintptr_t)s->tb + 1);
> @@ -1317,6 +1331,7 @@ static ExitStatus help_branch(DisasContext *s, DisasCompare *c,
>               if (is_imm) {
>                   tcg_gen_movi_i64(psw_addr, dest);
>               }
> +            per_breaking_event(s);
>               ret = EXIT_PC_UPDATED;
>           }
>       } else {
> @@ -2545,6 +2560,7 @@ static ExitStatus op_lpsw(DisasContext *s, DisasOps *o)
>       TCGv_i64 t1, t2;
>   
>       check_privileged(s);
> +    per_breaking_event(s);
>   
>       t1 = tcg_temp_new_i64();
>       t2 = tcg_temp_new_i64();
> @@ -2564,6 +2580,7 @@ static ExitStatus op_lpswe(DisasContext *s, DisasOps *o)
>       TCGv_i64 t1, t2;
>   
>       check_privileged(s);
> +    per_breaking_event(s);
>   
>       t1 = tcg_temp_new_i64();
>       t2 = tcg_temp_new_i64();

  reply	other threads:[~2015-06-16 16:44 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-12 22:45 [Qemu-devel] [PATCH 00/15] target-s390x: add Program-Event Recording feature Aurelien Jarno
2015-06-12 22:45 ` [Qemu-devel] [PATCH 01/15] softmmu: provide tlb_vaddr_to_host function for user mode Aurelien Jarno
2015-06-12 22:45 ` [Qemu-devel] [PATCH 02/15] target-s390x: function to adjust the length wrt page boundary Aurelien Jarno
2015-06-12 22:45 ` [Qemu-devel] [PATCH 03/15] target-s390x: mvc_fast_memset: access memory through softmmu Aurelien Jarno
2015-06-12 22:45 ` [Qemu-devel] [PATCH 04/15] target-s390x: mvc_fast_memmove: " Aurelien Jarno
2015-06-12 22:45 ` [Qemu-devel] [PATCH 05/15] target-s390x: add PER related constants Aurelien Jarno
2015-06-12 22:45 ` [Qemu-devel] [PATCH 06/15] target-s390x: add get_per_atmid function Aurelien Jarno
2015-06-12 22:45 ` [Qemu-devel] [PATCH 07/15] target-s390x: add get_per_in_range function Aurelien Jarno
2015-06-12 22:45 ` [Qemu-devel] [PATCH 08/15] target-s390x: basic PER event handling Aurelien Jarno
2015-06-12 22:45 ` [Qemu-devel] [PATCH 09/15] target-s390x: PER successful-branching event support Aurelien Jarno
2015-06-12 22:45 ` [Qemu-devel] [PATCH 10/15] target-s390x: PER instruction-fetch " Aurelien Jarno
2015-06-12 22:45 ` [Qemu-devel] [PATCH 11/15] translate-all: fix watchpoints if retranslation not possible Aurelien Jarno
2015-06-12 22:46 ` [Qemu-devel] [PATCH 12/15] target-s390x: PER storage-alteration event support Aurelien Jarno
2015-06-12 22:46 ` [Qemu-devel] [PATCH 13/15] target-s390x: PER store-using-real-address " Aurelien Jarno
2015-06-12 22:46 ` [Qemu-devel] [PATCH 14/15] target-s390x: PER instruction-fetch nullification " Aurelien Jarno
2015-06-12 22:46 ` [Qemu-devel] [PATCH 15/15] target-s390x: PER: add Breaking-Event-Address register Aurelien Jarno
2015-06-16 16:44   ` Alexander Graf [this message]
2015-06-16 17:44     ` Aurelien Jarno
2015-06-16 17:50       ` Alexander Graf
2015-06-16 17:55 ` [Qemu-devel] [PATCH 00/15] target-s390x: add Program-Event Recording feature Alexander Graf

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=5580525F.3010001@suse.de \
    --to=agraf@suse.de \
    --cc=aurelien@aurel32.net \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /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.