4
* Copyright (c) 2011-2012 Jia Liu <proljc@gmail.com>
6
* This library is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2 of the License, or (at your option) any later version.
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
21
#include "qemu-common.h"
23
#include "host-utils.h"
24
#ifndef CONFIG_USER_ONLY
25
#include "hw/loader.h"
28
void do_interrupt(CPUOpenRISCState *env)
30
#ifndef CONFIG_USER_ONLY
31
if (env->flags & D_FLAG) { /* Delay Slot insn */
32
env->flags &= ~D_FLAG;
34
if (env->exception_index == EXCP_TICK ||
35
env->exception_index == EXCP_INT ||
36
env->exception_index == EXCP_SYSCALL ||
37
env->exception_index == EXCP_FPE) {
38
env->epcr = env->jmp_pc;
40
env->epcr = env->pc - 4;
43
if (env->exception_index == EXCP_TICK ||
44
env->exception_index == EXCP_INT ||
45
env->exception_index == EXCP_SYSCALL ||
46
env->exception_index == EXCP_FPE) {
53
/* For machine-state changed between user-mode and supervisor mode,
54
we need flush TLB when we enter&exit EXCP. */
63
env->tlb->cpu_openrisc_map_address_data = &cpu_openrisc_get_phys_nommu;
64
env->tlb->cpu_openrisc_map_address_code = &cpu_openrisc_get_phys_nommu;
66
if (env->exception_index > 0 && env->exception_index < EXCP_NR) {
67
env->pc = (env->exception_index << 8);
69
cpu_abort(env, "Unhandled exception 0x%x\n", env->exception_index);
73
env->exception_index = -1;