qemu-irix/target-ppc
Julio Guerra 0aad8f1a49 PPC: Fix missing TRACE exception
This patch fixes bug 1031698 :
https://bugs.launchpad.net/qemu/+bug/1031698

If we look at the (truncated) translation of the conditional branch
instruction in the test submitted in the bug post, the call to the
exception helper is missing in the "bne-false" chunk of translated
code :

IN:
bne-    0x1800278

OUT:
0xb544236d:  jne    0xb5442396

0xb5442373:  mov    %ebp,(%esp)
0xb5442376:  mov    $0x44,%ebx
0xb544237b:  mov    %ebx,0x4(%esp)
0xb544237f:  mov    $0x1800278,%ebx
0xb5442384:  mov    %ebx,0x25c(%ebp)
0xb544238a:  call   0x827475a
                     ^^^^^^^^^^^^^^^^^^

0xb5442396:  mov    %ebp,(%esp)
0xb5442399:  mov    $0x44,%ebx
0xb544239e:  mov    %ebx,0x4(%esp)
0xb54423a2:  mov    $0x1800270,%ebx
0xb54423a7:  mov    %ebx,0x25c(%ebp)

Indeed, gen_exception(ctx, excp) called by gen_goto_tb (called by
gen_bcond) changes ctx->exception's value to excp's :

gen_bcond()
{
  gen_goto_tb(ctx, 0, ctx->nip + li - 4);
  /* ctx->exception value is POWERPC_EXCP_BRANCH */

  gen_goto_tb(ctx, 1, ctx->nip);
  /* ctx->exception now value is POWERPC_EXCP_TRACE */
}

Making the following gen_goto_tb()'s test false during the second call :

if ((ctx->singlestep_enabled &
    (CPU_BRANCH_STEP | CPU_SINGLE_STEP)) &&
    ctx->exception == POWERPC_EXCP_BRANCH /* false...*/) {
         target_ulong tmp = ctx->nip;
         ctx->nip = dest;
         /* ... and this is the missing call */
         gen_exception(ctx, POWERPC_EXCP_TRACE);
         ctx->nip = tmp;
}

So the patch simply adds the missing matching case, fixing our problem.

Signed-off-by: Julio Guerra <guerr@julio.in>
Signed-off-by: Alexander Graf <agraf@suse.de>
(cherry picked from commit f0cc4aa845)

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
2012-12-03 15:02:28 -06:00
..
Makefile.objs PPC: BookE: Implement EPR SPR 2012-06-24 01:04:52 +02:00
STATUS Fix typos in comments (chek -> check) 2011-05-22 22:31:45 +01:00
cpu-qom.h target-ppc: QOM'ify CPU 2012-04-15 17:10:30 +02:00
cpu.h PPC: BookE206: Bump MAS2 to 64bit 2012-06-24 01:04:52 +02:00
excp_helper.c PPC: Add support for MSR_CM 2012-06-24 01:04:51 +02:00
fpu_helper.c ppc: Add missing break 2012-06-24 01:04:43 +02:00
helper.c ppc: Move misc helpers from helper.c to misc_helper.c 2012-06-24 01:04:43 +02:00
helper.h PPC: BookE: Implement EPR SPR 2012-06-24 01:04:52 +02:00
helper_regs.h
int_helper.c ppc: Make hbrev table const 2012-06-24 01:04:43 +02:00
kvm.c ppc: Fix bug in handling of PAPR hypercall exits 2012-08-15 19:43:14 +02:00
kvm_ppc.c Replace Qemu by QEMU in comments 2012-04-07 14:00:45 +00:00
kvm_ppc.h ppc64: Rudimentary Support for extra page sizes on server CPUs 2012-06-24 01:04:44 +02:00
machine.c target-ppc/machine.c: Drop unnecessary ifdefs 2012-04-15 18:23:47 +02:00
mem_helper.c PPC: Add support for MSR_CM 2012-06-24 01:04:51 +02:00
mfrom_table.c
mfrom_table_gen.c fix spelling in target sub directory 2011-12-02 10:50:57 +00:00
misc_helper.c ppc: Move misc helpers from helper.c to misc_helper.c 2012-06-24 01:04:43 +02:00
mmu_helper.c ppc64: Rudimentary Support for extra page sizes on server CPUs 2012-06-24 01:04:44 +02:00
mpic_helper.c PPC: BookE: Implement EPR SPR 2012-06-24 01:04:52 +02:00
timebase_helper.c ppc: Avoid AREG0 for timebase helpers 2012-06-24 01:04:43 +02:00
translate.c PPC: Fix missing TRACE exception 2012-12-03 15:02:28 -06:00
translate_init.c win32: provide separate macros for weak decls and definitions 2012-08-15 13:26:03 -05:00