From 28896de8f899959df86ebec7f281c564cc504e6e Mon Sep 17 00:00:00 2001 Message-Id: In-Reply-To: References: From: Blue Swirl Date: Sun, 25 Mar 2012 18:52:04 +0000 Subject: [PATCH 15/20] ppc: split off timebase helpers Move decrementer and timebase helpers to a dedicated file. Signed-off-by: Blue Swirl --- Makefile.target | 5 +- target-ppc/op_helper.c | 135 ----------------------------------- target-ppc/timebase_helper.c | 160 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 164 insertions(+), 136 deletions(-) create mode 100644 target-ppc/timebase_helper.c diff --git a/Makefile.target b/Makefile.target index 810f23d..756aa6f 100644 --- a/Makefile.target +++ b/Makefile.target @@ -104,7 +104,7 @@ libobj-$(TARGET_UNICORE32) += cpu.o libobj-$(TARGET_ALPHA) += int_helper.o fpu_helper.o sys_helper.o mem_helper.o ifeq ($(TARGET_BASE_ARCH), ppc) libobj-y += fpu_helper.o int_helper.o mmu_helper.o -libobj-y += mmu_helper.o excp_helper.o +libobj-y += mmu_helper.o excp_helper.o timebase_helper.o endif libobj-y += disas.o @@ -119,6 +119,9 @@ $(libobj-y): $(GENERATED_HEADERS) ifneq ($(TARGET_BASE_ARCH), sparc) op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) endif +ifneq ($(TARGET_BASE_ARCH), ppc) +timebase_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +endif user-exec.o: QEMU_CFLAGS += $(HELPER_CFLAGS) # Note: this is a workaround. The real fix is to avoid compiling diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c index b2d2494..29dee0a 100644 --- a/target-ppc/op_helper.c +++ b/target-ppc/op_helper.c @@ -41,44 +41,6 @@ void helper_store_dump_spr(uint32_t sprn) qemu_log("Write SPR %d %03x <= " TARGET_FMT_lx "\n", sprn, sprn, env->spr[sprn]); } - -target_ulong helper_load_tbl(void) -{ - return (target_ulong)cpu_ppc_load_tbl(env); -} - -target_ulong helper_load_tbu(void) -{ - return cpu_ppc_load_tbu(env); -} - -target_ulong helper_load_atbl(void) -{ - return (target_ulong)cpu_ppc_load_atbl(env); -} - -target_ulong helper_load_atbu(void) -{ - return cpu_ppc_load_atbu(env); -} - -#if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) -target_ulong helper_load_purr(void) -{ - return (target_ulong)cpu_ppc_load_purr(env); -} -#endif - -target_ulong helper_load_601_rtcl(void) -{ - return cpu_ppc601_load_rtcl(env); -} - -target_ulong helper_load_601_rtcu(void) -{ - return cpu_ppc601_load_rtcu(env); -} - #if !defined(CONFIG_USER_ONLY) #if defined(TARGET_PPC64) void helper_store_asr(target_ulong val) @@ -92,46 +54,6 @@ void helper_store_sdr1(target_ulong val) ppc_store_sdr1(env, val); } -void helper_store_tbl(target_ulong val) -{ - cpu_ppc_store_tbl(env, val); -} - -void helper_store_tbu(target_ulong val) -{ - cpu_ppc_store_tbu(env, val); -} - -void helper_store_atbl(target_ulong val) -{ - cpu_ppc_store_atbl(env, val); -} - -void helper_store_atbu(target_ulong val) -{ - cpu_ppc_store_atbu(env, val); -} - -void helper_store_601_rtcl(target_ulong val) -{ - cpu_ppc601_store_rtcl(env, val); -} - -void helper_store_601_rtcu(target_ulong val) -{ - cpu_ppc601_store_rtcu(env, val); -} - -target_ulong helper_load_decr(void) -{ - return cpu_ppc_load_decr(env); -} - -void helper_store_decr(target_ulong val) -{ - cpu_ppc_store_decr(env, val); -} - void helper_store_hid0_601(target_ulong val) { target_ulong hid0; @@ -158,16 +80,6 @@ void helper_store_403_pbr(uint32_t num, target_ulong value) } } -target_ulong helper_load_40x_pit(void) -{ - return load_40x_pit(env); -} - -void helper_store_40x_pit(target_ulong val) -{ - store_40x_pit(env, val); -} - void helper_store_40x_dbcr0(target_ulong val) { store_40x_dbcr0(env, val); @@ -177,16 +89,6 @@ void helper_store_40x_sler(target_ulong val) { store_40x_sler(env, val); } - -void helper_store_booke_tcr(target_ulong val) -{ - store_booke_tcr(env, val); -} - -void helper_store_booke_tsr(target_ulong val) -{ - store_booke_tsr(env, val); -} #endif /*****************************************************************************/ @@ -379,43 +281,6 @@ target_ulong helper_clcs(uint32_t arg) } /*****************************************************************************/ -/* Embedded PowerPC specific helpers */ - -/* XXX: to be improved to check access rights when in user-mode */ -target_ulong helper_load_dcr(target_ulong dcrn) -{ - uint32_t val = 0; - - if (unlikely(env->dcr_env == NULL)) { - qemu_log("No DCR environment\n"); - helper_raise_exception_err(env, POWERPC_EXCP_PROGRAM, - POWERPC_EXCP_INVAL | - POWERPC_EXCP_INVAL_INVAL); - } else if (unlikely(ppc_dcr_read(env->dcr_env, - (uint32_t)dcrn, &val) != 0)) { - qemu_log("DCR read error %d %03x\n", (uint32_t)dcrn, (uint32_t)dcrn); - helper_raise_exception_err(env, POWERPC_EXCP_PROGRAM, - POWERPC_EXCP_INVAL | POWERPC_EXCP_PRIV_REG); - } - return val; -} - -void helper_store_dcr(target_ulong dcrn, target_ulong val) -{ - if (unlikely(env->dcr_env == NULL)) { - qemu_log("No DCR environment\n"); - helper_raise_exception_err(env, POWERPC_EXCP_PROGRAM, - POWERPC_EXCP_INVAL | - POWERPC_EXCP_INVAL_INVAL); - } else if (unlikely(ppc_dcr_write(env->dcr_env, (uint32_t)dcrn, - (uint32_t)val) != 0)) { - qemu_log("DCR write error %d %03x\n", (uint32_t)dcrn, (uint32_t)dcrn); - helper_raise_exception_err(env, POWERPC_EXCP_PROGRAM, - POWERPC_EXCP_INVAL | POWERPC_EXCP_PRIV_REG); - } -} - -/*****************************************************************************/ /* Altivec extension helpers */ #if defined(HOST_WORDS_BIGENDIAN) #define HI_IDX 0 diff --git a/target-ppc/timebase_helper.c b/target-ppc/timebase_helper.c new file mode 100644 index 0000000..23f5cfa --- /dev/null +++ b/target-ppc/timebase_helper.c @@ -0,0 +1,160 @@ +/* + * PowerPC emulation helpers for QEMU. + * + * Copyright (c) 2003-2007 Jocelyn Mayer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#include "cpu.h" +#include "dyngen-exec.h" +#include "helper.h" + +/*****************************************************************************/ +/* SPR accesses */ + +target_ulong helper_load_tbl(void) +{ + return (target_ulong)cpu_ppc_load_tbl(env); +} + +target_ulong helper_load_tbu(void) +{ + return cpu_ppc_load_tbu(env); +} + +target_ulong helper_load_atbl(void) +{ + return (target_ulong)cpu_ppc_load_atbl(env); +} + +target_ulong helper_load_atbu(void) +{ + return cpu_ppc_load_atbu(env); +} + +#if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) +target_ulong helper_load_purr(void) +{ + return (target_ulong)cpu_ppc_load_purr(env); +} +#endif + +target_ulong helper_load_601_rtcl(void) +{ + return cpu_ppc601_load_rtcl(env); +} + +target_ulong helper_load_601_rtcu(void) +{ + return cpu_ppc601_load_rtcu(env); +} + +#if !defined(CONFIG_USER_ONLY) +void helper_store_tbl(target_ulong val) +{ + cpu_ppc_store_tbl(env, val); +} + +void helper_store_tbu(target_ulong val) +{ + cpu_ppc_store_tbu(env, val); +} + +void helper_store_atbl(target_ulong val) +{ + cpu_ppc_store_atbl(env, val); +} + +void helper_store_atbu(target_ulong val) +{ + cpu_ppc_store_atbu(env, val); +} + +void helper_store_601_rtcl(target_ulong val) +{ + cpu_ppc601_store_rtcl(env, val); +} + +void helper_store_601_rtcu(target_ulong val) +{ + cpu_ppc601_store_rtcu(env, val); +} + +target_ulong helper_load_decr(void) +{ + return cpu_ppc_load_decr(env); +} + +void helper_store_decr(target_ulong val) +{ + cpu_ppc_store_decr(env, val); +} + +target_ulong helper_load_40x_pit(void) +{ + return load_40x_pit(env); +} + +void helper_store_40x_pit(target_ulong val) +{ + store_40x_pit(env, val); +} + +void helper_store_booke_tcr(target_ulong val) +{ + store_booke_tcr(env, val); +} + +void helper_store_booke_tsr(target_ulong val) +{ + store_booke_tsr(env, val); +} +#endif + +/*****************************************************************************/ +/* Embedded PowerPC specific helpers */ + +/* XXX: to be improved to check access rights when in user-mode */ +target_ulong helper_load_dcr(target_ulong dcrn) +{ + uint32_t val = 0; + + if (unlikely(env->dcr_env == NULL)) { + qemu_log("No DCR environment\n"); + helper_raise_exception_err(env, POWERPC_EXCP_PROGRAM, + POWERPC_EXCP_INVAL | + POWERPC_EXCP_INVAL_INVAL); + } else if (unlikely(ppc_dcr_read(env->dcr_env, + (uint32_t)dcrn, &val) != 0)) { + qemu_log("DCR read error %d %03x\n", (uint32_t)dcrn, (uint32_t)dcrn); + helper_raise_exception_err(env, POWERPC_EXCP_PROGRAM, + POWERPC_EXCP_INVAL | POWERPC_EXCP_PRIV_REG); + } + return val; +} + +void helper_store_dcr(target_ulong dcrn, target_ulong val) +{ + if (unlikely(env->dcr_env == NULL)) { + qemu_log("No DCR environment\n"); + helper_raise_exception_err(env, POWERPC_EXCP_PROGRAM, + POWERPC_EXCP_INVAL | + POWERPC_EXCP_INVAL_INVAL); + } else if (unlikely(ppc_dcr_write(env->dcr_env, (uint32_t)dcrn, + (uint32_t)val) != 0)) { + qemu_log("DCR write error %d %03x\n", (uint32_t)dcrn, (uint32_t)dcrn); + helper_raise_exception_err(env, POWERPC_EXCP_PROGRAM, + POWERPC_EXCP_INVAL | POWERPC_EXCP_PRIV_REG); + } +} -- 1.7.2.5