From: Richard Henderson <rth@twiddle.net>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 19/24] target-alpha: Implement cpu_alpha_handle_mmu_fault for system mode.
Date: Tue, 19 Apr 2011 08:04:56 -0700 [thread overview]
Message-ID: <1303225501-12778-20-git-send-email-rth@twiddle.net> (raw)
In-Reply-To: <1303225501-12778-1-git-send-email-rth@twiddle.net>
Reads the page table how PALcode would, except that the virtual
page table base register is not used.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
target-alpha/cpu.h | 12 +++++
target-alpha/helper.c | 129 +++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 137 insertions(+), 4 deletions(-)
diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h
index d4edaf8..d133cc6 100644
--- a/target-alpha/cpu.h
+++ b/target-alpha/cpu.h
@@ -315,6 +315,18 @@ enum {
EXCP_STQ_C,
};
+enum {
+ PTE_VALID = 0x0001,
+ PTE_FOR = 0x0002, /* used for page protection (fault on read) */
+ PTE_FOW = 0x0004, /* used for page protection (fault on write) */
+ PTE_FOE = 0x0008, /* used for page protection (fault on exec) */
+ PTE_ASM = 0x0010,
+ PTE_KRE = 0x0100,
+ PTE_URE = 0x0200,
+ PTE_KWE = 0x1000,
+ PTE_UWE = 0x2000
+};
+
/* Hardware interrupt (entInt) constants. */
enum {
INT_K_IP,
diff --git a/target-alpha/helper.c b/target-alpha/helper.c
index ce5f257..aaf5108 100644
--- a/target-alpha/helper.c
+++ b/target-alpha/helper.c
@@ -200,14 +200,135 @@ void swap_shadow_regs(CPUState *env)
env->shadow[7] = i7;
}
-target_phys_addr_t cpu_get_phys_page_debug (CPUState *env, target_ulong addr)
+/* Returns the OSF/1 entMM failure indication, or -1 on success. */
+static int get_physical_address(CPUState *env, target_ulong addr,
+ int prot_need, int mmu_idx,
+ target_ulong *pphys, int *pprot)
{
- return -1;
+ target_long saddr = addr;
+ target_ulong phys = 0;
+ target_ulong L1pte, L2pte, L3pte;
+ target_ulong pt, index;
+ int prot = 0;
+ int ret = MM_K_ACV;
+
+ /* Ensure that the virtual address is properly sign-extended from
+ the last implemented virtual address bit. */
+ if (saddr >> TARGET_VIRT_ADDR_SPACE_BITS != saddr >> 63) {
+ goto exit;
+ }
+
+ /* Translate the superpage. */
+ /* ??? When we do more than emulate Unix PALcode, we'll need to
+ determine which superpage is actually active. */
+ if (saddr < 0 && (saddr >> (TARGET_VIRT_ADDR_SPACE_BITS - 2) & 3) == 2) {
+ /* User-space cannot access kseg addresses. */
+ if (mmu_idx != MMU_KERNEL_IDX) {
+ goto exit;
+ }
+
+ phys = saddr & ((1ull << 40) - 1);
+ prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
+ ret = -1;
+ goto exit;
+ }
+
+ /* Interpret the page table exactly like PALcode does. */
+
+ pt = env->ptbr;
+
+ /* L1 page table read. */
+ index = (addr >> (TARGET_PAGE_BITS + 20)) & 0x3ff;
+ L1pte = ldq_phys(pt + index*8);
+
+ if (unlikely((L1pte & PTE_VALID) == 0)) {
+ ret = MM_K_TNV;
+ goto exit;
+ }
+ if (unlikely((L1pte & PTE_KRE) == 0)) {
+ goto exit;
+ }
+ pt = L1pte >> 32 << TARGET_PAGE_BITS;
+
+ /* L2 page table read. */
+ index = (addr >> (TARGET_PAGE_BITS + 10)) & 0x3ff;
+ L2pte = ldq_phys(pt + index*8);
+
+ if (unlikely((L2pte & PTE_VALID) == 0)) {
+ ret = MM_K_TNV;
+ goto exit;
+ }
+ if (unlikely((L2pte & PTE_KRE) == 0)) {
+ goto exit;
+ }
+ pt = L2pte >> 32 << TARGET_PAGE_BITS;
+
+ /* L3 page table read. */
+ index = (addr >> TARGET_PAGE_BITS) & 0x3ff;
+ L3pte = ldq_phys(pt + index*8);
+
+ phys = L3pte >> 32 << TARGET_PAGE_BITS;
+ if (unlikely((L3pte & PTE_VALID) == 0)) {
+ ret = MM_K_TNV;
+ goto exit;
+ }
+
+#if PAGE_READ != 1 || PAGE_WRITE != 2 || PAGE_EXEC != 4
+# error page bits out of date
+#endif
+
+ /* Check access violations. */
+ if (L3pte & (PTE_KRE << mmu_idx)) {
+ prot |= PAGE_READ | PAGE_EXEC;
+ }
+ if (L3pte & (PTE_KWE << mmu_idx)) {
+ prot |= PAGE_WRITE;
+ }
+ if (unlikely((prot & prot_need) == 0 && prot_need)) {
+ goto exit;
+ }
+
+ /* Check fault-on-operation violations. */
+ prot &= ~(L3pte >> 1);
+ ret = -1;
+ if (unlikely((prot & prot_need) == 0)) {
+ ret = (prot_need & PAGE_EXEC ? MM_K_FOE :
+ prot_need & PAGE_WRITE ? MM_K_FOW :
+ prot_need & PAGE_READ ? MM_K_FOR : -1);
+ }
+
+ exit:
+ *pphys = phys;
+ *pprot = prot;
+ return ret;
}
-int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
- int mmu_idx, int is_softmmu)
+target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
+{
+ target_ulong phys;
+ int prot, fail;
+
+ fail = get_physical_address(env, addr, 0, 0, &phys, &prot);
+ return (fail >= 0 ? -1 : phys);
+}
+
+int cpu_alpha_handle_mmu_fault(CPUState *env, target_ulong addr, int rw,
+ int mmu_idx, int is_softmmu)
{
+ target_ulong phys;
+ int prot, fail;
+
+ fail = get_physical_address(env, addr, 1 << rw, mmu_idx, &phys, &prot);
+ if (unlikely(fail >= 0)) {
+ env->exception_index = EXCP_MMFAULT;
+ env->trap_arg0 = addr;
+ env->trap_arg1 = fail;
+ env->trap_arg2 = (rw == 2 ? -1 : rw);
+ return 1;
+ }
+
+ tlb_set_page(env, addr & TARGET_PAGE_MASK, phys & TARGET_PAGE_MASK,
+ prot, mmu_idx, TARGET_PAGE_SIZE);
return 0;
}
#endif /* USER_ONLY */
--
1.7.3.4
next prev parent reply other threads:[~2011-04-19 15:41 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-19 15:04 [Qemu-devel] [PATCH 00/24] Alpha system emulation, v2 Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 01/24] Export the unassigned_mem read/write functions Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 02/24] target-alpha: Disassemble EV6 PALcode instructions Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 03/24] pci: Export pci_to_cpu_addr Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 04/24] target-alpha: Remove partial support for palcode emulation Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 05/24] target-alpha: Tidy exception constants Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 06/24] target-alpha: Rationalize internal processor registers Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 07/24] target-alpha: Cleanup MMU modes Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 08/24] target-alpha: Fixup translation of PALmode instructions Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 09/24] target-alpha: Add IPRs to be used by the emulation PALcode Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 10/24] target-alpha: Tidy up arithmetic exceptions Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 11/24] target-alpha: Merge HW_REI and HW_RET implementations Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 12/24] target-alpha: Implement do_interrupt for system mode Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 13/24] target-alpha: Swap shadow registers moving to/from PALmode Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 14/24] target-alpha: Add various symbolic constants Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 15/24] target-alpha: All ISA checks to use TB->FLAGS Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 16/24] target-alpha: Disable interrupts properly Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 17/24] target-alpha: Implement more CALL_PAL values inline Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 18/24] target-alpha: Add custom PALcode image for SX164 emulation Richard Henderson
2011-04-19 15:04 ` Richard Henderson [this message]
2011-04-19 15:04 ` [Qemu-devel] [PATCH 20/24] target-alpha: Trap for unassigned and unaligned addresses Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 21/24] target-alpha: Include the PCC_OFS in the RPCC return value Richard Henderson
2011-04-19 15:04 ` [Qemu-devel] [PATCH 22/24] target-alpha: Implement TLB flush primitives Richard Henderson
2011-04-19 15:05 ` [Qemu-devel] [PATCH 23/24] target-alpha: Enable the alpha-softmmu target Richard Henderson
2011-04-19 15:05 ` [Qemu-devel] [PATCH 24/24] target-alpha: Add SX164 emulation Richard Henderson
2011-04-20 9:06 ` [Qemu-devel] [PATCH 00/24] Alpha system emulation, v2 Tristan Gingold
2011-04-20 14:13 ` Brian Wheeler
2011-04-20 14:46 ` Richard Henderson
2011-04-20 15:46 ` Tristan Gingold
2011-04-20 15:54 ` Richard Henderson
2011-04-21 12:31 ` Tristan Gingold
2011-04-21 13:37 ` Brian Wheeler
2011-04-21 13:43 ` Tristan Gingold
2011-04-21 14:48 ` Brian Wheeler
2011-04-21 14:57 ` Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1303225501-12778-20-git-send-email-rth@twiddle.net \
--to=rth@twiddle.net \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).