All of lore.kernel.org
 help / color / mirror / Atom feed
From: Blue Swirl <blauwirbel@gmail.com>
To: Max Filippov <jcmvbkbc@gmail.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v4 22/32] target-xtensa: implement unaligned exception option
Date: Sun, 4 Sep 2011 18:28:44 +0000	[thread overview]
Message-ID: <CAAu8pHuDwkY9yO_T5ebRjG9_oLbzhf57-JWB0Ru361NVhdOigg@mail.gmail.com> (raw)
In-Reply-To: <1314909960-31738-23-git-send-email-jcmvbkbc@gmail.com>

On Thu, Sep 1, 2011 at 8:45 PM, Max Filippov <jcmvbkbc@gmail.com> wrote:
> See ISA, 4.4.4 for details.
>
> Correct (aligned as per ISA) address for unaligned access is generated
> in case this option is not enabled.
>
> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
> ---
>  target-xtensa/helper.c    |    4 ++-
>  target-xtensa/op_helper.c |   26 ++++++++++++++++++++++++
>  target-xtensa/translate.c |   47 ++++++++++++++++++++++++++++++++++++++++++--
>  3 files changed, 73 insertions(+), 4 deletions(-)
>
> diff --git a/target-xtensa/helper.c b/target-xtensa/helper.c
> index 074207f..bcd6c77 100644
> --- a/target-xtensa/helper.c
> +++ b/target-xtensa/helper.c
> @@ -45,7 +45,9 @@ void cpu_reset(CPUXtensaState *env)
>  static const XtensaConfig core_config[] = {
>     {
>         .name = "sample-xtensa-core",
> -        .options = -1,
> +        .options = -1 ^
> +            (XTENSA_OPTION_BIT(XTENSA_OPTION_HW_ALIGNMENT) |
> +             XTENSA_OPTION_BIT(XTENSA_OPTION_MMU)),
>         .nareg = 64,
>         .ndepc = 1,
>         .excm_level = 16,
> diff --git a/target-xtensa/op_helper.c b/target-xtensa/op_helper.c
> index 26d2d2e..8577f5d 100644
> --- a/target-xtensa/op_helper.c
> +++ b/target-xtensa/op_helper.c
> @@ -30,6 +30,10 @@
>  #include "helpers.h"
>  #include "host-utils.h"
>
> +static void do_unaligned_access(target_ulong addr, int is_write, int is_user,
> +        void *retaddr);
> +
> +#define ALIGNED_ONLY
>  #define MMUSUFFIX _mmu
>
>  #define SHIFT 0
> @@ -44,6 +48,28 @@
>  #define SHIFT 3
>  #include "softmmu_template.h"
>
> +static void do_restore_state(void *pc_ptr)
> +{
> +    TranslationBlock *tb;
> +    uint32_t pc = (uint32_t)(intptr_t)pc_ptr;
> +
> +    tb = tb_find_pc(pc);
> +    if (tb) {
> +        cpu_restore_state(tb, env, pc);
> +    }
> +}
> +
> +static void do_unaligned_access(target_ulong addr, int is_write, int is_user,
> +        void *retaddr)
> +{
> +    if (xtensa_option_enabled(env->config, XTENSA_OPTION_UNALIGNED_EXCEPTION) &&
> +            !xtensa_option_enabled(env->config, XTENSA_OPTION_HW_ALIGNMENT)) {
> +        do_restore_state(retaddr);
> +        HELPER(exception_cause_vaddr)(
> +                env->pc, LOAD_STORE_ALIGNMENT_CAUSE, addr);
> +    }
> +}
> +
>  void tlb_fill(target_ulong addr, int is_write, int mmu_idx, void *retaddr)
>  {
>     tlb_set_page(cpu_single_env,
> diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
> index 7bcbe4f..ad2b699 100644
> --- a/target-xtensa/translate.c
> +++ b/target-xtensa/translate.c
> @@ -203,6 +203,16 @@ static void gen_exception_cause(DisasContext *dc, uint32_t cause)
>     tcg_temp_free(_cause);
>  }
>
> +static void gen_exception_cause_vaddr(DisasContext *dc, uint32_t cause,
> +        TCGv_i32 vaddr)
> +{
> +    TCGv_i32 _pc = tcg_const_i32(dc->pc);
> +    TCGv_i32 _cause = tcg_const_i32(cause);

Underscores.

> +    gen_helper_exception_cause_vaddr(_pc, _cause, vaddr);
> +    tcg_temp_free(_pc);
> +    tcg_temp_free(_cause);
> +}
> +
>  static void gen_check_privilege(DisasContext *dc)
>  {
>     if (dc->cring) {
> @@ -397,6 +407,23 @@ static void gen_wsr(DisasContext *dc, uint32_t sr, TCGv_i32 s)
>     }
>  }
>
> +static void gen_load_store_alignment(DisasContext *dc, int shift,
> +        TCGv_i32 addr, bool no_hw_alignment)
> +{
> +    if (!option_enabled(dc, XTENSA_OPTION_UNALIGNED_EXCEPTION)) {
> +        tcg_gen_andi_i32(addr, addr, ~0 << shift);
> +    } else if (option_enabled(dc, XTENSA_OPTION_HW_ALIGNMENT) &&
> +            no_hw_alignment) {
> +        int label = gen_new_label();
> +        TCGv_i32 tmp = tcg_temp_new_i32();
> +        tcg_gen_andi_i32(tmp, addr, ~(~0 << shift));
> +        tcg_gen_brcondi_i32(TCG_COND_EQ, tmp, 0, label);
> +        gen_exception_cause_vaddr(dc, LOAD_STORE_ALIGNMENT_CAUSE, addr);
> +        gen_set_label(label);
> +        tcg_temp_free(tmp);
> +    }
> +}
> +
>  static void disas_xtensa_insn(DisasContext *dc)
>  {
>  #define HAS_OPTION(opt) do { \
> @@ -1339,6 +1366,9 @@ static void disas_xtensa_insn(DisasContext *dc)
>  #define gen_load_store(type, shift) do { \
>             TCGv_i32 addr = tcg_temp_new_i32(); \
>             tcg_gen_addi_i32(addr, cpu_R[RRI8_S], RRI8_IMM8 << shift); \
> +            if (shift) { \
> +                gen_load_store_alignment(dc, shift, addr, false); \
> +            } \
>             tcg_gen_qemu_##type(cpu_R[RRI8_T], addr, dc->cring); \
>             tcg_temp_free(addr); \
>         } while (0)
> @@ -1468,6 +1498,7 @@ static void disas_xtensa_insn(DisasContext *dc)
>         case 9: /*L16SI*/
>             gen_load_store(ld16s, 1);
>             break;
> +#undef gen_load_store
>
>         case 10: /*MOVI*/
>             tcg_gen_movi_i32(cpu_R[RRI8_T],
> @@ -1475,9 +1506,17 @@ static void disas_xtensa_insn(DisasContext *dc)
>                     ((RRI8_S & 0x8) ? 0xfffff000 : 0));
>             break;
>
> +#define gen_load_store_no_hw_align(type) do { \
> +            TCGv_i32 addr = tcg_temp_local_new_i32(); \
> +            tcg_gen_addi_i32(addr, cpu_R[RRI8_S], RRI8_IMM8 << 2); \
> +            gen_load_store_alignment(dc, 2, addr, true); \
> +            tcg_gen_qemu_##type(cpu_R[RRI8_T], addr, dc->cring); \
> +            tcg_temp_free(addr); \
> +        } while (0)
> +
>         case 11: /*L32AIy*/
>             HAS_OPTION(XTENSA_OPTION_MP_SYNCHRO);
> -            gen_load_store(ld32u, 2); /*TODO acquire?*/
> +            gen_load_store_no_hw_align(ld32u); /*TODO acquire?*/
>             break;
>
>         case 12: /*ADDI*/
> @@ -1497,6 +1536,7 @@ static void disas_xtensa_insn(DisasContext *dc)
>
>                 tcg_gen_mov_i32(tmp, cpu_R[RRI8_T]);
>                 tcg_gen_addi_i32(addr, cpu_R[RRI8_S], RRI8_IMM8 << 2);
> +                gen_load_store_alignment(dc, 2, addr, true);
>                 tcg_gen_qemu_ld32u(cpu_R[RRI8_T], addr, dc->cring);
>                 tcg_gen_brcond_i32(TCG_COND_NE, cpu_R[RRI8_T],
>                         cpu_SR[SCOMPARE1], label);
> @@ -1511,15 +1551,15 @@ static void disas_xtensa_insn(DisasContext *dc)
>
>         case 15: /*S32RIy*/
>             HAS_OPTION(XTENSA_OPTION_MP_SYNCHRO);
> -            gen_load_store(st32, 2); /*TODO release?*/
> +            gen_load_store_no_hw_align(st32); /*TODO release?*/
>             break;
> +#undef gen_load_store_no_hw_align
>
>         default: /*reserved*/
>             RESERVED();
>             break;
>         }
>         break;
> -#undef gen_load_store
>
>     case 3: /*LSCIp*/
>         HAS_OPTION(XTENSA_OPTION_COPROCESSOR);
> @@ -1725,6 +1765,7 @@ static void disas_xtensa_insn(DisasContext *dc)
>  #define gen_narrow_load_store(type) do { \
>             TCGv_i32 addr = tcg_temp_new_i32(); \
>             tcg_gen_addi_i32(addr, cpu_R[RRRN_S], RRRN_R << 2); \
> +            gen_load_store_alignment(dc, 2, addr, false); \
>             tcg_gen_qemu_##type(cpu_R[RRRN_T], addr, dc->cring); \
>             tcg_temp_free(addr); \
>         } while (0)
> --
> 1.7.6
>
>
>

  reply	other threads:[~2011-09-04 18:29 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-01 20:45 [Qemu-devel] [PATCH v4 00/32] target-xtensa: new target architecture Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 01/32] target-xtensa: add target stubs Max Filippov
2011-09-04 18:14   ` Blue Swirl
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 02/32] target-xtensa: add target to the configure script Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 03/32] target-xtensa: implement disas_xtensa_insn Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 04/32] target-xtensa: implement narrow instructions Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 05/32] target-xtensa: implement RT0 group Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 06/32] target-xtensa: add sample board Max Filippov
2011-09-04 18:17   ` Blue Swirl
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 07/32] target-xtensa: implement conditional jumps Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 08/32] target-xtensa: implement JX/RET0/CALLX Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 09/32] target-xtensa: add special and user registers Max Filippov
2011-09-04 18:18   ` Blue Swirl
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 10/32] target-xtensa: implement RST3 group Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 11/32] target-xtensa: implement shifts (ST1 and RST1 groups) Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 12/32] target-xtensa: implement LSAI group Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 13/32] target-xtensa: mark reserved and TBD opcodes Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 14/32] target-xtensa: implement SYNC group Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 15/32] target-xtensa: implement CACHE group Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 16/32] target-xtensa: add PS register and access control Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 17/32] target-xtensa: implement exceptions Max Filippov
2011-09-04 18:22   ` Blue Swirl
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 18/32] target-xtensa: implement RST2 group (32 bit mul/div/rem) Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 19/32] target-xtensa: implement windowed registers Max Filippov
2011-09-04 18:27   ` Blue Swirl
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 20/32] target-xtensa: implement loop option Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 21/32] target-xtensa: implement extended L32R Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 22/32] target-xtensa: implement unaligned exception option Max Filippov
2011-09-04 18:28   ` Blue Swirl [this message]
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 23/32] target-xtensa: implement SIMCALL Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 24/32] target-xtensa: implement interrupt option Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 25/32] target-xtensa: implement accurate window check Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 26/32] target-xtensa: implement CPENABLE and PRID SRs Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 27/32] target-xtensa: implement relocatable vectors Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 28/32] target-xtensa: add gdb support Max Filippov
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 29/32] target-xtensa: implement memory protection options Max Filippov
2011-09-04 18:32   ` Blue Swirl
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 30/32] target-xtensa: add dc232b core and board Max Filippov
2011-09-04 18:33   ` Blue Swirl
2011-09-01 20:45 ` [Qemu-devel] [PATCH v4 31/32] MAINTAINERS: add xtensa maintainer Max Filippov
2011-09-01 20:46 ` [Qemu-devel] [PATCH v4 32/32] target-xtensa: add regression testsuite Max Filippov
2011-09-04 18:35 ` [Qemu-devel] [PATCH v4 00/32] target-xtensa: new target architecture Blue Swirl
2011-09-05 10:55   ` Edgar E. Iglesias
2011-09-05 12:35     ` Max Filippov
2011-09-14 21:18       ` Edgar E. Iglesias
2011-09-14 22:24         ` Max Filippov
2011-09-14 22:28           ` Edgar E. Iglesias

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=CAAu8pHuDwkY9yO_T5ebRjG9_oLbzhf57-JWB0Ru361NVhdOigg@mail.gmail.com \
    --to=blauwirbel@gmail.com \
    --cc=jcmvbkbc@gmail.com \
    --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.