aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurelien Jarno <aurelien@aurel32.net>2009-11-30 01:39:22 +0100
committerAurelien Jarno <aurelien@aurel32.net>2009-11-30 16:10:04 +0100
commit25b91e32e0c93cb60cf9be43a52881de00c91be6 (patch)
tree688b9c16ae10aee944f72034d6de7c05128501d1
parenttarget-mips: split code raising MMU exception in a separate function (diff)
downloadqemu-kvm-25b91e32e0c93cb60cf9be43a52881de00c91be6.tar.gz
qemu-kvm-25b91e32e0c93cb60cf9be43a52881de00c91be6.tar.bz2
qemu-kvm-25b91e32e0c93cb60cf9be43a52881de00c91be6.zip
target-mips: add a function to do virtual -> physical translations
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
-rw-r--r--target-mips/cpu.h2
-rw-r--r--target-mips/helper.c23
2 files changed, 25 insertions, 0 deletions
diff --git a/target-mips/cpu.h b/target-mips/cpu.h
index 82f9a3816..97e106f47 100644
--- a/target-mips/cpu.h
+++ b/target-mips/cpu.h
@@ -590,6 +590,8 @@ int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
#define cpu_handle_mmu_fault cpu_mips_handle_mmu_fault
void do_interrupt (CPUState *env);
void r4k_invalidate_tlb (CPUState *env, int idx, int use_extra);
+target_phys_addr_t do_translate_address (CPUState *env, target_ulong address,
+ int rw);
static inline void cpu_pc_from_tb(CPUState *env, TranslationBlock *tb)
{
diff --git a/target-mips/helper.c b/target-mips/helper.c
index 0b5ec3e56..1e7e01608 100644
--- a/target-mips/helper.c
+++ b/target-mips/helper.c
@@ -310,6 +310,29 @@ int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
return ret;
}
+#if !defined(CONFIG_USER_ONLY)
+target_phys_addr_t do_translate_address(CPUState *env, target_ulong address, int rw)
+{
+ target_phys_addr_t physical;
+ int prot;
+ int access_type;
+ int ret = 0;
+
+ rw &= 1;
+
+ /* data access */
+ access_type = ACCESS_INT;
+ ret = get_physical_address(env, &physical, &prot,
+ address, rw, access_type);
+ if (ret != TLBRET_MATCH) {
+ raise_mmu_exception(env, address, rw, ret);
+ cpu_loop_exit();
+ }
+
+ return physical;
+}
+#endif
+
static const char * const excp_names[EXCP_LAST + 1] = {
[EXCP_RESET] = "reset",
[EXCP_SRESET] = "soft reset",