Re: [Qemu-devel] [PATCH 6/6] [RFC] SPARCV8 asr17 register support.

2010-12-13 Thread Fabien Chouteau

On 12/11/2010 10:59 AM, Blue Swirl wrote:

On Tue, Dec 7, 2010 at 11:51 AM, Fabien Chouteauchout...@adacore.com  wrote:

On 12/06/2010 07:01 PM, Blue Swirl wrote:


On Mon, Dec 6, 2010 at 9:26 AM, Fabien Chouteauchout...@adacore.com
  wrote:


Signed-off-by: Fabien Chouteauchout...@adacore.com
---
  hw/leon3.c   |6 ++
  target-sparc/cpu.h   |1 +
  target-sparc/machine.c   |2 ++
  target-sparc/translate.c |   10 ++
  4 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/hw/leon3.c b/hw/leon3.c
index ba61081..9605ce8 100644
--- a/hw/leon3.c
+++ b/hw/leon3.c
@@ -187,6 +187,12 @@ static void main_cpu_reset(void *opaque)
values */
 leon3_state.inst_cache_conf = 0x1022;
 leon3_state.data_cache_conf = 0x1822;
+
+/* Asr17 for Leon3 mono-processor */
+env-asr17= 028;  /* CPU id */
+env-asr17= 18;   /* SPARC V8 multiply and divide
available */
+env-asr17= env-nwindows -1; /* Number of implemented registers
+   windows */


This is constant...


  }

  static void leon3_generic_hw_init(ram_addr_t  ram_size,
diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h
index 6020ffd..36d49fc 100644
--- a/target-sparc/cpu.h
+++ b/target-sparc/cpu.h
@@ -341,6 +341,7 @@ typedef struct CPUSPARCState {
   from PSR) */
  #if !defined(TARGET_SPARC64) || defined(TARGET_ABI32)
 uint32_t wim;  /* window invalid mask */
+uint32_t asr17;/* asr17 */


... so no new env fields are needed...


  #endif
 target_ulong tbr;  /* trap base register */
  #if !defined(TARGET_SPARC64)
diff --git a/target-sparc/machine.c b/target-sparc/machine.c
index 752e431..c530bd3 100644
--- a/target-sparc/machine.c
+++ b/target-sparc/machine.c
@@ -42,6 +42,7 @@ void cpu_save(QEMUFile *f, void *opaque)
 qemu_put_be32s(f,env-pil_in);
  #ifndef TARGET_SPARC64
 qemu_put_be32s(f,env-wim);
+qemu_put_be32s(f,env-asr17);


... there's also nothing to save/load...


 /* MMU */
 for (i = 0; i32; i++)
 qemu_put_be32s(f,env-mmuregs[i]);
@@ -138,6 +139,7 @@ int cpu_load(QEMUFile *f, void *opaque, int
version_id)
 qemu_get_be32s(f,env-pil_in);
  #ifndef TARGET_SPARC64
 qemu_get_be32s(f,env-wim);
+qemu_get_be32s(f,env-asr17);
 /* MMU */
 for (i = 0; i32; i++)
 qemu_get_be32s(f,env-mmuregs[i]);
diff --git a/target-sparc/translate.c b/target-sparc/translate.c
index 23f9519..65de614 100644
--- a/target-sparc/translate.c
+++ b/target-sparc/translate.c
@@ -58,6 +58,7 @@ static TCGv cpu_hintp, cpu_htba, cpu_hver, cpu_ssr,
cpu_ver;
  static TCGv_i32 cpu_softint;
  #else
  static TCGv cpu_wim;
+static TCGv cpu_asr17;
  #endif
  /* local register indexes (only used inside old micro ops) */
  static TCGv cpu_tmp0;
@@ -2049,6 +2050,8 @@ static void disas_sparc_insn(DisasContext * dc)
 rs1 = GET_FIELD(insn, 13, 17);
 switch(rs1) {
 case 0: /* rdy */
+gen_movl_TN_reg(rd, cpu_y);
+break;
  #ifndef TARGET_SPARC64
 case 0x01 ... 0x0e: /* undefined in the SPARCv8
manual, rdy on the microSPARC
@@ -2058,6 +2061,11 @@ static void disas_sparc_insn(DisasContext * dc)
 case 0x10 ... 0x1f: /* implementation-dependent in the
SPARCv8 manual, rdy on the
microSPARC II */
+
+if (rs1 == 0x11) { /* Read %asr17 */
+gen_movl_TN_reg(rd, cpu_asr17);


Instead:
r_const = tcg_const_tl(asr constants  | dc-def-nwindows - 1);
gen_movl_TN_reg(rd, r_const);
tcg_temp_free(r_const);


OK for me, if it is acceptable to have this Leon3's specific behavior for
all the SPARC32 CPUs.


This will not affect other CPUs when you use CPU feature bits to make
the ASR only available to Leon3.


OK, I will try that.

--
Fabien Chouteau




Re: [Qemu-devel] [PATCH 6/6] [RFC] SPARCV8 asr17 register support.

2010-12-11 Thread Blue Swirl
On Tue, Dec 7, 2010 at 11:51 AM, Fabien Chouteau chout...@adacore.com wrote:
 On 12/06/2010 07:01 PM, Blue Swirl wrote:

 On Mon, Dec 6, 2010 at 9:26 AM, Fabien Chouteauchout...@adacore.com
  wrote:

 Signed-off-by: Fabien Chouteauchout...@adacore.com
 ---
  hw/leon3.c               |    6 ++
  target-sparc/cpu.h       |    1 +
  target-sparc/machine.c   |    2 ++
  target-sparc/translate.c |   10 ++
  4 files changed, 19 insertions(+), 0 deletions(-)

 diff --git a/hw/leon3.c b/hw/leon3.c
 index ba61081..9605ce8 100644
 --- a/hw/leon3.c
 +++ b/hw/leon3.c
 @@ -187,6 +187,12 @@ static void main_cpu_reset(void *opaque)
        values */
     leon3_state.inst_cache_conf = 0x1022;
     leon3_state.data_cache_conf = 0x1822;
 +
 +    /* Asr17 for Leon3 mono-processor */
 +    env-asr17= 0  28;          /* CPU id */
 +    env-asr17= 1  8;           /* SPARC V8 multiply and divide
 available */
 +    env-asr17= env-nwindows -1; /* Number of implemented registers
 +                                       windows */

 This is constant...

  }

  static void leon3_generic_hw_init(ram_addr_t  ram_size,
 diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h
 index 6020ffd..36d49fc 100644
 --- a/target-sparc/cpu.h
 +++ b/target-sparc/cpu.h
 @@ -341,6 +341,7 @@ typedef struct CPUSPARCState {
                           from PSR) */
  #if !defined(TARGET_SPARC64) || defined(TARGET_ABI32)
     uint32_t wim;      /* window invalid mask */
 +    uint32_t asr17;    /* asr17 */

 ... so no new env fields are needed...

  #endif
     target_ulong tbr;  /* trap base register */
  #if !defined(TARGET_SPARC64)
 diff --git a/target-sparc/machine.c b/target-sparc/machine.c
 index 752e431..c530bd3 100644
 --- a/target-sparc/machine.c
 +++ b/target-sparc/machine.c
 @@ -42,6 +42,7 @@ void cpu_save(QEMUFile *f, void *opaque)
     qemu_put_be32s(f,env-pil_in);
  #ifndef TARGET_SPARC64
     qemu_put_be32s(f,env-wim);
 +    qemu_put_be32s(f,env-asr17);

 ... there's also nothing to save/load...

     /* MMU */
     for (i = 0; i  32; i++)
         qemu_put_be32s(f,env-mmuregs[i]);
 @@ -138,6 +139,7 @@ int cpu_load(QEMUFile *f, void *opaque, int
 version_id)
     qemu_get_be32s(f,env-pil_in);
  #ifndef TARGET_SPARC64
     qemu_get_be32s(f,env-wim);
 +    qemu_get_be32s(f,env-asr17);
     /* MMU */
     for (i = 0; i  32; i++)
         qemu_get_be32s(f,env-mmuregs[i]);
 diff --git a/target-sparc/translate.c b/target-sparc/translate.c
 index 23f9519..65de614 100644
 --- a/target-sparc/translate.c
 +++ b/target-sparc/translate.c
 @@ -58,6 +58,7 @@ static TCGv cpu_hintp, cpu_htba, cpu_hver, cpu_ssr,
 cpu_ver;
  static TCGv_i32 cpu_softint;
  #else
  static TCGv cpu_wim;
 +static TCGv cpu_asr17;
  #endif
  /* local register indexes (only used inside old micro ops) */
  static TCGv cpu_tmp0;
 @@ -2049,6 +2050,8 @@ static void disas_sparc_insn(DisasContext * dc)
                 rs1 = GET_FIELD(insn, 13, 17);
                 switch(rs1) {
                 case 0: /* rdy */
 +                    gen_movl_TN_reg(rd, cpu_y);
 +                    break;
  #ifndef TARGET_SPARC64
                 case 0x01 ... 0x0e: /* undefined in the SPARCv8
                                        manual, rdy on the microSPARC
 @@ -2058,6 +2061,11 @@ static void disas_sparc_insn(DisasContext * dc)
                 case 0x10 ... 0x1f: /* implementation-dependent in the
                                        SPARCv8 manual, rdy on the
                                        microSPARC II */
 +
 +                    if (rs1 == 0x11) { /* Read %asr17 */
 +                        gen_movl_TN_reg(rd, cpu_asr17);

 Instead:
 r_const = tcg_const_tl(asr constants  | dc-def-nwindows - 1);
 gen_movl_TN_reg(rd, r_const);
 tcg_temp_free(r_const);

 OK for me, if it is acceptable to have this Leon3's specific behavior for
 all the SPARC32 CPUs.

This will not affect other CPUs when you use CPU feature bits to make
the ASR only available to Leon3.



Re: [Qemu-devel] [PATCH 6/6] [RFC] SPARCV8 asr17 register support.

2010-12-07 Thread Fabien Chouteau

On 12/06/2010 07:01 PM, Blue Swirl wrote:

On Mon, Dec 6, 2010 at 9:26 AM, Fabien Chouteauchout...@adacore.com  wrote:


Signed-off-by: Fabien Chouteauchout...@adacore.com
---
  hw/leon3.c   |6 ++
  target-sparc/cpu.h   |1 +
  target-sparc/machine.c   |2 ++
  target-sparc/translate.c |   10 ++
  4 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/hw/leon3.c b/hw/leon3.c
index ba61081..9605ce8 100644
--- a/hw/leon3.c
+++ b/hw/leon3.c
@@ -187,6 +187,12 @@ static void main_cpu_reset(void *opaque)
values */
 leon3_state.inst_cache_conf = 0x1022;
 leon3_state.data_cache_conf = 0x1822;
+
+/* Asr17 for Leon3 mono-processor */
+env-asr17= 0  28;  /* CPU id */
+env-asr17= 1  8;   /* SPARC V8 multiply and divide available */
+env-asr17= env-nwindows -1; /* Number of implemented registers
+   windows */


This is constant...


  }

  static void leon3_generic_hw_init(ram_addr_t  ram_size,
diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h
index 6020ffd..36d49fc 100644
--- a/target-sparc/cpu.h
+++ b/target-sparc/cpu.h
@@ -341,6 +341,7 @@ typedef struct CPUSPARCState {
   from PSR) */
  #if !defined(TARGET_SPARC64) || defined(TARGET_ABI32)
 uint32_t wim;  /* window invalid mask */
+uint32_t asr17;/* asr17 */


... so no new env fields are needed...


  #endif
 target_ulong tbr;  /* trap base register */
  #if !defined(TARGET_SPARC64)
diff --git a/target-sparc/machine.c b/target-sparc/machine.c
index 752e431..c530bd3 100644
--- a/target-sparc/machine.c
+++ b/target-sparc/machine.c
@@ -42,6 +42,7 @@ void cpu_save(QEMUFile *f, void *opaque)
 qemu_put_be32s(f,env-pil_in);
  #ifndef TARGET_SPARC64
 qemu_put_be32s(f,env-wim);
+qemu_put_be32s(f,env-asr17);


... there's also nothing to save/load...


 /* MMU */
 for (i = 0; i  32; i++)
 qemu_put_be32s(f,env-mmuregs[i]);
@@ -138,6 +139,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
 qemu_get_be32s(f,env-pil_in);
  #ifndef TARGET_SPARC64
 qemu_get_be32s(f,env-wim);
+qemu_get_be32s(f,env-asr17);
 /* MMU */
 for (i = 0; i  32; i++)
 qemu_get_be32s(f,env-mmuregs[i]);
diff --git a/target-sparc/translate.c b/target-sparc/translate.c
index 23f9519..65de614 100644
--- a/target-sparc/translate.c
+++ b/target-sparc/translate.c
@@ -58,6 +58,7 @@ static TCGv cpu_hintp, cpu_htba, cpu_hver, cpu_ssr, cpu_ver;
  static TCGv_i32 cpu_softint;
  #else
  static TCGv cpu_wim;
+static TCGv cpu_asr17;
  #endif
  /* local register indexes (only used inside old micro ops) */
  static TCGv cpu_tmp0;
@@ -2049,6 +2050,8 @@ static void disas_sparc_insn(DisasContext * dc)
 rs1 = GET_FIELD(insn, 13, 17);
 switch(rs1) {
 case 0: /* rdy */
+gen_movl_TN_reg(rd, cpu_y);
+break;
  #ifndef TARGET_SPARC64
 case 0x01 ... 0x0e: /* undefined in the SPARCv8
manual, rdy on the microSPARC
@@ -2058,6 +2061,11 @@ static void disas_sparc_insn(DisasContext * dc)
 case 0x10 ... 0x1f: /* implementation-dependent in the
SPARCv8 manual, rdy on the
microSPARC II */
+
+if (rs1 == 0x11) { /* Read %asr17 */
+gen_movl_TN_reg(rd, cpu_asr17);


Instead:
r_const = tcg_const_tl(asr constants  | dc-def-nwindows - 1);
gen_movl_TN_reg(rd, r_const);
tcg_temp_free(r_const);


OK for me, if it is acceptable to have this Leon3's specific behavior 
for all the SPARC32 CPUs.


--
Fabien Chouteau




[Qemu-devel] [PATCH 6/6] [RFC] SPARCV8 asr17 register support.

2010-12-06 Thread Fabien Chouteau

Signed-off-by: Fabien Chouteau chout...@adacore.com
---
 hw/leon3.c   |6 ++
 target-sparc/cpu.h   |1 +
 target-sparc/machine.c   |2 ++
 target-sparc/translate.c |   10 ++
 4 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/hw/leon3.c b/hw/leon3.c
index ba61081..9605ce8 100644
--- a/hw/leon3.c
+++ b/hw/leon3.c
@@ -187,6 +187,12 @@ static void main_cpu_reset(void *opaque)
values */
 leon3_state.inst_cache_conf = 0x1022;
 leon3_state.data_cache_conf = 0x1822;
+
+/* Asr17 for Leon3 mono-processor */
+env-asr17 = 0  28;  /* CPU id */
+env-asr17 = 1  8;   /* SPARC V8 multiply and divide available 
*/
+env-asr17 = env-nwindows -1; /* Number of implemented registers
+   windows */
 }
 
 static void leon3_generic_hw_init(ram_addr_t  ram_size,
diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h
index 6020ffd..36d49fc 100644
--- a/target-sparc/cpu.h
+++ b/target-sparc/cpu.h
@@ -341,6 +341,7 @@ typedef struct CPUSPARCState {
   from PSR) */
 #if !defined(TARGET_SPARC64) || defined(TARGET_ABI32)
 uint32_t wim;  /* window invalid mask */
+uint32_t asr17;/* asr17 */
 #endif
 target_ulong tbr;  /* trap base register */
 #if !defined(TARGET_SPARC64)
diff --git a/target-sparc/machine.c b/target-sparc/machine.c
index 752e431..c530bd3 100644
--- a/target-sparc/machine.c
+++ b/target-sparc/machine.c
@@ -42,6 +42,7 @@ void cpu_save(QEMUFile *f, void *opaque)
 qemu_put_be32s(f, env-pil_in);
 #ifndef TARGET_SPARC64
 qemu_put_be32s(f, env-wim);
+qemu_put_be32s(f, env-asr17);
 /* MMU */
 for (i = 0; i  32; i++)
 qemu_put_be32s(f, env-mmuregs[i]);
@@ -138,6 +139,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
 qemu_get_be32s(f, env-pil_in);
 #ifndef TARGET_SPARC64
 qemu_get_be32s(f, env-wim);
+qemu_get_be32s(f, env-asr17);
 /* MMU */
 for (i = 0; i  32; i++)
 qemu_get_be32s(f, env-mmuregs[i]);
diff --git a/target-sparc/translate.c b/target-sparc/translate.c
index 23f9519..65de614 100644
--- a/target-sparc/translate.c
+++ b/target-sparc/translate.c
@@ -58,6 +58,7 @@ static TCGv cpu_hintp, cpu_htba, cpu_hver, cpu_ssr, cpu_ver;
 static TCGv_i32 cpu_softint;
 #else
 static TCGv cpu_wim;
+static TCGv cpu_asr17;
 #endif
 /* local register indexes (only used inside old micro ops) */
 static TCGv cpu_tmp0;
@@ -2049,6 +2050,8 @@ static void disas_sparc_insn(DisasContext * dc)
 rs1 = GET_FIELD(insn, 13, 17);
 switch(rs1) {
 case 0: /* rdy */
+gen_movl_TN_reg(rd, cpu_y);
+break;
 #ifndef TARGET_SPARC64
 case 0x01 ... 0x0e: /* undefined in the SPARCv8
manual, rdy on the microSPARC
@@ -2058,6 +2061,11 @@ static void disas_sparc_insn(DisasContext * dc)
 case 0x10 ... 0x1f: /* implementation-dependent in the
SPARCv8 manual, rdy on the
microSPARC II */
+
+if (rs1 == 0x11) { /* Read %asr17 */
+gen_movl_TN_reg(rd, cpu_asr17);
+break;
+}
 #endif
 gen_movl_TN_reg(rd, cpu_y);
 break;
@@ -5019,6 +5027,8 @@ void gen_intermediate_code_init(CPUSPARCState *env)
 #else
 cpu_wim = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, wim),
  wim);
+cpu_asr17 = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, asr17),
+ asr17);
 #endif
 cpu_cond = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, cond),
   cond);
-- 
1.7.1




Re: [Qemu-devel] [PATCH 6/6] [RFC] SPARCV8 asr17 register support.

2010-12-06 Thread Blue Swirl
On Mon, Dec 6, 2010 at 9:26 AM, Fabien Chouteau chout...@adacore.com wrote:

 Signed-off-by: Fabien Chouteau chout...@adacore.com
 ---
  hw/leon3.c               |    6 ++
  target-sparc/cpu.h       |    1 +
  target-sparc/machine.c   |    2 ++
  target-sparc/translate.c |   10 ++
  4 files changed, 19 insertions(+), 0 deletions(-)

 diff --git a/hw/leon3.c b/hw/leon3.c
 index ba61081..9605ce8 100644
 --- a/hw/leon3.c
 +++ b/hw/leon3.c
 @@ -187,6 +187,12 @@ static void main_cpu_reset(void *opaque)
        values */
     leon3_state.inst_cache_conf = 0x1022;
     leon3_state.data_cache_conf = 0x1822;
 +
 +    /* Asr17 for Leon3 mono-processor */
 +    env-asr17 = 0  28;          /* CPU id */
 +    env-asr17 = 1  8;           /* SPARC V8 multiply and divide 
 available */
 +    env-asr17 = env-nwindows -1; /* Number of implemented registers
 +                                       windows */

This is constant...

  }

  static void leon3_generic_hw_init(ram_addr_t  ram_size,
 diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h
 index 6020ffd..36d49fc 100644
 --- a/target-sparc/cpu.h
 +++ b/target-sparc/cpu.h
 @@ -341,6 +341,7 @@ typedef struct CPUSPARCState {
                           from PSR) */
  #if !defined(TARGET_SPARC64) || defined(TARGET_ABI32)
     uint32_t wim;      /* window invalid mask */
 +    uint32_t asr17;    /* asr17 */

... so no new env fields are needed...

  #endif
     target_ulong tbr;  /* trap base register */
  #if !defined(TARGET_SPARC64)
 diff --git a/target-sparc/machine.c b/target-sparc/machine.c
 index 752e431..c530bd3 100644
 --- a/target-sparc/machine.c
 +++ b/target-sparc/machine.c
 @@ -42,6 +42,7 @@ void cpu_save(QEMUFile *f, void *opaque)
     qemu_put_be32s(f, env-pil_in);
  #ifndef TARGET_SPARC64
     qemu_put_be32s(f, env-wim);
 +    qemu_put_be32s(f, env-asr17);

... there's also nothing to save/load...

     /* MMU */
     for (i = 0; i  32; i++)
         qemu_put_be32s(f, env-mmuregs[i]);
 @@ -138,6 +139,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
     qemu_get_be32s(f, env-pil_in);
  #ifndef TARGET_SPARC64
     qemu_get_be32s(f, env-wim);
 +    qemu_get_be32s(f, env-asr17);
     /* MMU */
     for (i = 0; i  32; i++)
         qemu_get_be32s(f, env-mmuregs[i]);
 diff --git a/target-sparc/translate.c b/target-sparc/translate.c
 index 23f9519..65de614 100644
 --- a/target-sparc/translate.c
 +++ b/target-sparc/translate.c
 @@ -58,6 +58,7 @@ static TCGv cpu_hintp, cpu_htba, cpu_hver, cpu_ssr, cpu_ver;
  static TCGv_i32 cpu_softint;
  #else
  static TCGv cpu_wim;
 +static TCGv cpu_asr17;
  #endif
  /* local register indexes (only used inside old micro ops) */
  static TCGv cpu_tmp0;
 @@ -2049,6 +2050,8 @@ static void disas_sparc_insn(DisasContext * dc)
                 rs1 = GET_FIELD(insn, 13, 17);
                 switch(rs1) {
                 case 0: /* rdy */
 +                    gen_movl_TN_reg(rd, cpu_y);
 +                    break;
  #ifndef TARGET_SPARC64
                 case 0x01 ... 0x0e: /* undefined in the SPARCv8
                                        manual, rdy on the microSPARC
 @@ -2058,6 +2061,11 @@ static void disas_sparc_insn(DisasContext * dc)
                 case 0x10 ... 0x1f: /* implementation-dependent in the
                                        SPARCv8 manual, rdy on the
                                        microSPARC II */
 +
 +                    if (rs1 == 0x11) { /* Read %asr17 */
 +                        gen_movl_TN_reg(rd, cpu_asr17);

Instead:
r_const = tcg_const_tl(asr constants  | dc-def-nwindows - 1);
gen_movl_TN_reg(rd, r_const);
tcg_temp_free(r_const);