From 6758d502af5f73b6f4189fc6574cb7902947e731 Mon Sep 17 00:00:00 2001 From: Takao Indoh Date: Thu, 19 Nov 2009 16:39:22 -0500 Subject: [PATCH] --- yaml --- r: 177215 b: refs/heads/master c: 9ee27c76393394c7fb1ddeca3f1622d4537185a0 h: refs/heads/master i: 177213: ac636971567535460e49e5616ece9f8b4750f64e 177211: 6d6964a1aefa00e7f28d88124cf7367a4d6a44fc 177207: 79a8cb640686ba35f63db73e1d0c2d286f3b964f 177199: 5044ee80b97cfbad8a3b06ce31d98e49eaba2972 177183: ff6269f517287cc05a36a8363540cc772335c995 177151: 4efd7d32d51156085e6d06d94c11f894fd46bcaa v: v3 --- [refs] | 2 +- trunk/arch/ia64/include/asm/mca.h | 5 +++++ trunk/arch/ia64/kernel/mca.c | 11 ++++++++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 9fc4d9ea5528..2f8182d5dec6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 09b366b78c9602f53344c269eac608fd6e24d670 +refs/heads/master: 9ee27c76393394c7fb1ddeca3f1622d4537185a0 diff --git a/trunk/arch/ia64/include/asm/mca.h b/trunk/arch/ia64/include/asm/mca.h index c171cdf0a789..43f96ab18fa0 100644 --- a/trunk/arch/ia64/include/asm/mca.h +++ b/trunk/arch/ia64/include/asm/mca.h @@ -106,6 +106,11 @@ struct ia64_sal_os_state { unsigned long os_status; /* OS status to SAL, enum below */ unsigned long context; /* 0 if return to same context 1 if return to new context */ + + /* I-resources */ + unsigned long iip; + unsigned long ipsr; + unsigned long ifs; }; enum { diff --git a/trunk/arch/ia64/kernel/mca.c b/trunk/arch/ia64/kernel/mca.c index 496ac7a99488..32f2639e9b0a 100644 --- a/trunk/arch/ia64/kernel/mca.c +++ b/trunk/arch/ia64/kernel/mca.c @@ -888,9 +888,10 @@ ia64_mca_modify_comm(const struct task_struct *previous_current) } static void -finish_pt_regs(struct pt_regs *regs, const pal_min_state_area_t *ms, +finish_pt_regs(struct pt_regs *regs, struct ia64_sal_os_state *sos, unsigned long *nat) { + const pal_min_state_area_t *ms = sos->pal_min_state; const u64 *bank; /* If ipsr.ic then use pmsa_{iip,ipsr,ifs}, else use @@ -904,6 +905,10 @@ finish_pt_regs(struct pt_regs *regs, const pal_min_state_area_t *ms, regs->cr_iip = ms->pmsa_xip; regs->cr_ipsr = ms->pmsa_xpsr; regs->cr_ifs = ms->pmsa_xfs; + + sos->iip = ms->pmsa_iip; + sos->ipsr = ms->pmsa_ipsr; + sos->ifs = ms->pmsa_ifs; } regs->pr = ms->pmsa_pr; regs->b0 = ms->pmsa_br0; @@ -1079,7 +1084,7 @@ ia64_mca_modify_original_stack(struct pt_regs *regs, memcpy(old_regs, regs, sizeof(*regs)); old_regs->loadrs = loadrs; old_unat = old_regs->ar_unat; - finish_pt_regs(old_regs, ms, &old_unat); + finish_pt_regs(old_regs, sos, &old_unat); /* Next stack a struct switch_stack. mca_asm.S built a partial * switch_stack, copy it and fill in the blanks using pt_regs and @@ -1150,7 +1155,7 @@ ia64_mca_modify_original_stack(struct pt_regs *regs, mprintk(KERN_INFO "cpu %d, %s %s, original stack not modified\n", smp_processor_id(), type, msg); old_unat = regs->ar_unat; - finish_pt_regs(regs, ms, &old_unat); + finish_pt_regs(regs, sos, &old_unat); return previous_current; }