linux/arch/ia64
Takao Indoh 9ee27c7639 [IA64] Save I-resources to ia64_sal_os_state
This is a patch related to this discussion.
http://www.spinics.net/lists/linux-ia64/msg07605.html

When INIT is sent, ip/psr/pfs register is stored to the I-resources
(iip/ipsr/ifs registers), and they are copied in the min-state save
area(pmsa_{iip,ipsr,ifs}).

Therefore, in creating pt_regs at ia64_mca_modify_original_stack(),
cr_{iip,ipsr,ifs} should be derived from pmsa_{iip,ipsr,ifs}. But
current code copies pmsa_{xip,xpsr,xfs} to cr_{iip,ipsr,ifs}
when PSR.ic is 0.

finish_pt_regs(struct pt_regs *regs, const pal_min_state_area_t *ms,
                unsigned long *nat)
{
(snip)
        if (ia64_psr(regs)->ic) {
                regs->cr_iip = ms->pmsa_iip;
                regs->cr_ipsr = ms->pmsa_ipsr;
                regs->cr_ifs = ms->pmsa_ifs;
        } else {
                regs->cr_iip = ms->pmsa_xip;
                regs->cr_ipsr = ms->pmsa_xpsr;
                regs->cr_ifs = ms->pmsa_xfs;
        }

It's ok when PSR.ic is not 0. But when PSR.ic is 0, this could be
a problem when we investigate kernel as the value of regs->cr_iip does
not point to where INIT really interrupted.

At first I tried to change finish_pt_regs() so that it uses always
pmsa_{iip,ipsr,ifs} for cr_{iip,ipsr,ifs}, but Keith Owens pointed out
it could cause another problem if I change it.

>The only problem I can think of is an MCA/INIT
>arriving while code like SAVE_MIN or SAVE_REST is executing.  Back
>tracing at that point using pmsa_iip is going to be a problem, you have
>no idea what state the registers or stack are in.

I confirmed he was right, so I decided to keep it as-is and to
save pmsa_{iip,ipsr,ifs} to ia64_sal_os_state for debugging.

An attached patch is just adding new members into ia64_sal_os_state to
save pmsa_{iip,ipsr,ifs}.

Signed-off-by: Takao Indoh <indou.takao@jp.fujitsu.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
2009-12-14 16:37:58 -08:00
..
configs sgi-gru: remove SGI_GRU as a valid config option for ia64 configs with SGI_UV 2009-04-02 19:05:07 -07:00
dig x86, ia64: convert to use generic dma_map_ops struct 2009-01-06 14:06:57 +01:00
hp tree-wide: fix assorted typos all over the place 2009-12-04 15:39:55 +01:00
ia32 Cut hugetlb case early for 32bit on ia64 2009-12-11 06:34:10 -05:00
include/asm [IA64] Save I-resources to ia64_sal_os_state 2009-12-14 16:37:58 -08:00
kernel [IA64] Save I-resources to ia64_sal_os_state 2009-12-14 16:37:58 -08:00
kvm KVM: Activate Virtualization On Demand 2009-12-03 09:32:10 +02:00
lib [IA64] fix csum_ipv6_magic() 2009-09-02 09:14:48 -07:00
mm Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu 2009-12-14 09:58:24 -08:00
oprofile [IA64] implement ticket locks for Itanium 2009-09-25 08:42:16 -07:00
pci vsprintf: use %pR, %pr instead of %pRt, %pRf 2009-11-04 13:06:41 -08:00
scripts ia64/pv_ops/pvchecker: support mov = ar.itc paravirtualization 2009-03-26 10:50:09 -07:00
sn Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu 2009-12-14 09:58:24 -08:00
uv [IA64] Simplify SGI uv vs. sn2 driver issues 2008-11-04 11:29:39 -08:00
xen percpu: make percpu symbols in xen unique 2009-10-29 22:34:13 +09:00
install.sh kbuild: use INSTALLKERNEL to select customized installkernel script 2009-09-20 12:18:14 +02:00
Kconfig ia64: convert to dynamic percpu allocator 2009-10-02 13:28:56 +09:00
Kconfig.debug
Makefile arch/ia64/Makefile: Remove -mtune=merced in IA64 kernel build 2009-08-11 14:52:11 -07:00
module.lds