From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LoIby-000840-W7 for qemu-devel@nongnu.org; Mon, 30 Mar 2009 10:37:15 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LoIbp-0007uH-08 for qemu-devel@nongnu.org; Mon, 30 Mar 2009 10:37:09 -0400 Received: from [199.232.76.173] (port=54203 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LoIbm-0007tf-PP for qemu-devel@nongnu.org; Mon, 30 Mar 2009 10:37:03 -0400 Received: from mel.act-europe.fr ([212.99.106.210]:60661) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LoIbl-00013b-Dd for qemu-devel@nongnu.org; Mon, 30 Mar 2009 10:37:02 -0400 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 1BAD429005C for ; Mon, 30 Mar 2009 16:36:39 +0200 (CEST) Received: from mel.act-europe.fr ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id D1Z1mEgqNX3G for ; Mon, 30 Mar 2009 16:36:38 +0200 (CEST) Received: from ulanbator.act-europe.fr (ulanbator.act-europe.fr [10.10.1.67]) by mel.act-europe.fr (Postfix) with ESMTP id 43485290063 for ; Mon, 30 Mar 2009 16:36:35 +0200 (CEST) From: Tristan Gingold Date: Mon, 30 Mar 2009 16:36:32 +0200 Message-Id: <1238423794-25455-18-git-send-email-gingold@adacore.com> In-Reply-To: <1238423794-25455-17-git-send-email-gingold@adacore.com> References: <1238423794-25455-1-git-send-email-gingold@adacore.com> <1238423794-25455-2-git-send-email-gingold@adacore.com> <1238423794-25455-3-git-send-email-gingold@adacore.com> <1238423794-25455-4-git-send-email-gingold@adacore.com> <1238423794-25455-5-git-send-email-gingold@adacore.com> <1238423794-25455-6-git-send-email-gingold@adacore.com> <1238423794-25455-7-git-send-email-gingold@adacore.com> <1238423794-25455-8-git-send-email-gingold@adacore.com> <1238423794-25455-9-git-send-email-gingold@adacore.com> <1238423794-25455-10-git-send-email-gingold@adacore.com> <1238423794-25455-11-git-send-email-gingold@adacore.com> <1238423794-25455-12-git-send-email-gingold@adacore.com> <1238423794-25455-13-git-send-email-gingold@adacore.com> <1238423794-25455-14-git-send-email-gingold@adacore.com> <1238423794-25455-15-git-send-email-gingold@adacore.com> <1238423794-25455-16-git-send-email-gingold@adacore.com> <1238423794-25455-17-git-send-email-gingold@adacore.com> Subject: [Qemu-devel] [PATCH 17/19] Move linux-user pal emulation to linux-user/ Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Move pal emulation for user emulation from alpha_palcode.c to linux-user/mai Add generic exception names. Fix offset for PAL calls. Signed-off-by: Tristan Gingold --- Makefile.target | 5 +-- hw/alpha_palcode.c | 44 --------------------- linux-user/main.c | 96 +++++++++++++++++++++++++--------------------- target-alpha/cpu.h | 39 +++++++++++++++--- target-alpha/helper.c | 4 +- target-alpha/translate.c | 1 - 6 files changed, 87 insertions(+), 102 deletions(-) diff --git a/Makefile.target b/Makefile.target index 68937fe..de6f7eb 100644 --- a/Makefile.target +++ b/Makefile.target @@ -157,10 +157,6 @@ ifeq ($(TARGET_BASE_ARCH), arm) LIBOBJS+= neon_helper.o iwmmxt_helper.o endif -ifeq ($(TARGET_BASE_ARCH), alpha) -LIBOBJS+= alpha_palcode.o -endif - ifeq ($(TARGET_BASE_ARCH), cris) LIBOBJS+= cris-dis.o @@ -686,6 +682,7 @@ endif ifeq ($(TARGET_BASE_ARCH), alpha) OBJS+= es40.o 21272.o serial.o i8259.o mc146818rtc.o i8254.o pcspk.o dma.o OBJS+= ali1543.o +#OBJS+= alpha_palcode.o # Not currently used until pal is virtualized endif ifdef CONFIG_GDBSTUB OBJS+=gdbstub.o gdbstub-xml.o diff --git a/hw/alpha_palcode.c b/hw/alpha_palcode.c index bfffb5d..189033c 100644 --- a/hw/alpha_palcode.c +++ b/hw/alpha_palcode.c @@ -26,7 +26,6 @@ #include "cpu.h" #include "exec-all.h" -#if !defined (CONFIG_USER_ONLY) /* Shared handlers */ static void pal_reset (CPUState *env); /* Console handlers */ @@ -1051,46 +1050,3 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, uint32_t address, int rw, return ret; } #endif - -#else /* !defined (CONFIG_USER_ONLY) */ -void pal_init (CPUState *env) -{ -} - -void call_pal (CPUState *env, int palcode) -{ - target_long ret; - - qemu_log("%s: palcode %02x\n", __func__, palcode); - switch (palcode) { - case 0x83: - /* CALLSYS */ - qemu_log("CALLSYS n " TARGET_FMT_ld "\n", env->ir[0]); - ret = do_syscall(env, env->ir[IR_V0], env->ir[IR_A0], env->ir[IR_A1], - env->ir[IR_A2], env->ir[IR_A3], env->ir[IR_A4], - env->ir[IR_A5]); - if (ret >= 0) { - env->ir[IR_A3] = 0; - env->ir[IR_V0] = ret; - } else { - env->ir[IR_A3] = 1; - env->ir[IR_V0] = -ret; - } - break; - case 0x9E: - /* RDUNIQUE */ - env->ir[IR_V0] = env->unique; - qemu_log("RDUNIQUE: " TARGET_FMT_lx "\n", env->unique); - break; - case 0x9F: - /* WRUNIQUE */ - env->unique = env->ir[IR_A0]; - qemu_log("WRUNIQUE: " TARGET_FMT_lx "\n", env->unique); - break; - default: - qemu_log("%s: unhandled palcode %02x\n", - __func__, palcode); - exit(1); - } -} -#endif diff --git a/linux-user/main.c b/linux-user/main.c index feb3036..5a1e98b 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -2110,6 +2110,43 @@ void cpu_loop(CPUM68KState *env) #endif /* TARGET_M68K */ #ifdef TARGET_ALPHA +static void call_pal (CPUState *env, int palcode) +{ + target_long ret; + + qemu_log("%s: palcode %02x\n", __func__, palcode); + switch (palcode) { + case 0x83: + /* CALLSYS */ + qemu_log("CALLSYS n " TARGET_FMT_ld "\n", env->ir[0]); + ret = do_syscall(env, env->ir[IR_V0], env->ir[IR_A0], env->ir[IR_A1], + env->ir[IR_A2], env->ir[IR_A3], env->ir[IR_A4], + env->ir[IR_A5]); + if (ret >= 0) { + env->ir[IR_A3] = 0; + env->ir[IR_V0] = ret; + } else { + env->ir[IR_A3] = 1; + env->ir[IR_V0] = -ret; + } + break; + case 0x9E: + /* RDUNIQUE */ + env->ir[IR_V0] = env->user.unique; + qemu_log("RDUNIQUE: " TARGET_FMT_lx "\n", env->user.unique); + break; + case 0x9F: + /* WRUNIQUE */ + env->user.unique = env->ir[IR_A0]; + qemu_log("WRUNIQUE: " TARGET_FMT_lx "\n", env->user.unique); + break; + default: + qemu_log("%s: unhandled palcode %02x\n", + __func__, palcode); + exit(1); + } +} + void cpu_loop (CPUState *env) { int trapnr; @@ -2119,61 +2156,29 @@ void cpu_loop (CPUState *env) trapnr = cpu_alpha_exec (env); switch (trapnr) { - case EXCP_RESET: - fprintf(stderr, "Reset requested. Exit\n"); - exit(1); - break; - case EXCP_MCHK: - fprintf(stderr, "Machine check exception. Exit\n"); - exit(1); - break; - case EXCP_ARITH: + case EXCP_GEN_ARITH: fprintf(stderr, "Arithmetic trap.\n"); exit(1); break; - case EXCP_HW_INTERRUPT: - fprintf(stderr, "External interrupt. Exit\n"); - exit(1); - break; - case EXCP_DFAULT: - fprintf(stderr, "MMU data fault\n"); + case EXCP_GEN_INTERRUPT: + fprintf(stderr, "Hardware interruption\n"); exit(1); break; - case EXCP_DTB_MISS_PAL: - fprintf(stderr, "MMU data TLB miss in PALcode\n"); - exit(1); - break; - case EXCP_ITB_MISS: - fprintf(stderr, "MMU instruction TLB miss\n"); - exit(1); - break; - case EXCP_ITB_ACV: - fprintf(stderr, "MMU instruction access violation\n"); - exit(1); - break; - case EXCP_DTB_MISS_NATIVE: - fprintf(stderr, "MMU data TLB miss\n"); - exit(1); - break; - case EXCP_UNALIGN: - fprintf(stderr, "Unaligned access\n"); - exit(1); - break; - case EXCP_OPCDEC: + case EXCP_GEN_OPCDEC: fprintf(stderr, "Invalid instruction\n"); exit(1); break; - case EXCP_FEN: - fprintf(stderr, "Floating-point not allowed\n"); + case EXCP_USER_ITB_MISS: + fprintf(stderr, "MMU instruction TLB miss\n"); exit(1); break; - case EXCP_CALL_PAL ... (EXCP_CALL_PALP - 1): - call_pal(env, (trapnr >> 6) | 0x80); - break; - case EXCP_CALL_PALP ... (EXCP_CALL_PALE - 1): + case EXCP_CALL_PALP ... (EXCP_CALL_PAL - 1): fprintf(stderr, "Privileged call to PALcode\n"); exit(1); break; + case EXCP_CALL_PAL ... (EXCP_CALL_PALE - 1): + call_pal(env, ((trapnr - EXCP_CALL_PAL) >> 6) | 0x80); + break; case EXCP_DEBUG: { int sig; @@ -2409,6 +2414,9 @@ int main(int argc, char **argv, char **envp) #else cpu_model = "750"; #endif +#elif defined(TARGET_ALPHA) + cpu_model = "21264"; + #else cpu_model = "any"; #endif @@ -2665,10 +2673,10 @@ int main(int argc, char **argv, char **envp) for(i = 0; i < 28; i++) { env->ir[i] = ((abi_ulong *)regs)[i]; } - env->ipr[IPR_USP] = regs->usp; + env->user.usp = regs->usp; env->ir[30] = regs->usp; env->pc = regs->pc; - env->unique = regs->unique; + env->user.unique = regs->unique; } #elif defined(TARGET_CRIS) { diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h index c27e89f..7cd6395 100644 --- a/target-alpha/cpu.h +++ b/target-alpha/cpu.h @@ -291,7 +291,11 @@ struct pal_handler_t { void (*call_pal)(CPUAlphaState *env, uint32_t palcode); }; +#if !defined(CONFIG_USER_ONLY) #define NB_MMU_MODES 4 +#else +#define NB_MMU_MODES 2 +#endif struct CPUAlphaState { uint64_t ir[31]; @@ -318,6 +322,12 @@ struct CPUAlphaState { CPU_COMMON uint32_t hflags; +#if defined(CONFIG_USER_ONLY) + struct { + uint64_t usp; + uint64_t unique; + } user; +#endif int error_code; @@ -342,6 +352,8 @@ struct CPUAlphaState { #define MMU_KERNEL_IDX 0 #define MMU_USER_IDX 3 #define MMU_PAL_IDX 4 + +#if !defined(CONFIG_USER_ONLY) static inline int cpu_mmu_index_data (CPUState *env) { return env->mmu_data_index; @@ -351,8 +363,13 @@ static inline int cpu_mmu_index_code (CPUState *env) { return env->mmu_code_index; } +#else +#define cpu_mmu_index_data cpu_mmu_index_code +static inline int cpu_mmu_index_code (CPUState *env) +{ + return 0; +} -#if defined(CONFIG_USER_ONLY) static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) { if (newsp) @@ -384,9 +401,20 @@ enum { EXCP_UNALIGN = 0x11E0, EXCP_OPCDEC = 0x13E0, EXCP_FEN = 0x17E0, - EXCP_CALL_PAL = 0x2000, - EXCP_CALL_PALP = 0x3000, - EXCP_CALL_PALE = 0x4000, + + /* Generic exception - to be mapped to processor. */ + EXCP_GEN_OPCDEC = 1, + EXCP_GEN_ARITH = 2, + EXCP_GEN_INTERRUPT = 3, + EXCP_GEN_LAST = 3, + + /* User linux exception. */ + EXCP_USER_DFAULT = 0x0100, + EXCP_USER_ITB_MISS = 0x0101, + + EXCP_CALL_PALP = 0x2000, + EXCP_CALL_PAL = 0x3000, + EXCP_CALL_PALE = 0x4000, /* End of Pal */ /* Pseudo exception for console */ EXCP_CONSOLE_DISPATCH = 0x4001, EXCP_CONSOLE_FIXUP = 0x4002, @@ -448,11 +476,8 @@ void do_interrupt (CPUState *env); int cpu_alpha_mfpr (CPUState *env, int iprn, uint64_t *valp); int cpu_alpha_mtpr (CPUState *env, int iprn, uint64_t val, uint64_t *oldvalp); -void pal_init (CPUState *env); #if !defined (CONFIG_USER_ONLY) void call_pal (CPUState *env); -#else -void call_pal (CPUState *env, int palcode); #endif static inline void cpu_pc_from_tb(CPUState *env, TranslationBlock *tb) diff --git a/target-alpha/helper.c b/target-alpha/helper.c index fc68a7e..4046463 100644 --- a/target-alpha/helper.c +++ b/target-alpha/helper.c @@ -31,9 +31,9 @@ int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw, int mmu_idx, int is_softmmu) { if (rw == 2) - env->exception_index = EXCP_ITB_MISS; + env->exception_index = EXCP_USER_ITB_MISS; else - env->exception_index = EXCP_DFAULT; + env->exception_index = EXCP_USER_DFAULT; env->ipr[IPR_EXC_ADDR] = address; return 1; diff --git a/target-alpha/translate.c b/target-alpha/translate.c index dab8d78..061cf5f 100644 --- a/target-alpha/translate.c +++ b/target-alpha/translate.c @@ -2510,7 +2510,6 @@ CPUAlphaState * cpu_alpha_init (const char *cpu_model) #if defined (CONFIG_USER_ONLY) env->ps |= 1 << 3; #endif - pal_init(env); /* Initialize IPR */ hwpcb = env->ipr[IPR_PCBB]; env->ipr[IPR_ASN] = 0; -- 1.6.2