From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:50593) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QzE9e-0007yV-1J for qemu-devel@nongnu.org; Thu, 01 Sep 2011 16:46:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QzE9Z-0003EA-J6 for qemu-devel@nongnu.org; Thu, 01 Sep 2011 16:46:29 -0400 Received: from [188.134.19.124] (port=36914 helo=octofox.metropolis) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QzE9Y-0003D8-2q for qemu-devel@nongnu.org; Thu, 01 Sep 2011 16:46:24 -0400 From: Max Filippov Date: Fri, 2 Sep 2011 00:45:55 +0400 Message-Id: <1314909960-31738-28-git-send-email-jcmvbkbc@gmail.com> In-Reply-To: <1314909960-31738-1-git-send-email-jcmvbkbc@gmail.com> References: <1314909960-31738-1-git-send-email-jcmvbkbc@gmail.com> Subject: [Qemu-devel] [PATCH v4 27/32] target-xtensa: implement relocatable vectors List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: jcmvbkbc@gmail.com See ISA, 4.4.3 for details. Vector addresses recorded in core configuration are absolute values that correspond to default VECBASE value. Signed-off-by: Max Filippov --- target-xtensa/cpu.h | 2 ++ target-xtensa/helper.c | 18 ++++++++++++++++-- target-xtensa/translate.c | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/target-xtensa/cpu.h b/target-xtensa/cpu.h index 37f8b7f..c9094e9 100644 --- a/target-xtensa/cpu.h +++ b/target-xtensa/cpu.h @@ -123,6 +123,7 @@ enum { INTCLEAR = 227, INTENABLE = 228, PS = 230, + VECBASE = 231, EXCCAUSE = 232, CCOUNT = 234, PRID = 235, @@ -219,6 +220,7 @@ typedef struct XtensaConfig { unsigned nareg; int excm_level; int ndepc; + uint32_t vecbase; uint32_t exception_vector[EXC_MAX]; unsigned ninterrupt; unsigned nlevel; diff --git a/target-xtensa/helper.c b/target-xtensa/helper.c index c24a38a..dacb379 100644 --- a/target-xtensa/helper.c +++ b/target-xtensa/helper.c @@ -41,6 +41,7 @@ void cpu_reset(CPUXtensaState *env) env->sregs[LITBASE] &= ~1; env->sregs[PS] = xtensa_option_enabled(env->config, XTENSA_OPTION_INTERRUPT) ? 0x1f : 0x10; + env->sregs[VECBASE] = env->config->vecbase; env->pending_irq_level = 0; } @@ -54,6 +55,7 @@ static const XtensaConfig core_config[] = { .nareg = 64, .ndepc = 1, .excm_level = 16, + .vecbase = 0x5fff8400, .exception_vector = { [EXC_RESET] = 0x5fff8000, [EXC_WINDOW_OVERFLOW4] = 0x5fff8400, @@ -140,6 +142,16 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr) return addr; } +static uint32_t relocated_vector(CPUState *env, uint32_t vector) +{ + if (xtensa_option_enabled(env->config, + XTENSA_OPTION_RELOCATABLE_VECTOR)) { + return vector - env->config->vecbase + env->sregs[VECBASE]; + } else { + return vector; + } +} + /*! * Handle penging IRQ. * For the high priority interrupt jump to the corresponding interrupt vector. @@ -160,7 +172,8 @@ static void handle_interrupt(CPUState *env) env->sregs[EPS2 + level - 2] = env->sregs[PS]; env->sregs[PS] = (env->sregs[PS] & ~PS_INTLEVEL) | level | PS_EXCM; - env->pc = env->config->interrupt_vector[level]; + env->pc = relocated_vector(env, + env->config->interrupt_vector[level]); } else { env->sregs[EXCCAUSE] = LEVEL1_INTERRUPT_CAUSE; @@ -212,7 +225,8 @@ void do_interrupt(CPUState *env) __func__, env->exception_index, env->pc, env->regs[0], env->sregs[PS], env->sregs[CCOUNT]); if (env->config->exception_vector[env->exception_index]) { - env->pc = env->config->exception_vector[env->exception_index]; + env->pc = relocated_vector(env, + env->config->exception_vector[env->exception_index]); env->exception_taken = 1; } else { qemu_log("%s(pc = %08x) bad exception_index: %d\n", diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 423cbae..3b21bc4 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -106,6 +106,7 @@ static const char * const sregnames[256] = { [INTCLEAR] = "INTCLEAR", [INTENABLE] = "INTENABLE", [PS] = "PS", + [VECBASE] = "VECBASE", [EXCCAUSE] = "EXCCAUSE", [CCOUNT] = "CCOUNT", [PRID] = "PRID", -- 1.7.6