aboutsummaryrefslogtreecommitdiffstats
path: root/target-sparc/exec.h
diff options
context:
space:
mode:
authorIgor Kovalenko <igor.v.kovalenko@gmail.com>2009-07-12 12:35:31 +0400
committerBlue Swirl <blauwirbel@gmail.com>2009-07-12 08:46:54 +0000
commit5210977a8511fc0c4a8a1a68c01fa3b65e29edc0 (patch)
treedd12f3bcc62297f325c30718c6d42764dff0afd6 /target-sparc/exec.h
parent49e6637386acb8824114ed10308ed7869472ec0f (diff)
sparc64: trap handling corrections
On Sun, Jul 12, 2009 at 12:09 PM, Blue Swirl<blauwirbel@gmail.com> wrote: > On 7/12/09, Igor Kovalenko <igor.v.kovalenko@gmail.com> wrote: >> Good trap handling is required to process interrupts. >>  This patch fixes the following: >> >>  - sparc64 has no wim register >>  - sparc64 has no psret register, use IE bit of pstate >>   extract IE checking code to cpu_interrupts_enabled >>  - alternate globals are not available if cpu has GL feature >>   in this case bit AG of pstate is constant zero >>  - write to pstate must actually write pstate >>   even if cpu has GL feature >> >>  Also timer interrupt is handled using do_interrupt. > > A bit too much for one patch. Please also remove the code instead of > commenting out. I now excluded timer interrupt related part. To my mind other changes are essentially tied together. > PUT_PSR for Sparc64 needs CC_OP = CC_OP_FLAGS; like Sparc32. Fixed, please find attached the updated version. -- Kind regards, Igor V. Kovalenko
Diffstat (limited to 'target-sparc/exec.h')
-rw-r--r--target-sparc/exec.h15
1 files changed, 14 insertions, 1 deletions
diff --git a/target-sparc/exec.h b/target-sparc/exec.h
index f37c8ad99..e120d6fed 100644
--- a/target-sparc/exec.h
+++ b/target-sparc/exec.h
@@ -24,10 +24,23 @@ static inline void regs_to_env(void)
/* op_helper.c */
void do_interrupt(CPUState *env);
+static inline int cpu_interrupts_enabled(CPUState *env1)
+{
+#if !defined (TARGET_SPARC64)
+ if (env1->psret != 0)
+ return 1;
+#else
+ if (env1->pstate & PS_IE)
+ return 1;
+#endif
+
+ return 0;
+}
+
static inline int cpu_has_work(CPUState *env1)
{
return (env1->interrupt_request & CPU_INTERRUPT_HARD) &&
- (env1->psret != 0);
+ cpu_interrupts_enabled(env1);
}