[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH][SPARC] Fix handling of conditional branches in
From: |
Artyom Tarasenko |
Subject: |
Re: [Qemu-devel] [PATCH][SPARC] Fix handling of conditional branches in delay slot of a conditional branch |
Date: |
Sat, 6 Aug 2011 23:33:11 +0200 |
Since it's a pure bug fix, do you think can it be applied to 0.15 as well?
On Sat, Aug 6, 2011 at 10:14 PM, Blue Swirl <address@hidden> wrote:
> Thanks, applied.
>
> On Sat, Aug 6, 2011 at 3:01 PM, Artyom Tarasenko <address@hidden> wrote:
>> Check whether dc->npc is dynamic before using its value for branch.
>>
>> Signed-off-by: Artyom Tarasenko <address@hidden>
>> ---
>> Particaluary the patch fixes handling of the constructions like
>>
>> 0x13e26c0: brz,pn %o0, 0x13e26e4
>> 0x13e26c4: brlez,pn %o1, 0x13e26e4
>>
>> present in NetBSD-5.1
>>
>> target-sparc/translate.c | 30 +++++++++++++++++++++---------
>> 1 files changed, 21 insertions(+), 9 deletions(-)
>>
>> diff --git a/target-sparc/translate.c b/target-sparc/translate.c
>> index 958fbc5..dee67b3 100644
>> --- a/target-sparc/translate.c
>> +++ b/target-sparc/translate.c
>> @@ -1286,7 +1286,6 @@ static inline void gen_cond_reg(TCGv r_dst, int cond,
>> TCGv r_src)
>> }
>> #endif
>>
>> -/* XXX: potentially incorrect if dynamic npc */
>> static void do_branch(DisasContext *dc, int32_t offset, uint32_t insn, int
>> cc,
>> TCGv r_cond)
>> {
>> @@ -1321,13 +1320,17 @@ static void do_branch(DisasContext *dc, int32_t
>> offset, uint32_t insn, int cc,
>> } else {
>> dc->pc = dc->npc;
>> dc->jump_pc[0] = target;
>> - dc->jump_pc[1] = dc->npc + 4;
>> - dc->npc = JUMP_PC;
>> + if (unlikely(dc->npc == DYNAMIC_PC)) {
>> + dc->jump_pc[1] = DYNAMIC_PC;
>> + tcg_gen_addi_tl(cpu_pc, cpu_npc, 4);
>> + } else {
>> + dc->jump_pc[1] = dc->npc + 4;
>> + dc->npc = JUMP_PC;
>> + }
>> }
>> }
>> }
>>
>> -/* XXX: potentially incorrect if dynamic npc */
>> static void do_fbranch(DisasContext *dc, int32_t offset, uint32_t insn, int
>> cc,
>> TCGv r_cond)
>> {
>> @@ -1362,14 +1365,18 @@ static void do_fbranch(DisasContext *dc, int32_t
>> offset, uint32_t insn, int cc,
>> } else {
>> dc->pc = dc->npc;
>> dc->jump_pc[0] = target;
>> - dc->jump_pc[1] = dc->npc + 4;
>> - dc->npc = JUMP_PC;
>> + if (unlikely(dc->npc == DYNAMIC_PC)) {
>> + dc->jump_pc[1] = DYNAMIC_PC;
>> + tcg_gen_addi_tl(cpu_pc, cpu_npc, 4);
>> + } else {
>> + dc->jump_pc[1] = dc->npc + 4;
>> + dc->npc = JUMP_PC;
>> + }
>> }
>> }
>> }
>>
>> #ifdef TARGET_SPARC64
>> -/* XXX: potentially incorrect if dynamic npc */
>> static void do_branch_reg(DisasContext *dc, int32_t offset, uint32_t insn,
>> TCGv r_cond, TCGv r_reg)
>> {
>> @@ -1384,8 +1391,13 @@ static void do_branch_reg(DisasContext *dc, int32_t
>> offset, uint32_t insn,
>> } else {
>> dc->pc = dc->npc;
>> dc->jump_pc[0] = target;
>> - dc->jump_pc[1] = dc->npc + 4;
>> - dc->npc = JUMP_PC;
>> + if (unlikely(dc->npc == DYNAMIC_PC)) {
>> + dc->jump_pc[1] = DYNAMIC_PC;
>> + tcg_gen_addi_tl(cpu_pc, cpu_npc, 4);
>> + } else {
>> + dc->jump_pc[1] = dc->npc + 4;
>> + dc->npc = JUMP_PC;
>> + }
>> }
>> }
>>
>> --
>> 1.7.3.4
>>
>>
>
--
Regards,
Artyom Tarasenko
solaris/sparc under qemu blog: http://tyom.blogspot.com/