From patchwork Mon Jul 14 17:40:59 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bastian Koppelmann X-Patchwork-Id: 369728 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 59A70140096 for ; Tue, 15 Jul 2014 02:47:26 +1000 (EST) Received: from localhost ([::1]:59047 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X6jPQ-0002FZ-K4 for incoming@patchwork.ozlabs.org; Mon, 14 Jul 2014 12:47:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57682) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X6jGu-0004qN-2N for qemu-devel@nongnu.org; Mon, 14 Jul 2014 12:38:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X6jGl-00021c-AN for qemu-devel@nongnu.org; Mon, 14 Jul 2014 12:38:35 -0400 Received: from mail.uni-paderborn.de ([131.234.142.9]:64320) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X6jGl-0001zq-4U for qemu-devel@nongnu.org; Mon, 14 Jul 2014 12:38:27 -0400 From: Bastian Koppelmann To: qemu-devel@nongnu.org Date: Mon, 14 Jul 2014 18:40:59 +0100 Message-Id: <1405359671-25985-4-git-send-email-kbastian@mail.uni-paderborn.de> X-Mailer: git-send-email 2.0.1 In-Reply-To: <1405359671-25985-1-git-send-email-kbastian@mail.uni-paderborn.de> References: <1405359671-25985-1-git-send-email-kbastian@mail.uni-paderborn.de> X-IMT-Spam-Score: 0.0 () X-PMX-Version: 6.1.0.2415318, Antispam-Engine: 2.7.2.2107409, Antispam-Data: 2014.7.14.163318 X-IMT-Authenticated-Sender: uid=kbastian,ou=People,o=upb,c=de X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 131.234.142.9 Cc: peter.maydell@linaro.org, rth@twiddle.net Subject: [Qemu-devel] [PATCH v2 03/15] target-tricore: Add softmmu support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Add basic softmmu support for TriCore Signed-off-by: Bastian Koppelmann --- target-tricore/helper.c | 54 +++++++++++++++++++++++++++++++++++++++++++++- target-tricore/op_helper.c | 33 +++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 2 deletions(-) -- 2.0.1 diff --git a/target-tricore/helper.c b/target-tricore/helper.c index f1712e4..743fa1f 100644 --- a/target-tricore/helper.c +++ b/target-tricore/helper.c @@ -24,10 +24,62 @@ #include "cpu.h" +enum { + TLBRET_DIRTY = -4, + TLBRET_INVALID = -3, + TLBRET_NOMATCH = -2, + TLBRET_BADADDR = -1, + TLBRET_MATCH = 0 +}; + +#if defined(CONFIG_SOFTMMU) +static int get_physical_address(CPUTRICOREState *env, hwaddr *physical, + int *prot, target_ulong address, + int rw, int access_type) +{ + int ret = TLBRET_MATCH; + + *physical = address & 0xFFFFFFFF; + *prot = PAGE_READ | PAGE_WRITE; + + return ret; +} +#endif + +/* TODO: Add exeption support*/ +static void raise_mmu_exception(CPUTRICOREState *env, target_ulong address, + int rw, int tlb_error) +{ +} + int cpu_tricore_handle_mmu_fault(CPUState *cs, target_ulong address, int rw, int mmu_idx) { - return 0; + TRICORECPU *cpu = TRICORE_CPU(cs); + CPUTRICOREState *env = &cpu->env; + hwaddr physical; + int prot; + int access_type; + int ret = 0; + + rw &= 1; + access_type = ACCESS_INT; + ret = get_physical_address(env, &physical, &prot, + address, rw, access_type); + qemu_log("%s address=" TARGET_FMT_lx " ret %d physical " TARGET_FMT_plx + " prot %d\n", __func__, address, ret, physical, prot); + + if (ret == TLBRET_MATCH) { + tlb_set_page(cs, address & TARGET_PAGE_MASK, + physical & TARGET_PAGE_MASK, prot | PAGE_EXEC, + mmu_idx, TARGET_PAGE_SIZE); + ret = 0; + } else if (ret < 0) { + raise_mmu_exception(env, address, rw, ret); + ret = 1; + } + + return ret; } void tricore_cpu_do_interrupt(CPUState *cs) diff --git a/target-tricore/op_helper.c b/target-tricore/op_helper.c index 275790b..2e5981f 100644 --- a/target-tricore/op_helper.c +++ b/target-tricore/op_helper.c @@ -20,8 +20,39 @@ #include "exec/helper-proto.h" #include "exec/cpu_ldst.h" +static inline void QEMU_NORETURN do_raise_exception_err(CPUTRICOREState *env, + uint32_t exception, + int error_code, + uintptr_t pc) +{ + CPUState *cs = CPU(tricore_env_get_cpu(env)); + cs->exception_index = exception; + env->error_code = error_code; + + if (pc) { + /* now we have a real cpu fault */ + cpu_restore_state(cs, pc); + } + + cpu_loop_exit(cs); +} + +static inline void QEMU_NORETURN do_raise_exception(CPUTRICOREState *env, + uint32_t exception, + uintptr_t pc) +{ + do_raise_exception_err(env, exception, 0, pc); +} + void tlb_fill(CPUState *cs, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) { + int ret; + ret = cpu_tricore_handle_mmu_fault(cs, addr, is_write, mmu_idx); + if (ret) { + TRICORECPU *cpu = TRICORE_CPU(cs); + CPUTRICOREState *env = &cpu->env; + do_raise_exception_err(env, cs->exception_index, + env->error_code, retaddr); + } } -