From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51102) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VYPbF-00016q-Gl for qemu-devel@nongnu.org; Mon, 21 Oct 2013 20:13:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VYPb9-0002hX-89 for qemu-devel@nongnu.org; Mon, 21 Oct 2013 20:13:29 -0400 Received: from www11.your-server.de ([213.133.104.11]:55680) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VYPb9-0002hS-1e for qemu-devel@nongnu.org; Mon, 21 Oct 2013 20:13:23 -0400 From: Sebastian Macke Date: Tue, 22 Oct 2013 02:12:40 +0200 Message-Id: <1382400765-26377-5-git-send-email-sebastian@macke.de> In-Reply-To: <1382400765-26377-1-git-send-email-sebastian@macke.de> References: <1382400765-26377-1-git-send-email-sebastian@macke.de> Subject: [Qemu-devel] [PATCH_v2 4/9] target-openrisc: Correct wrong epcr register in interrupt handler List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, proljc@gmail.com Cc: sebastian@macke.de, openrisc@lists.openrisc.net, openrisc@lists.opencores.org This patch corrects several misbehaviors during an interrupt process. Most of the time the pc is already correct and therefore no special treatment of the exceptions is necessary. Tested by checking crashing programs which otherwise work in or1ksim. Signed-off-by: Sebastian Macke --- target-openrisc/interrupt.c | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/target-openrisc/interrupt.c b/target-openrisc/interrupt.c index 16ef4b3..2153e7e 100644 --- a/target-openrisc/interrupt.c +++ b/target-openrisc/interrupt.c @@ -30,26 +30,15 @@ void openrisc_cpu_do_interrupt(CPUState *cs) OpenRISCCPU *cpu = OPENRISC_CPU(cs); CPUOpenRISCState *env = &cpu->env; #ifndef CONFIG_USER_ONLY - if (env->flags & D_FLAG) { /* Delay Slot insn */ + + env->epcr = env->pc; + if (env->flags & D_FLAG) { env->flags &= ~D_FLAG; env->sr |= SR_DSX; - if (env->exception_index == EXCP_TICK || - env->exception_index == EXCP_INT || - env->exception_index == EXCP_SYSCALL || - env->exception_index == EXCP_FPE) { - env->epcr = env->jmp_pc; - } else { - env->epcr = env->pc - 4; - } - } else { - if (env->exception_index == EXCP_TICK || - env->exception_index == EXCP_INT || - env->exception_index == EXCP_SYSCALL || - env->exception_index == EXCP_FPE) { - env->epcr = env->npc; - } else { - env->epcr = env->pc; - } + env->epcr -= 4; + } + if (env->exception_index == EXCP_SYSCALL) { + env->epcr += 4; } /* For machine-state changed between user-mode and supervisor mode, -- 1.8.4.1