ARM: CORTEX M, PRIMASK and FAULTMASK are misplaced, WINDOWS mingw 4.6.1 bug

Bug #944753 reported by Oleksiy Bondarenko
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
QEMU
Invalid
Undecided
Unassigned

Bug Description

Just want to warn anyone who hacks QEMU cortex M support under MinGW, it seems there is a bug in gcc 4.6.1 that compiles this peace of code wrong.

translate.c:

             if (IS_M(env)) {
                tmp = tcg_const_i32((insn & (1 << 4)) != 0);
               /* PRIMASK */
                if (insn & 2) {
                    addr = tcg_const_i32(16);
                    gen_helper_v7m_msr(cpu_env, addr, tmp);
                    tcg_temp_free_i32(addr);
                }
                /* FAULTMASK */
                if (insn & 1) {
                    addr = tcg_const_i32(17);
                    gen_helper_v7m_msr(cpu_env, addr, tmp);
                    tcg_temp_free_i32(addr);
                }
                tcg_temp_free_i32(tmp);
                gen_lookup_tb(s);

if we just switch conditions order it will compile OK

              if (IS_M(env)) {
                tmp = tcg_const_i32((insn & (1 << 4)) != 0);
                /* FAULTMASK */
                if (insn & 1) {
                    addr = tcg_const_i32(17);
                    gen_helper_v7m_msr(cpu_env, addr, tmp);
                    tcg_temp_free_i32(addr);
                }
                /* PRIMASK */
                if (insn & 2) {
                    addr = tcg_const_i32(16);
                    gen_helper_v7m_msr(cpu_env, addr, tmp);
                    tcg_temp_free_i32(addr);
                }
                tcg_temp_free_i32(tmp);
                gen_lookup_tb(s);

I have attached gdb disassembly in the attachment for both cases

Revision history for this message
Oleksiy Bondarenko (alexian79) wrote :
Revision history for this message
Peter Maydell (pmaydell) wrote :

That generated code certainly looks fishy, but really you need to report gcc bugs to the gcc folks, not us.

I see from your quoted fragments of source code that you're using a version of QEMU which has a bug in its handling of PRIMASK/FAULTMASK here, incidentally. Commit d3cb6e2b0 (January, not in a QEMU release yet) fixes bug 913925 -- we were passing the wrong constant values.

Revision history for this message
Oleksiy Bondarenko (alexian79) wrote :

Yes, thanks. I have mentioned that too.

About:
       but really you need to report gcc bugs to the gcc folks, not us.

I sow in source code that there are workarounds for different compilers bugs on different platforms.

Revision history for this message
Peter Maydell (pmaydell) wrote :

This isn't a QEMU bug, and gcc 4.6.1 has fallen off the list of versions gcc upstream still maintains, so I'm afraid I'm closing it as invalid. I suggest you upgrade to a newer version of gcc...

Changed in qemu:
status: New → Invalid
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.