From: Artyom Tarasenko <atar4qemu@googlemail.com>
To: qemu-devel@nongnu.org
Cc: Blue Swirl <blauwirbel@gmail.com>,
Artyom Tarasenko <atar4qemu@gmail.com>
Subject: [Qemu-devel] sparc32 do_unassigned_access overhaul
Date: Fri, 15 Jan 2010 19:46:12 +0100 [thread overview]
Message-ID: <1263581172-16129-1-git-send-email-atar4qemu@google.com> (raw)
According to pages 9-31 - 9-34 of "SuperSPARC & MultiCache Controller
User's Manual":
1. "A lower priority fault may not overwrite the
MFSR status of a higher priority fault."
2. The MFAR is overwritten according to the policy defined for the MFSR
3. The overwrite bit is asserted if the fault status register (MFSR)
has been written more than once by faults of the same class
4. SuperSPARC will never place instruction fault addresses in the MFAR.
Implementation of points 1-3 allows booting Solaris 2.6 and 2.5.1.
Signed-off-by: Artyom Tarasenko <atar4qemu@gmail.com>
---
diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c
index 381e6c4..3a56ce9 100644
--- a/target-sparc/op_helper.c
+++ b/target-sparc/op_helper.c
@@ -3714,6 +3714,7 @@ void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
int is_asi, int size)
{
CPUState *saved_env;
+ int fault_type;
/* XXX: hack to restore env in all cases, even if not called from
generated code */
@@ -3731,18 +3732,27 @@ void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
is_exec ? "exec" : is_write ? "write" : "read", size,
size == 1 ? "" : "s", addr, env->pc);
#endif
- if (env->mmuregs[3]) /* Fault status register */
- env->mmuregs[3] = 1; /* overflow (not read before another fault) */
- if (is_asi)
- env->mmuregs[3] |= 1 << 16;
- if (env->psrs)
- env->mmuregs[3] |= 1 << 5;
- if (is_exec)
- env->mmuregs[3] |= 1 << 6;
- if (is_write)
- env->mmuregs[3] |= 1 << 7;
- env->mmuregs[3] |= (5 << 2) | 2;
- env->mmuregs[4] = addr; /* Fault address register */
+ /* Don't overwrite translation and access faults */
+ fault_type=(env->mmuregs[3]&0x1c)>>2;
+ if ((fault_type > 4) || (fault_type==0)) {
+ env->mmuregs[3]=0; /* Fault status register */
+ if (is_asi)
+ env->mmuregs[3] |= 1 << 16;
+ if (env->psrs)
+ env->mmuregs[3] |= 1 << 5;
+ if (is_exec)
+ env->mmuregs[3] |= 1 << 6;
+ if (is_write)
+ env->mmuregs[3] |= 1 << 7;
+ env->mmuregs[3] |= (5 << 2) | 2;
+ /* SuperSPARC will never place instruction fault addresses in the FAR */
+ if (!is_exec)
+ env->mmuregs[4] = addr; /* Fault address register */
+ }
+ /* overflow (same type fault was not read before another fault) */
+ if (fault_type==((env->mmuregs[3]&0x1c))>>2)
+ env->mmuregs[3] |= 1;
+
if ((env->mmuregs[0] & MMU_E) && !(env->mmuregs[0] & MMU_NF)) {
if (is_exec)
raise_exception(TT_CODE_ACCESS);
@@ -3750,6 +3760,10 @@ void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
raise_exception(TT_DATA_ACCESS);
}
env = saved_env;
+ /* flush neverland mappings created during no-fault mode,
+ so the sequential MMU faults report proper fault types */
+ if (env->mmuregs[0] & MMU_NF)
+ tlb_flush(env, 1);
}
#else
void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
next reply other threads:[~2010-01-15 18:46 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-15 18:46 Artyom Tarasenko [this message]
2010-01-15 19:45 ` [Qemu-devel] Re: sparc32 do_unassigned_access overhaul Blue Swirl
2010-01-15 21:11 ` Artyom Tarasenko
2010-01-15 21:26 ` Blue Swirl
2010-01-15 21:48 ` Artyom Tarasenko
2010-01-19 17:30 ` Artyom Tarasenko
2010-01-19 19:32 ` Blue Swirl
2010-01-19 21:44 ` Artyom Tarasenko
2010-01-20 18:29 ` Blue Swirl
2010-01-22 18:00 ` Blue Swirl
2010-01-22 20:51 ` Artyom Tarasenko
2010-01-23 7:55 ` Blue Swirl
2010-01-23 16:46 ` Artyom Tarasenko
2010-01-23 18:39 ` Blue Swirl
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=1263581172-16129-1-git-send-email-atar4qemu@google.com \
--to=atar4qemu@googlemail.com \
--cc=atar4qemu@gmail.com \
--cc=blauwirbel@gmail.com \
--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).