qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
@ 2015-05-28 21:09 Aurelio C. Remonda
  2015-05-28 21:22 ` Liviu Ionescu
  2015-05-30 10:46 ` Peter Crosthwaite
  0 siblings, 2 replies; 15+ messages in thread
From: Aurelio C. Remonda @ 2015-05-28 21:09 UTC (permalink / raw)
  To: qemu-devel, ilg, peter.maydell, martin.galvan, daniel.gutson

This patch adds the Cortex-M4 CPU. The M4 is basically the same as the M3,
the main differences being the DSP instructions and an optional FPU.
The DSP instructions are already implemented in Qemu, as the A and R profiles
use them.

I created an ARM_FEATURE_THUMB_DSP to be added to any non-M thumb2-compatible
CPU that uses DSP instructions, and I manually added it to the M4 in its initfn.

The optional FPU in the M4 could be added in the future as a "Cortex-M4F" CPU.
All we'd have to do is add the ARM_FEATURE_VFP4 to the initfn.

There are 85 DSP instructions (all of them thumb2). On disas_thumb2_insn
the DSP feature is tested before the instruction is generated; if it's not
enabled then its an illegal op.

Signed-off-by: Aurelio C. Remonda <aurelioremonda@gmail.com>
---
 target-arm/cpu.c       |  22 +++++++++
 target-arm/cpu.h       |   1 +
 target-arm/translate.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 149 insertions(+), 4 deletions(-)

diff --git a/target-arm/cpu.c b/target-arm/cpu.c
index 3ca3fa8..9be4a06 100644
--- a/target-arm/cpu.c
+++ b/target-arm/cpu.c
@@ -512,6 +512,10 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
     if (arm_feature(env, ARM_FEATURE_CBAR_RO)) {
         set_feature(env, ARM_FEATURE_CBAR);
     }
+    if (arm_feature(env,ARM_FEATURE_THUMB2) &&
+        !arm_feature(env,ARM_FEATURE_M)) {
+        set_feature(env, ARM_FEATURE_THUMB_DSP);
+    }
 
     if (cpu->reset_hivecs) {
             cpu->reset_sctlr |= (1 << 13);
@@ -761,6 +765,22 @@ static void cortex_m3_initfn(Object *obj)
     set_feature(&cpu->env, ARM_FEATURE_M);
     cpu->midr = 0x410fc231;
 }
+static void cortex_m4_initfn(Object *obj)
+{
+    ARMCPU *cpu = ARM_CPU(obj);
+    set_feature(&cpu->env, ARM_FEATURE_V7);
+    set_feature(&cpu->env, ARM_FEATURE_M);
+    set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
+    cpu->midr = 0x410fc240;
+    /* Main id register CPUID bit assignments
+     * Bits    NAME        Function
+     * [31:24] IMPLEMENTER Indicates implementor: 0x41 = ARM
+     * [23:20] VARIANT     Indicates processor revision: 0x0 = Revision 0
+     * [19:16] (Constant)  Reads as 0xF
+     * [15:4]  PARTNO      Indicates part number: 0xC24 = Cortex-M4
+     * [3:0]   REVISION    Indicates patch release: 0x0 = Patch 0.
+     */
+}
 
 static void arm_v7m_class_init(ObjectClass *oc, void *data)
 {
@@ -1164,6 +1184,8 @@ static const ARMCPUInfo arm_cpus[] = {
     { .name = "arm11mpcore", .initfn = arm11mpcore_initfn },
     { .name = "cortex-m3",   .initfn = cortex_m3_initfn,
                              .class_init = arm_v7m_class_init },
+    { .name = "cortex-m4",   .initfn = cortex_m4_initfn,
+                             .class_init = arm_v7m_class_init },
     { .name = "cortex-a8",   .initfn = cortex_a8_initfn },
     { .name = "cortex-a9",   .initfn = cortex_a9_initfn },
     { .name = "cortex-a15",  .initfn = cortex_a15_initfn },
diff --git a/target-arm/cpu.h b/target-arm/cpu.h
index d4a5899..fa5c3bc 100644
--- a/target-arm/cpu.h
+++ b/target-arm/cpu.h
@@ -886,6 +886,7 @@ enum arm_features {
     ARM_FEATURE_V8_SHA1, /* implements SHA1 part of v8 Crypto Extensions */
     ARM_FEATURE_V8_SHA256, /* implements SHA256 part of v8 Crypto Extensions */
     ARM_FEATURE_V8_PMULL, /* implements PMULL part of v8 Crypto Extensions */
+    ARM_FEATURE_THUMB_DSP,/* DSP insns supported in the Thumb encodings */
 };
 
 static inline int arm_feature(CPUARMState *env, int feature)
diff --git a/target-arm/translate.c b/target-arm/translate.c
index 9116529..c9d2e4f 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -9428,6 +9428,10 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
 
         op = (insn >> 21) & 0xf;
         if (op == 6) {
+            if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
+                /* pkhtb, pkfbt are DSP instructions  */
+                goto illegal_op;
+            }
             /* Halfword pack.  */
             tmp = load_reg(s, rn);
             tmp2 = load_reg(s, rm);
@@ -9502,13 +9506,37 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
             switch (op) {
             case 0: gen_sxth(tmp);   break;
             case 1: gen_uxth(tmp);   break;
-            case 2: gen_sxtb16(tmp); break;
-            case 3: gen_uxtb16(tmp); break;
+            case 2:
+                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                    /* sxtab16, sxtb16 are DSP instructions  */
+                    tcg_temp_free_i32(tmp);
+                    goto illegal_op;
+                }
+                gen_sxtb16(tmp);
+                break;
+            case 3:
+                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                    /* uxtb16, uxtab16 are DSP instructions */
+                    tcg_temp_free_i32(tmp);
+                    goto illegal_op;
+                }
+                gen_uxtb16(tmp);
+                break;
             case 4: gen_sxtb(tmp);   break;
             case 5: gen_uxtb(tmp);   break;
             default: goto illegal_op;
             }
+            /*-sxtab->-sxtab16->*/
             if (rn != 15) {
+                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                    /* sxtab, sxtah, uxtab, uxtah are DSP instructions.
+                     * sxtb, sxth, uxtb, uxth are not DSP according to
+                     * ARMv7-M Architecture Reference Manual
+                     */
+                    /* need to free this so there's no TCG temporary leak */
+                    tcg_temp_free_i32(tmp);
+                    goto illegal_op;
+                }
                 tmp2 = load_reg(s, rn);
                 if ((op >> 1) == 1) {
                     gen_add16(tmp, tmp2);
@@ -9521,6 +9549,12 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
             break;
         case 2: /* SIMD add/subtract.  */
             op = (insn >> 20) & 7;
+            if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) ){
+                /* add16, sub16, asx, sax, add8, sub8 (with q, s, sh, u, uh,
+                 * and uq variants) and usad8, usada8
+                 */
+                goto illegal_op;
+            }
             shift = (insn >> 4) & 7;
             if ((op & 3) == 3 || (shift & 3) == 3)
                 goto illegal_op;
@@ -9532,8 +9566,13 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
             break;
         case 3: /* Other data processing.  */
             op = ((insn >> 17) & 0x38) | ((insn >> 4) & 7);
+
             if (op < 4) {
                 /* Saturating add/subtract.  */
+                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                    /* qsub, qadd, qdadd, qdsub are DSP instructions. */
+                    goto illegal_op;
+                }
                 tmp = load_reg(s, rn);
                 tmp2 = load_reg(s, rm);
                 if (op & 1)
@@ -9559,6 +9598,12 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
                     gen_revsh(tmp);
                     break;
                 case 0x10: /* sel */
+                    if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                    /* sel is a DSP instruction. */
+                    /* need to free this so there's no TCG temporary leak */
+                    tcg_temp_free_i32(tmp);
+                    goto illegal_op;
+                    }
                     tmp2 = load_reg(s, rm);
                     tmp3 = tcg_temp_new_i32();
                     tcg_gen_ld_i32(tmp3, cpu_env, offsetof(CPUARMState, GE));
@@ -9624,6 +9669,15 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
                 }
                 break;
             case 1: /* 16 x 16 -> 32 */
+                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                    /* smlabb, smlabt, smlatb, smlatt, smulbb, smulbt, smultt
+                     * and smultb are DSP instructions
+                     */
+                     /* need to free this so there's no TCG temporary leak */
+                    tcg_temp_free_i32(tmp);
+                    tcg_temp_free_i32(tmp2);
+                    goto illegal_op;
+                }
                 gen_mulxy(tmp, tmp2, op & 2, op & 1);
                 tcg_temp_free_i32(tmp2);
                 if (rs != 15) {
@@ -9634,6 +9688,14 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
                 break;
             case 2: /* Dual multiply add.  */
             case 4: /* Dual multiply subtract.  */
+                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                    /* smlad, smladx, smlsd, smusd are DSP instructions */
+
+                    /* need to free this so there's no TCG temporary leak */
+                    tcg_temp_free_i32(tmp);
+                    tcg_temp_free_i32(tmp2);
+                    goto illegal_op;
+                }
                 if (op)
                     gen_swap_half(tmp2);
                 gen_smul_dual(tmp, tmp2);
@@ -9656,6 +9718,13 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
                   }
                 break;
             case 3: /* 32 * 16 -> 32msb */
+                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                    /* smlawb, smlawt, smulwt, smulwb are DSP instructions */
+                    /* need to free this so there's no TCG temporary leak */
+                    tcg_temp_free_i32(tmp);
+                    tcg_temp_free_i32(tmp2);
+                    goto illegal_op;
+                }
                 if (op)
                     tcg_gen_sari_i32(tmp2, tmp2, 16);
                 else
@@ -9673,6 +9742,15 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
                   }
                 break;
             case 5: case 6: /* 32 * 32 -> 32msb (SMMUL, SMMLA, SMMLS) */
+                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                    /* smmla, smmls, smmul, smuad, smmlar,
+                     * smmlsr, smmulr are DSP instructions
+                     */
+                     /* need to free this so there's no TCG temporary leak */
+                    tcg_temp_free_i32(tmp);
+                    tcg_temp_free_i32(tmp2);
+                    goto illegal_op;
+                }
                 tmp64 = gen_muls_i64_i32(tmp, tmp2);
                 if (rs != 15) {
                     tmp = load_reg(s, rs);
@@ -9719,6 +9797,13 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
                 store_reg(s, rd, tmp);
             } else if ((op & 0xe) == 0xc) {
                 /* Dual multiply accumulate long.  */
+                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                    /* smlald, smlsld are DSP instructions */
+                    /* need to free this so there's no TCG temporary leak */
+                    tcg_temp_free_i32(tmp);
+                    tcg_temp_free_i32(tmp2);
+                    goto illegal_op;
+                }
                 if (op & 1)
                     gen_swap_half(tmp2);
                 gen_smul_dual(tmp, tmp2);
@@ -9742,6 +9827,17 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
                 } else {
                     if (op & 8) {
                         /* smlalxy */
+                        if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                            /* smlalbb, smlalbt, smlaltb, smlaltt
+                             * are DSP instructions
+                             */
+                            /* need to free this so there's no TCG
+                             * temporary leak
+                             */
+                            tcg_temp_free_i32(tmp2);
+                            tcg_temp_free_i32(tmp);
+                            goto illegal_op;
+                        }
                         gen_mulxy(tmp, tmp2, op & 2, op & 1);
                         tcg_temp_free_i32(tmp2);
                         tmp64 = tcg_temp_new_i64();
@@ -9754,6 +9850,12 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
                 }
                 if (op & 4) {
                     /* umaal */
+                    if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                        /* ummal is a DSP instruction */
+                        /* need to free this so there's no TCG temporary leak */
+                        tcg_temp_free_i64(tmp64);
+                        goto illegal_op;
+                    }
                     gen_addq_lo(s, tmp64, rs);
                     gen_addq_lo(s, tmp64, rd);
                 } else if (op & 0x40) {
@@ -10018,14 +10120,34 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
                         tmp2 = tcg_const_i32(imm);
                         if (op & 4) {
                             /* Unsigned.  */
-                            if ((op & 1) && shift == 0)
+                            if ((op & 1) && shift == 0){
+                                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                                    /* usat16 is a DSP instruction */
+                                    /* need to free this so there's no TCG
+                                     * temporary leak
+                                     */
+                                    tcg_temp_free_i32(tmp);
+                                    tcg_temp_free_i32(tmp2);
+                                    goto illegal_op;
+                                }
                                 gen_helper_usat16(tmp, cpu_env, tmp, tmp2);
+                            }
                             else
                                 gen_helper_usat(tmp, cpu_env, tmp, tmp2);
                         } else {
                             /* Signed.  */
-                            if ((op & 1) && shift == 0)
+                            if ((op & 1) && shift == 0){
+                                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
+                                    /* ssat16 is a DSP instruction */
+                                    /* need to free this so there's no TCG
+                                     * temporary leak
+                                     */
+                                    tcg_temp_free_i32(tmp);
+                                    tcg_temp_free_i32(tmp2);
+                                    goto illegal_op;
+                                }
                                 gen_helper_ssat16(tmp, cpu_env, tmp, tmp2);
+                            }
                             else
                                 gen_helper_ssat(tmp, cpu_env, tmp, tmp2);
                         }
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-05-28 21:09 [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU Aurelio C. Remonda
@ 2015-05-28 21:22 ` Liviu Ionescu
  2015-05-28 22:03   ` Peter Maydell
  2015-05-29 12:55   ` aurelio remonda
  2015-05-30 10:46 ` Peter Crosthwaite
  1 sibling, 2 replies; 15+ messages in thread
From: Liviu Ionescu @ 2015-05-28 21:22 UTC (permalink / raw)
  To: Aurelio C. Remonda
  Cc: peter.maydell, daniel.gutson, qemu-devel, martin.galvan


> On 29 May 2015, at 00:09, Aurelio C. Remonda <aurelioremonda@gmail.com> wrote:
> 
> This patch adds the Cortex-M4 CPU. The M4 is basically the same as the M3,
> the main differences being the DSP instructions and an optional FPU.
> The DSP instructions are already implemented in Qemu, as the A and R profiles
> use them.

great!

Peter mentioned some differences in exception processing, did you check if they require changes in emulation?

> The optional FPU in the M4 could be added in the future as a "Cortex-M4F" CPU.

in my implementation I had a single name ("cortex-m4") and some flags, but a separate name is probably better. can we reserve 

	{ .name = "cortex-m4f", ... } 

for this purpose?

> All we'd have to do is add the ARM_FEATURE_VFP4 to the initfn.

if it is that simple, why don't we add it in for now?


regards,

Liviu

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-05-28 21:22 ` Liviu Ionescu
@ 2015-05-28 22:03   ` Peter Maydell
  2015-05-29 12:55   ` aurelio remonda
  1 sibling, 0 replies; 15+ messages in thread
From: Peter Maydell @ 2015-05-28 22:03 UTC (permalink / raw)
  To: Liviu Ionescu
  Cc: daniel.gutson, Aurelio C. Remonda, QEMU Developers, Martin Galvan

On 28 May 2015 at 22:22, Liviu Ionescu <ilg@livius.net> wrote:
>
>> On 29 May 2015, at 00:09, Aurelio C. Remonda <aurelioremonda@gmail.com> wrote:
>> All we'd have to do is add the ARM_FEATURE_VFP4 to the initfn.
>
> if it is that simple, why don't we add it in for now?

It's not -- the FPU needs support in the exception handling
(lazy FPU saving is particularly interesting, but there's also
a bunch of minor stuff like "expose the FPU version registers
as memory mapped regs" IIRC).

-- PMM

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-05-28 21:22 ` Liviu Ionescu
  2015-05-28 22:03   ` Peter Maydell
@ 2015-05-29 12:55   ` aurelio remonda
  2015-05-29 13:21     ` Peter Maydell
  2015-05-29 19:15     ` Liviu Ionescu
  1 sibling, 2 replies; 15+ messages in thread
From: aurelio remonda @ 2015-05-29 12:55 UTC (permalink / raw)
  To: Liviu Ionescu; +Cc: Peter Maydell, Daniel Gutson, qemu-devel, Martin Galvan

2015-05-28 18:22 GMT-03:00 Liviu Ionescu <ilg@livius.net>:
> > On 29 May 2015, at 00:09, Aurelio C. Remonda <aurelioremonda@gmail.com> wrote:
> > The optional FPU in the M4 could be added in the future as a "Cortex-M4F" CPU.
>
> in my implementation I had a single name ("cortex-m4") and some flags, but a separate name is probably better. can we reserve
>
>         { .name = "cortex-m4f", ... }
>
> for this purpose?

Thanks for the feedback! Yes, we could but I think its outside of the
scope of this particular contribution.

> > All we'd have to do is add the ARM_FEATURE_VFP4 to the initfn.
>
> if it is that simple, why don't we add it in for now?

As Peter said, it may not actually be that simple.

Perhaps we could commit this now and add the VFP in the future?

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-05-29 12:55   ` aurelio remonda
@ 2015-05-29 13:21     ` Peter Maydell
  2015-05-29 19:15     ` Liviu Ionescu
  1 sibling, 0 replies; 15+ messages in thread
From: Peter Maydell @ 2015-05-29 13:21 UTC (permalink / raw)
  To: aurelio remonda
  Cc: Liviu Ionescu, Daniel Gutson, QEMU Developers, Martin Galvan

On 29 May 2015 at 13:55, aurelio remonda <aurelioremonda@gmail.com> wrote
> Perhaps we could commit this now and add the VFP in the future?

That's how we've generally worked, yes -- if you just ask
for a "Cortex-A9" or whatever you get the maximum set of
features that CPU can support (so always Neon & VFP even if
some A9 hardware is configured without VFP), and if we add
support for a feature that the hardware has after the
CPU model was first added then we add the feature to that
CPU. (So we didn't have TrustZone support when the A9
was initially put into QEMU, but when we put in the TZ
support we turned on the ARM_FEATURE_EL3 bit for the A9 by
default.)

If we need to also support CPUs of that model that don't have
a particular optional feature we can do that via a CPU property
(as we do with 'has_el3' for disabling TZ support). Then a board
that wants an M4 without FPU can set the property to false, or
a user who wants to control it from the command line can do so
via -cpu cortex-m4,has-fpu=false or similar.

-- PMM

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-05-29 12:55   ` aurelio remonda
  2015-05-29 13:21     ` Peter Maydell
@ 2015-05-29 19:15     ` Liviu Ionescu
  2015-05-29 19:16       ` Martin Galvan
  1 sibling, 1 reply; 15+ messages in thread
From: Liviu Ionescu @ 2015-05-29 19:15 UTC (permalink / raw)
  To: aurelio remonda; +Cc: Peter Maydell, Daniel Gutson, qemu-devel, Martin Galvan


> On 29 May 2015, at 15:55, aurelio remonda <aurelioremonda@gmail.com> wrote:
> 
> 2015-05-28 18:22 GMT-03:00 Liviu Ionescu <ilg@livius.net>:
>>> On 29 May 2015, at 00:09, Aurelio C. Remonda <aurelioremonda@gmail.com> wrote:
>>> The optional FPU in the M4 could be added in the future as a "Cortex-M4F" CPU.
>> 
>> in my implementation I had a single name ("cortex-m4") and some flags, but a separate name is probably better. can we reserve
>> 
>>        { .name = "cortex-m4f", ... }
>> 
>> for this purpose?
> 
> Thanks for the feedback! Yes, we could but I think its outside of the
> scope of this particular contribution.

ok, I already updated my code to use cortex-m4 or cortex-m4f.

> 
>>> All we'd have to do is add the ARM_FEATURE_VFP4 to the initfn.
>> 
>> if it is that simple, why don't we add it in for now?
> 
> As Peter said, it may not actually be that simple.
> 
> Perhaps we could commit this now and add the VFP in the future?

this is fine with me.

unfortunately I cannot review your patch, since I have not enough experience with that part of qemu.


regards,

Liviu

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-05-29 19:15     ` Liviu Ionescu
@ 2015-05-29 19:16       ` Martin Galvan
  2015-05-29 19:30         ` Peter Maydell
  2015-06-10  9:58         ` Liviu Ionescu
  0 siblings, 2 replies; 15+ messages in thread
From: Martin Galvan @ 2015-05-29 19:16 UTC (permalink / raw)
  To: Liviu Ionescu
  Cc: Daniel Gutson, Peter Maydell, aurelio remonda, QEMU Developers

On Fri, May 29, 2015 at 4:15 PM, Liviu Ionescu <ilg@livius.net> wrote:
> this is fine with me.
>
> unfortunately I cannot review your patch, since I have not enough experience with that part of qemu.

I think Peter M is the maintainer for Target-ARM.

Peter, is this OK to commit?


-- 

Martin Galvan

Software Engineer

Taller Technologies Argentina


San Lorenzo 47, 3rd Floor, Office 5

Córdoba, Argentina

Phone: 54 351 4217888 / +54 351 4218211

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-05-29 19:16       ` Martin Galvan
@ 2015-05-29 19:30         ` Peter Maydell
  2015-06-10  9:58         ` Liviu Ionescu
  1 sibling, 0 replies; 15+ messages in thread
From: Peter Maydell @ 2015-05-29 19:30 UTC (permalink / raw)
  To: Martin Galvan
  Cc: Daniel Gutson, Liviu Ionescu, aurelio remonda, QEMU Developers

On 29 May 2015 at 20:16, Martin Galvan
<martin.galvan@tallertechnologies.com> wrote:
> On Fri, May 29, 2015 at 4:15 PM, Liviu Ionescu <ilg@livius.net> wrote:
>> this is fine with me.
>>
>> unfortunately I cannot review your patch, since I have not enough experience with that part of qemu.
>
> I think Peter M is the maintainer for Target-ARM.
>
> Peter, is this OK to commit?

The patch is on my to-review queue; unfortunately I'm quite
heavily loaded with patches to review at the moment, so it
may be a week or so before I can get to this one in detail.
Sorry about that.

At a quick glance it looks broadly OK. Personally I prefer
hoisting the "UNDEF if feature missing" checks earlier in the
decode function rather than having them later and having to
do manual tcg_temp_free operations, but this isn't always
feasible with the existing structure of the code.

I might also split it into two patches: one which just
adds and implements the new feature bit, and then one
which creates the new M4 CPU. (That way if it turns out
that we need to make other changes for the M4 before
we can enable it, the first patch can still be reviewed
and possibly committed even if we have to wait before
putting in the new CPU itself.)

thanks
-- PMM

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-05-28 21:09 [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU Aurelio C. Remonda
  2015-05-28 21:22 ` Liviu Ionescu
@ 2015-05-30 10:46 ` Peter Crosthwaite
  2015-05-30 22:08   ` aurelio remonda
  1 sibling, 1 reply; 15+ messages in thread
From: Peter Crosthwaite @ 2015-05-30 10:46 UTC (permalink / raw)
  To: Aurelio C. Remonda
  Cc: Liviu Ionescu, Martin Galvan, daniel.gutson,
	qemu-devel@nongnu.org Developers, Peter Maydell

On Thu, May 28, 2015 at 2:09 PM, Aurelio C. Remonda
<aurelioremonda@gmail.com> wrote:
> This patch adds the Cortex-M4 CPU. The M4 is basically the same as the M3,
> the main differences being the DSP instructions and an optional FPU.
> The DSP instructions are already implemented in Qemu, as the A and R profiles
> use them.
>
> I created an ARM_FEATURE_THUMB_DSP to be added to any non-M thumb2-compatible
> CPU that uses DSP instructions, and I manually added it to the M4 in its initfn.
>

This should be a separate patch, one for your refactoring adding the
new ARM_FEATURE then a second one for the cortex-m4.

> The optional FPU in the M4 could be added in the future as a "Cortex-M4F" CPU.
> All we'd have to do is add the ARM_FEATURE_VFP4 to the initfn.
>
> There are 85 DSP instructions (all of them thumb2). On disas_thumb2_insn
> the DSP feature is tested before the instruction is generated; if it's not
> enabled then its an illegal op.
>
> Signed-off-by: Aurelio C. Remonda <aurelioremonda@gmail.com>
> ---
>  target-arm/cpu.c       |  22 +++++++++
>  target-arm/cpu.h       |   1 +
>  target-arm/translate.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++--
>  3 files changed, 149 insertions(+), 4 deletions(-)
>
> diff --git a/target-arm/cpu.c b/target-arm/cpu.c
> index 3ca3fa8..9be4a06 100644
> --- a/target-arm/cpu.c
> +++ b/target-arm/cpu.c
> @@ -512,6 +512,10 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
>      if (arm_feature(env, ARM_FEATURE_CBAR_RO)) {
>          set_feature(env, ARM_FEATURE_CBAR);
>      }
> +    if (arm_feature(env,ARM_FEATURE_THUMB2) &&
> +        !arm_feature(env,ARM_FEATURE_M)) {
> +        set_feature(env, ARM_FEATURE_THUMB_DSP);
> +    }
>
>      if (cpu->reset_hivecs) {
>              cpu->reset_sctlr |= (1 << 13);
> @@ -761,6 +765,22 @@ static void cortex_m3_initfn(Object *obj)
>      set_feature(&cpu->env, ARM_FEATURE_M);
>      cpu->midr = 0x410fc231;
>  }
> +static void cortex_m4_initfn(Object *obj)
> +{
> +    ARMCPU *cpu = ARM_CPU(obj);
> +    set_feature(&cpu->env, ARM_FEATURE_V7);
> +    set_feature(&cpu->env, ARM_FEATURE_M);
> +    set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
> +    cpu->midr = 0x410fc240;
> +    /* Main id register CPUID bit assignments
> +     * Bits    NAME        Function
> +     * [31:24] IMPLEMENTER Indicates implementor: 0x41 = ARM
> +     * [23:20] VARIANT     Indicates processor revision: 0x0 = Revision 0
> +     * [19:16] (Constant)  Reads as 0xF
> +     * [15:4]  PARTNO      Indicates part number: 0xC24 = Cortex-M4
> +     * [3:0]   REVISION    Indicates patch release: 0x0 = Patch 0.
> +     */
> +}
>
>  static void arm_v7m_class_init(ObjectClass *oc, void *data)
>  {
> @@ -1164,6 +1184,8 @@ static const ARMCPUInfo arm_cpus[] = {
>      { .name = "arm11mpcore", .initfn = arm11mpcore_initfn },
>      { .name = "cortex-m3",   .initfn = cortex_m3_initfn,
>                               .class_init = arm_v7m_class_init },
> +    { .name = "cortex-m4",   .initfn = cortex_m4_initfn,
> +                             .class_init = arm_v7m_class_init },
>      { .name = "cortex-a8",   .initfn = cortex_a8_initfn },
>      { .name = "cortex-a9",   .initfn = cortex_a9_initfn },
>      { .name = "cortex-a15",  .initfn = cortex_a15_initfn },
> diff --git a/target-arm/cpu.h b/target-arm/cpu.h
> index d4a5899..fa5c3bc 100644
> --- a/target-arm/cpu.h
> +++ b/target-arm/cpu.h
> @@ -886,6 +886,7 @@ enum arm_features {
>      ARM_FEATURE_V8_SHA1, /* implements SHA1 part of v8 Crypto Extensions */
>      ARM_FEATURE_V8_SHA256, /* implements SHA256 part of v8 Crypto Extensions */
>      ARM_FEATURE_V8_PMULL, /* implements PMULL part of v8 Crypto Extensions */
> +    ARM_FEATURE_THUMB_DSP,/* DSP insns supported in the Thumb encodings */

Space after ","

>  };
>
>  static inline int arm_feature(CPUARMState *env, int feature)
> diff --git a/target-arm/translate.c b/target-arm/translate.c
> index 9116529..c9d2e4f 100644
> --- a/target-arm/translate.c
> +++ b/target-arm/translate.c
> @@ -9428,6 +9428,10 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>
>          op = (insn >> 21) & 0xf;
>          if (op == 6) {
> +            if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
> +                /* pkhtb, pkfbt are DSP instructions  */
> +                goto illegal_op;
> +            }
>              /* Halfword pack.  */
>              tmp = load_reg(s, rn);
>              tmp2 = load_reg(s, rm);
> @@ -9502,13 +9506,37 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>              switch (op) {
>              case 0: gen_sxth(tmp);   break;
>              case 1: gen_uxth(tmp);   break;
> -            case 2: gen_sxtb16(tmp); break;
> -            case 3: gen_uxtb16(tmp); break;
> +            case 2:
> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){

Space after ))). Does checkpatch catch this?

one set of parenthesis un-needed

> +                    /* sxtab16, sxtb16 are DSP instructions  */
> +                    tcg_temp_free_i32(tmp);
> +                    goto illegal_op;
> +                }
> +                gen_sxtb16(tmp);
> +                break;
> +            case 3:
> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                    /* uxtb16, uxtab16 are DSP instructions */
> +                    tcg_temp_free_i32(tmp);
> +                    goto illegal_op;
> +                }
> +                gen_uxtb16(tmp);
> +                break;
>              case 4: gen_sxtb(tmp);   break;
>              case 5: gen_uxtb(tmp);   break;
>              default: goto illegal_op;
>              }
> +            /*-sxtab->-sxtab16->*/
>              if (rn != 15) {
> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                    /* sxtab, sxtah, uxtab, uxtah are DSP instructions.
> +                     * sxtb, sxth, uxtb, uxth are not DSP according to
> +                     * ARMv7-M Architecture Reference Manual
> +                     */
> +                    /* need to free this so there's no TCG temporary leak */
> +                    tcg_temp_free_i32(tmp);
> +                    goto illegal_op;
> +                }
>                  tmp2 = load_reg(s, rn);
>                  if ((op >> 1) == 1) {
>                      gen_add16(tmp, tmp2);
> @@ -9521,6 +9549,12 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>              break;
>          case 2: /* SIMD add/subtract.  */
>              op = (insn >> 20) & 7;
> +            if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) ){

same. Also extra space here.

> +                /* add16, sub16, asx, sax, add8, sub8 (with q, s, sh, u, uh,
> +                 * and uq variants) and usad8, usada8
> +                 */
> +                goto illegal_op;
> +            }
>              shift = (insn >> 4) & 7;
>              if ((op & 3) == 3 || (shift & 3) == 3)
>                  goto illegal_op;
> @@ -9532,8 +9566,13 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>              break;
>          case 3: /* Other data processing.  */
>              op = ((insn >> 17) & 0x38) | ((insn >> 4) & 7);
> +

Out of scope change.

>              if (op < 4) {
>                  /* Saturating add/subtract.  */
> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                    /* qsub, qadd, qdadd, qdsub are DSP instructions. */
> +                    goto illegal_op;
> +                }
>                  tmp = load_reg(s, rn);
>                  tmp2 = load_reg(s, rm);
>                  if (op & 1)
> @@ -9559,6 +9598,12 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>                      gen_revsh(tmp);
>                      break;
>                  case 0x10: /* sel */
> +                    if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                    /* sel is a DSP instruction. */
> +                    /* need to free this so there's no TCG temporary leak */
> +                    tcg_temp_free_i32(tmp);
> +                    goto illegal_op;
> +                    }
>                      tmp2 = load_reg(s, rm);
>                      tmp3 = tcg_temp_new_i32();
>                      tcg_gen_ld_i32(tmp3, cpu_env, offsetof(CPUARMState, GE));
> @@ -9624,6 +9669,15 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>                  }
>                  break;
>              case 1: /* 16 x 16 -> 32 */
> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                    /* smlabb, smlabt, smlatb, smlatt, smulbb, smulbt, smultt
> +                     * and smultb are DSP instructions
> +                     */
> +                     /* need to free this so there's no TCG temporary leak */

Comment un-needed.

Regards,
Peter

> +                    tcg_temp_free_i32(tmp);
> +                    tcg_temp_free_i32(tmp2);
> +                    goto illegal_op;
> +                }
>                  gen_mulxy(tmp, tmp2, op & 2, op & 1);
>                  tcg_temp_free_i32(tmp2);
>                  if (rs != 15) {
> @@ -9634,6 +9688,14 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>                  break;
>              case 2: /* Dual multiply add.  */
>              case 4: /* Dual multiply subtract.  */
> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                    /* smlad, smladx, smlsd, smusd are DSP instructions */
> +
> +                    /* need to free this so there's no TCG temporary leak */
> +                    tcg_temp_free_i32(tmp);
> +                    tcg_temp_free_i32(tmp2);
> +                    goto illegal_op;
> +                }
>                  if (op)
>                      gen_swap_half(tmp2);
>                  gen_smul_dual(tmp, tmp2);
> @@ -9656,6 +9718,13 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>                    }
>                  break;
>              case 3: /* 32 * 16 -> 32msb */
> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                    /* smlawb, smlawt, smulwt, smulwb are DSP instructions */
> +                    /* need to free this so there's no TCG temporary leak */
> +                    tcg_temp_free_i32(tmp);
> +                    tcg_temp_free_i32(tmp2);
> +                    goto illegal_op;
> +                }
>                  if (op)
>                      tcg_gen_sari_i32(tmp2, tmp2, 16);
>                  else
> @@ -9673,6 +9742,15 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>                    }
>                  break;
>              case 5: case 6: /* 32 * 32 -> 32msb (SMMUL, SMMLA, SMMLS) */
> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                    /* smmla, smmls, smmul, smuad, smmlar,
> +                     * smmlsr, smmulr are DSP instructions
> +                     */
> +                     /* need to free this so there's no TCG temporary leak */
> +                    tcg_temp_free_i32(tmp);
> +                    tcg_temp_free_i32(tmp2);
> +                    goto illegal_op;
> +                }
>                  tmp64 = gen_muls_i64_i32(tmp, tmp2);
>                  if (rs != 15) {
>                      tmp = load_reg(s, rs);
> @@ -9719,6 +9797,13 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>                  store_reg(s, rd, tmp);
>              } else if ((op & 0xe) == 0xc) {
>                  /* Dual multiply accumulate long.  */
> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                    /* smlald, smlsld are DSP instructions */
> +                    /* need to free this so there's no TCG temporary leak */
> +                    tcg_temp_free_i32(tmp);
> +                    tcg_temp_free_i32(tmp2);
> +                    goto illegal_op;
> +                }
>                  if (op & 1)
>                      gen_swap_half(tmp2);
>                  gen_smul_dual(tmp, tmp2);
> @@ -9742,6 +9827,17 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>                  } else {
>                      if (op & 8) {
>                          /* smlalxy */
> +                        if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                            /* smlalbb, smlalbt, smlaltb, smlaltt
> +                             * are DSP instructions
> +                             */
> +                            /* need to free this so there's no TCG
> +                             * temporary leak
> +                             */
> +                            tcg_temp_free_i32(tmp2);
> +                            tcg_temp_free_i32(tmp);
> +                            goto illegal_op;
> +                        }
>                          gen_mulxy(tmp, tmp2, op & 2, op & 1);
>                          tcg_temp_free_i32(tmp2);
>                          tmp64 = tcg_temp_new_i64();
> @@ -9754,6 +9850,12 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>                  }
>                  if (op & 4) {
>                      /* umaal */
> +                    if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                        /* ummal is a DSP instruction */
> +                        /* need to free this so there's no TCG temporary leak */
> +                        tcg_temp_free_i64(tmp64);
> +                        goto illegal_op;
> +                    }
>                      gen_addq_lo(s, tmp64, rs);
>                      gen_addq_lo(s, tmp64, rd);
>                  } else if (op & 0x40) {
> @@ -10018,14 +10120,34 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>                          tmp2 = tcg_const_i32(imm);
>                          if (op & 4) {
>                              /* Unsigned.  */
> -                            if ((op & 1) && shift == 0)
> +                            if ((op & 1) && shift == 0){
> +                                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                                    /* usat16 is a DSP instruction */
> +                                    /* need to free this so there's no TCG
> +                                     * temporary leak
> +                                     */
> +                                    tcg_temp_free_i32(tmp);
> +                                    tcg_temp_free_i32(tmp2);
> +                                    goto illegal_op;
> +                                }
>                                  gen_helper_usat16(tmp, cpu_env, tmp, tmp2);
> +                            }
>                              else
>                                  gen_helper_usat(tmp, cpu_env, tmp, tmp2);
>                          } else {
>                              /* Signed.  */
> -                            if ((op & 1) && shift == 0)
> +                            if ((op & 1) && shift == 0){
> +                                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
> +                                    /* ssat16 is a DSP instruction */
> +                                    /* need to free this so there's no TCG
> +                                     * temporary leak
> +                                     */
> +                                    tcg_temp_free_i32(tmp);
> +                                    tcg_temp_free_i32(tmp2);
> +                                    goto illegal_op;
> +                                }
>                                  gen_helper_ssat16(tmp, cpu_env, tmp, tmp2);
> +                            }
>                              else
>                                  gen_helper_ssat(tmp, cpu_env, tmp, tmp2);
>                          }
> --
> 1.9.1
>
>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-05-30 10:46 ` Peter Crosthwaite
@ 2015-05-30 22:08   ` aurelio remonda
  2015-05-30 23:16     ` Peter Crosthwaite
  0 siblings, 1 reply; 15+ messages in thread
From: aurelio remonda @ 2015-05-30 22:08 UTC (permalink / raw)
  To: Peter Crosthwaite
  Cc: Liviu Ionescu, Martin Galvan, Daniel Gutson,
	qemu-devel@nongnu.org Developers, Peter Maydell

>>              if (op < 4) {
>>                  /* Saturating add/subtract.  */
>> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
>> +                    /* qsub, qadd, qdadd, qdsub are DSP instructions. */
>> +                    goto illegal_op;
>> +                }
>>                  tmp = load_reg(s, rn);
>>                  tmp2 = load_reg(s, rm);
>>                  if (op & 1)
>> @@ -9559,6 +9598,12 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>>                      gen_revsh(tmp);
>>                      break;
>>                  case 0x10: /* sel */
>> +                    if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
>> +                    /* sel is a DSP instruction. */
>> +                    /* need to free this so there's no TCG temporary leak */
>> +                    tcg_temp_free_i32(tmp);
>> +                    goto illegal_op;
>> +                    }
>>                      tmp2 = load_reg(s, rm);
>>                      tmp3 = tcg_temp_new_i32();
>>                      tcg_gen_ld_i32(tmp3, cpu_env, offsetof(CPUARMState, GE));
>> @@ -9624,6 +9669,15 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>>                  }
>>                  break;
>>              case 1: /* 16 x 16 -> 32 */
>> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
>> +                    /* smlabb, smlabt, smlatb, smlatt, smulbb, smulbt, smultt
>> +                     * and smultb are DSP instructions
>> +                     */
>> +                     /* need to free this so there's no TCG temporary leak */
>
> Comment un-needed.

Why do you think it's not needed? Any comments are helpful as long as
they're correct. Thanks

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-05-30 22:08   ` aurelio remonda
@ 2015-05-30 23:16     ` Peter Crosthwaite
  0 siblings, 0 replies; 15+ messages in thread
From: Peter Crosthwaite @ 2015-05-30 23:16 UTC (permalink / raw)
  To: aurelio remonda
  Cc: Peter Maydell, Liviu Ionescu, Daniel Gutson, Martin Galvan,
	qemu-devel@nongnu.org Developers

On Sat, May 30, 2015 at 3:08 PM, aurelio remonda
<aurelioremonda@gmail.com> wrote:
>>>              if (op < 4) {
>>>                  /* Saturating add/subtract.  */
>>> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
>>> +                    /* qsub, qadd, qdadd, qdsub are DSP instructions. */
>>> +                    goto illegal_op;
>>> +                }
>>>                  tmp = load_reg(s, rn);
>>>                  tmp2 = load_reg(s, rm);
>>>                  if (op & 1)
>>> @@ -9559,6 +9598,12 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>>>                      gen_revsh(tmp);
>>>                      break;
>>>                  case 0x10: /* sel */
>>> +                    if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
>>> +                    /* sel is a DSP instruction. */
>>> +                    /* need to free this so there's no TCG temporary leak */
>>> +                    tcg_temp_free_i32(tmp);
>>> +                    goto illegal_op;
>>> +                    }
>>>                      tmp2 = load_reg(s, rm);
>>>                      tmp3 = tcg_temp_new_i32();
>>>                      tcg_gen_ld_i32(tmp3, cpu_env, offsetof(CPUARMState, GE));
>>> @@ -9624,6 +9669,15 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
>>>                  }
>>>                  break;
>>>              case 1: /* 16 x 16 -> 32 */
>>> +                if (!(arm_dc_feature(s, ARM_FEATURE_THUMB_DSP))){
>>> +                    /* smlabb, smlabt, smlatb, smlatt, smulbb, smulbt, smultt
>>> +                     * and smultb are DSP instructions
>>> +                     */
>>> +                     /* need to free this so there's no TCG temporary leak */
>>
>> Comment un-needed.
>
> Why do you think it's not needed? Any comments are helpful as long as
> they're correct. Thanks
>

Not always. Comments on code are a maintainance burden. It's
preferrable to have the code self document as much as possible so that
changes only need to be applied once - to the code itself. The only
reason to ever call tcg_temp_free is to avoid a leak so its self
explanatory IMO.

Regards,
Peter

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-05-29 19:16       ` Martin Galvan
  2015-05-29 19:30         ` Peter Maydell
@ 2015-06-10  9:58         ` Liviu Ionescu
  2015-06-10 10:44           ` Peter Maydell
  1 sibling, 1 reply; 15+ messages in thread
From: Liviu Ionescu @ 2015-06-10  9:58 UTC (permalink / raw)
  To: Martin Galvan
  Cc: Daniel Gutson, Peter Maydell, aurelio remonda, QEMU Developers


> On 29 May 2015, at 22:16, Martin Galvan <martin.galvan@tallertechnologies.com> wrote:
> 
> 
> ... I think Peter M is the maintainer for Target-ARM.
> 
> Peter, is this OK to commit?

was this patch accepted? if so, where can I get it from?


regards,

Liviu

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-06-10  9:58         ` Liviu Ionescu
@ 2015-06-10 10:44           ` Peter Maydell
  2015-06-10 10:49             ` Daniel Gutson
  0 siblings, 1 reply; 15+ messages in thread
From: Peter Maydell @ 2015-06-10 10:44 UTC (permalink / raw)
  To: Liviu Ionescu
  Cc: Daniel Gutson, aurelio remonda, Martin Galvan, QEMU Developers

On 10 June 2015 at 10:58, Liviu Ionescu <ilg@livius.net> wrote:
>
>> On 29 May 2015, at 22:16, Martin Galvan <martin.galvan@tallertechnologies.com> wrote:
>>
>>
>> ... I think Peter M is the maintainer for Target-ARM.
>>
>> Peter, is this OK to commit?
>
> was this patch accepted?

No; as Peter C suggested, Martin split it into two patches.
Those patches then got code review, but I don't think Martin
has sent out a revised series yet.

-- PMM

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-06-10 10:44           ` Peter Maydell
@ 2015-06-10 10:49             ` Daniel Gutson
  2015-06-10 10:53               ` Peter Maydell
  0 siblings, 1 reply; 15+ messages in thread
From: Daniel Gutson @ 2015-06-10 10:49 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Liviu Ionescu, Aurelio Remonda, Martin Galvan, QEMU Developers

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

El 10/6/2015 7:45, "Peter Maydell" <peter.maydell@linaro.org> escribió:
>
> On 10 June 2015 at 10:58, Liviu Ionescu <ilg@livius.net> wrote:
> >
> >> On 29 May 2015, at 22:16, Martin Galvan <
martin.galvan@tallertechnologies.com> wrote:
> >>
> >>
> >> ... I think Peter M is the maintainer for Target-ARM.
> >>
> >> Peter, is this OK to commit?
> >
> > was this patch accepted?
>
> No; as Peter C suggested, Martin split it into two patches.
> Those patches then got code review, but I don't think Martin
> has sent out a revised series yet.

Aurelio is the primary author of the patch.
He's busy these days but he will commit the new version soon, hopefully
during the weekend.

>
> -- PMM

[-- Attachment #2: Type: text/html, Size: 1111 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU
  2015-06-10 10:49             ` Daniel Gutson
@ 2015-06-10 10:53               ` Peter Maydell
  0 siblings, 0 replies; 15+ messages in thread
From: Peter Maydell @ 2015-06-10 10:53 UTC (permalink / raw)
  To: Daniel Gutson
  Cc: Liviu Ionescu, Aurelio Remonda, Martin Galvan, QEMU Developers

On 10 June 2015 at 11:49, Daniel Gutson
<daniel.gutson@tallertechnologies.com> wrote:
> El 10/6/2015 7:45, "Peter Maydell" <peter.maydell@linaro.org> escribió:
>> No; as Peter C suggested, Martin split it into two patches.
>> Those patches then got code review, but I don't think Martin
>> has sent out a revised series yet.
>
> Aurelio is the primary author of the patch.

My apologies -- overly hasty misreading of the names in this
thread.

-- PMM

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2015-06-10 10:54 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-05-28 21:09 [Qemu-devel] [PATCH] Target-arm: Add the Cortex-M4 CPU Aurelio C. Remonda
2015-05-28 21:22 ` Liviu Ionescu
2015-05-28 22:03   ` Peter Maydell
2015-05-29 12:55   ` aurelio remonda
2015-05-29 13:21     ` Peter Maydell
2015-05-29 19:15     ` Liviu Ionescu
2015-05-29 19:16       ` Martin Galvan
2015-05-29 19:30         ` Peter Maydell
2015-06-10  9:58         ` Liviu Ionescu
2015-06-10 10:44           ` Peter Maydell
2015-06-10 10:49             ` Daniel Gutson
2015-06-10 10:53               ` Peter Maydell
2015-05-30 10:46 ` Peter Crosthwaite
2015-05-30 22:08   ` aurelio remonda
2015-05-30 23:16     ` Peter Crosthwaite

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).