From 3c7940961fbf9f252e20f9c455f2fe63f273294c Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 2 Nov 2002 21:34:27 -0800 Subject: Save and restore CIA window configuration data. --- arch/alpha/kernel/core_cia.c | 47 ++++++++++++++++++++++++++++++++++ arch/alpha/kernel/core_titan.c | 54 ++++++++++++++++++++------------------- arch/alpha/kernel/core_tsunami.c | 53 +++++++++++++++++++------------------- arch/alpha/kernel/proto.h | 1 + arch/alpha/kernel/sys_alcor.c | 2 ++ arch/alpha/kernel/sys_cabriolet.c | 4 ++- arch/alpha/kernel/sys_miata.c | 2 ++ arch/alpha/kernel/sys_mikasa.c | 2 +- arch/alpha/kernel/sys_noritake.c | 2 +- arch/alpha/kernel/sys_ruffian.c | 1 + arch/alpha/kernel/sys_sx164.c | 2 +- arch/alpha/kernel/sys_takara.c | 2 +- 12 files changed, 115 insertions(+), 57 deletions(-) diff --git a/arch/alpha/kernel/core_cia.c b/arch/alpha/kernel/core_cia.c index b8c7a5e694f3..d57bd86f0b86 100644 --- a/arch/alpha/kernel/core_cia.c +++ b/arch/alpha/kernel/core_cia.c @@ -47,6 +47,15 @@ #define vip volatile int * +/* Save CIA configuration data as the console had it set up. */ + +struct +{ + unsigned int w_base; + unsigned int w_mask; + unsigned int t_base; +} saved_config[4] __attribute((common)); + /* * Given a bus, device, and function number, compute resulting * configuration space address. It is therefore not safe to have @@ -648,6 +657,24 @@ do_init_arch(int is_pyxis) hose->dense_io_base = CIA_BW_IO - IDENT_ADDR; } + /* Save CIA configuration data as the console had it set up. */ + + saved_config[0].w_base = *(vip)CIA_IOC_PCI_W0_BASE; + saved_config[0].w_mask = *(vip)CIA_IOC_PCI_W0_MASK; + saved_config[0].t_base = *(vip)CIA_IOC_PCI_T0_BASE; + + saved_config[1].w_base = *(vip)CIA_IOC_PCI_W1_BASE; + saved_config[1].w_mask = *(vip)CIA_IOC_PCI_W1_MASK; + saved_config[1].t_base = *(vip)CIA_IOC_PCI_T1_BASE; + + saved_config[2].w_base = *(vip)CIA_IOC_PCI_W2_BASE; + saved_config[2].w_mask = *(vip)CIA_IOC_PCI_W2_MASK; + saved_config[2].t_base = *(vip)CIA_IOC_PCI_T2_BASE; + + saved_config[3].w_base = *(vip)CIA_IOC_PCI_W3_BASE; + saved_config[3].w_mask = *(vip)CIA_IOC_PCI_W3_MASK; + saved_config[3].t_base = *(vip)CIA_IOC_PCI_T3_BASE; + /* * Set up the PCI to main memory translation windows. * @@ -736,6 +763,26 @@ pyxis_init_arch(void) do_init_arch(1); } +void +cia_kill_arch(int mode) +{ + *(vip)CIA_IOC_PCI_W0_BASE = saved_config[0].w_base; + *(vip)CIA_IOC_PCI_W0_MASK = saved_config[0].w_mask; + *(vip)CIA_IOC_PCI_T0_BASE = saved_config[0].t_base; + + *(vip)CIA_IOC_PCI_W1_BASE = saved_config[1].w_base; + *(vip)CIA_IOC_PCI_W1_MASK = saved_config[1].w_mask; + *(vip)CIA_IOC_PCI_T1_BASE = saved_config[1].t_base; + + *(vip)CIA_IOC_PCI_W2_BASE = saved_config[2].w_base; + *(vip)CIA_IOC_PCI_W2_MASK = saved_config[2].w_mask; + *(vip)CIA_IOC_PCI_T2_BASE = saved_config[2].t_base; + + *(vip)CIA_IOC_PCI_W3_BASE = saved_config[3].w_base; + *(vip)CIA_IOC_PCI_W3_MASK = saved_config[3].w_mask; + *(vip)CIA_IOC_PCI_T3_BASE = saved_config[3].t_base; +} + void __init cia_init_pci(void) { diff --git a/arch/alpha/kernel/core_titan.c b/arch/alpha/kernel/core_titan.c index eef1c29c7a9b..b90d64c3c90f 100644 --- a/arch/alpha/kernel/core_titan.c +++ b/arch/alpha/kernel/core_titan.c @@ -27,12 +27,14 @@ unsigned TITAN_agp = 0; -static struct +/* Save Titan configuration data as the console had it set up. */ + +struct { unsigned long wsba[4]; unsigned long wsm[4]; unsigned long tba[4]; -} saved_pachip_port[4]; +} saved_config[4] __attribute__((common)); /* * BIOS32-style PCI interface: @@ -289,21 +291,21 @@ titan_init_one_pachip_port(titan_pachip_port *port, int index) * Save the existing PCI window translations. SRM will * need them when we go to reboot. */ - saved_pachip_port[index].wsba[0] = port->wsba[0].csr; - saved_pachip_port[index].wsm[0] = port->wsm[0].csr; - saved_pachip_port[index].tba[0] = port->tba[0].csr; + saved_config[index].wsba[0] = port->wsba[0].csr; + saved_config[index].wsm[0] = port->wsm[0].csr; + saved_config[index].tba[0] = port->tba[0].csr; - saved_pachip_port[index].wsba[1] = port->wsba[1].csr; - saved_pachip_port[index].wsm[1] = port->wsm[1].csr; - saved_pachip_port[index].tba[1] = port->tba[1].csr; + saved_config[index].wsba[1] = port->wsba[1].csr; + saved_config[index].wsm[1] = port->wsm[1].csr; + saved_config[index].tba[1] = port->tba[1].csr; - saved_pachip_port[index].wsba[2] = port->wsba[2].csr; - saved_pachip_port[index].wsm[2] = port->wsm[2].csr; - saved_pachip_port[index].tba[2] = port->tba[2].csr; + saved_config[index].wsba[2] = port->wsba[2].csr; + saved_config[index].wsm[2] = port->wsm[2].csr; + saved_config[index].tba[2] = port->tba[2].csr; - saved_pachip_port[index].wsba[3] = port->wsba[3].csr; - saved_pachip_port[index].wsm[3] = port->wsm[3].csr; - saved_pachip_port[index].tba[3] = port->tba[3].csr; + saved_config[index].wsba[3] = port->wsba[3].csr; + saved_config[index].wsm[3] = port->wsm[3].csr; + saved_config[index].tba[3] = port->tba[3].csr; /* * Set up the PCI to main memory translation windows. @@ -392,21 +394,21 @@ titan_init_arch(void) static void titan_kill_one_pachip_port(titan_pachip_port *port, int index) { - port->wsba[0].csr = saved_pachip_port[index].wsba[0]; - port->wsm[0].csr = saved_pachip_port[index].wsm[0]; - port->tba[0].csr = saved_pachip_port[index].tba[0]; + port->wsba[0].csr = saved_config[index].wsba[0]; + port->wsm[0].csr = saved_config[index].wsm[0]; + port->tba[0].csr = saved_config[index].tba[0]; - port->wsba[1].csr = saved_pachip_port[index].wsba[1]; - port->wsm[1].csr = saved_pachip_port[index].wsm[1]; - port->tba[1].csr = saved_pachip_port[index].tba[1]; + port->wsba[1].csr = saved_config[index].wsba[1]; + port->wsm[1].csr = saved_config[index].wsm[1]; + port->tba[1].csr = saved_config[index].tba[1]; - port->wsba[2].csr = saved_pachip_port[index].wsba[2]; - port->wsm[2].csr = saved_pachip_port[index].wsm[2]; - port->tba[2].csr = saved_pachip_port[index].tba[2]; + port->wsba[2].csr = saved_config[index].wsba[2]; + port->wsm[2].csr = saved_config[index].wsm[2]; + port->tba[2].csr = saved_config[index].tba[2]; - port->wsba[3].csr = saved_pachip_port[index].wsba[3]; - port->wsm[3].csr = saved_pachip_port[index].wsm[3]; - port->tba[3].csr = saved_pachip_port[index].tba[3]; + port->wsba[3].csr = saved_config[index].wsba[3]; + port->wsm[3].csr = saved_config[index].wsm[3]; + port->tba[3].csr = saved_config[index].tba[3]; } static void diff --git a/arch/alpha/kernel/core_tsunami.c b/arch/alpha/kernel/core_tsunami.c index 7628bc241085..23bcd4c426ec 100644 --- a/arch/alpha/kernel/core_tsunami.c +++ b/arch/alpha/kernel/core_tsunami.c @@ -26,13 +26,14 @@ #include "proto.h" #include "pci_impl.h" +/* Save Tsunami configuration data as the console had it set up. */ -static struct +struct { unsigned long wsba[4]; unsigned long wsm[4]; unsigned long tba[4]; -} saved_pchip[2]; +} saved_config[2] __attribute__((common)); /* * NOTE: Herein lie back-to-back mb instructions. They are magic. @@ -293,21 +294,21 @@ tsunami_init_one_pchip(tsunami_pchip *pchip, int index) * need them when we go to reboot. */ - saved_pchip[index].wsba[0] = pchip->wsba[0].csr; - saved_pchip[index].wsm[0] = pchip->wsm[0].csr; - saved_pchip[index].tba[0] = pchip->tba[0].csr; + saved_config[index].wsba[0] = pchip->wsba[0].csr; + saved_config[index].wsm[0] = pchip->wsm[0].csr; + saved_config[index].tba[0] = pchip->tba[0].csr; - saved_pchip[index].wsba[1] = pchip->wsba[1].csr; - saved_pchip[index].wsm[1] = pchip->wsm[1].csr; - saved_pchip[index].tba[1] = pchip->tba[1].csr; + saved_config[index].wsba[1] = pchip->wsba[1].csr; + saved_config[index].wsm[1] = pchip->wsm[1].csr; + saved_config[index].tba[1] = pchip->tba[1].csr; - saved_pchip[index].wsba[2] = pchip->wsba[2].csr; - saved_pchip[index].wsm[2] = pchip->wsm[2].csr; - saved_pchip[index].tba[2] = pchip->tba[2].csr; + saved_config[index].wsba[2] = pchip->wsba[2].csr; + saved_config[index].wsm[2] = pchip->wsm[2].csr; + saved_config[index].tba[2] = pchip->tba[2].csr; - saved_pchip[index].wsba[3] = pchip->wsba[3].csr; - saved_pchip[index].wsm[3] = pchip->wsm[3].csr; - saved_pchip[index].tba[3] = pchip->tba[3].csr; + saved_config[index].wsba[3] = pchip->wsba[3].csr; + saved_config[index].wsm[3] = pchip->wsm[3].csr; + saved_config[index].tba[3] = pchip->tba[3].csr; /* * Set up the PCI to main memory translation windows. @@ -403,21 +404,21 @@ tsunami_init_arch(void) static void tsunami_kill_one_pchip(tsunami_pchip *pchip, int index) { - pchip->wsba[0].csr = saved_pchip[index].wsba[0]; - pchip->wsm[0].csr = saved_pchip[index].wsm[0]; - pchip->tba[0].csr = saved_pchip[index].tba[0]; + pchip->wsba[0].csr = saved_config[index].wsba[0]; + pchip->wsm[0].csr = saved_config[index].wsm[0]; + pchip->tba[0].csr = saved_config[index].tba[0]; - pchip->wsba[1].csr = saved_pchip[index].wsba[1]; - pchip->wsm[1].csr = saved_pchip[index].wsm[1]; - pchip->tba[1].csr = saved_pchip[index].tba[1]; + pchip->wsba[1].csr = saved_config[index].wsba[1]; + pchip->wsm[1].csr = saved_config[index].wsm[1]; + pchip->tba[1].csr = saved_config[index].tba[1]; - pchip->wsba[2].csr = saved_pchip[index].wsba[2]; - pchip->wsm[2].csr = saved_pchip[index].wsm[2]; - pchip->tba[2].csr = saved_pchip[index].tba[2]; + pchip->wsba[2].csr = saved_config[index].wsba[2]; + pchip->wsm[2].csr = saved_config[index].wsm[2]; + pchip->tba[2].csr = saved_config[index].tba[2]; - pchip->wsba[3].csr = saved_pchip[index].wsba[3]; - pchip->wsm[3].csr = saved_pchip[index].wsm[3]; - pchip->tba[3].csr = saved_pchip[index].tba[3]; + pchip->wsba[3].csr = saved_config[index].wsba[3]; + pchip->wsm[3].csr = saved_config[index].wsm[3]; + pchip->tba[3].csr = saved_config[index].tba[3]; } void diff --git a/arch/alpha/kernel/proto.h b/arch/alpha/kernel/proto.h index f27e767155c3..62ba3f89553a 100644 --- a/arch/alpha/kernel/proto.h +++ b/arch/alpha/kernel/proto.h @@ -24,6 +24,7 @@ extern struct pci_ops cia_pci_ops; extern void cia_init_pci(void); extern void cia_init_arch(void); extern void pyxis_init_arch(void); +extern void cia_kill_arch(int); extern void cia_machine_check(u64, u64, struct pt_regs *); extern void cia_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t); diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index fa32465ab44f..92403133b53a 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c @@ -221,6 +221,8 @@ alcor_map_irq(struct pci_dev *dev, u8 slot, u8 pin) static void alcor_kill_arch(int mode) { + cia_kill_arch(mode); + switch(mode) { case LINUX_REBOOT_CMD_RESTART: /* Who said DEC engineer's have no sense of humor? ;-) */ diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c index 618cd340a31c..1b606c3661a4 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c @@ -338,7 +338,6 @@ struct alpha_machine_vector cabriolet_mv __initmv = { init_irq: cabriolet_init_irq, init_rtc: common_init_rtc, init_pci: cabriolet_init_pci, - kill_arch: NULL, pci_map_irq: cabriolet_map_irq, pci_swizzle: common_swizzle, }; @@ -366,6 +365,7 @@ struct alpha_machine_vector eb164_mv __initmv = { init_irq: cabriolet_init_irq, init_rtc: common_init_rtc, init_pci: cia_cab_init_pci, + kill_arch: cia_kill_arch, pci_map_irq: cabriolet_map_irq, pci_swizzle: common_swizzle, }; @@ -417,6 +417,7 @@ struct alpha_machine_vector lx164_mv __initmv = { init_irq: cabriolet_init_irq, init_rtc: common_init_rtc, init_pci: alphapc164_init_pci, + kill_arch: cia_kill_arch, pci_map_irq: alphapc164_map_irq, pci_swizzle: common_swizzle, }; @@ -442,6 +443,7 @@ struct alpha_machine_vector pc164_mv __initmv = { init_irq: pc164_init_irq, init_rtc: common_init_rtc, init_pci: alphapc164_init_pci, + kill_arch: cia_kill_arch, pci_map_irq: alphapc164_map_irq, pci_swizzle: common_swizzle, }; diff --git a/arch/alpha/kernel/sys_miata.c b/arch/alpha/kernel/sys_miata.c index fefda1f8dd6a..53a706fbf85e 100644 --- a/arch/alpha/kernel/sys_miata.c +++ b/arch/alpha/kernel/sys_miata.c @@ -238,6 +238,8 @@ miata_init_pci(void) static void miata_kill_arch(int mode) { + cia_kill_arch(mode); + switch(mode) { case LINUX_REBOOT_CMD_RESTART: /* Who said DEC engineers have no sense of humor? ;-) */ diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c index fb7bf56c367d..00e7d05a42e9 100644 --- a/arch/alpha/kernel/sys_mikasa.c +++ b/arch/alpha/kernel/sys_mikasa.c @@ -234,7 +234,6 @@ struct alpha_machine_vector mikasa_mv __initmv = { init_irq: mikasa_init_irq, init_rtc: common_init_rtc, init_pci: common_init_pci, - kill_arch: NULL, pci_map_irq: mikasa_map_irq, pci_swizzle: common_swizzle, }; @@ -260,6 +259,7 @@ struct alpha_machine_vector mikasa_primo_mv __initmv = { init_irq: mikasa_init_irq, init_rtc: common_init_rtc, init_pci: cia_init_pci, + kill_arch: cia_kill_arch, pci_map_irq: mikasa_map_irq, pci_swizzle: common_swizzle, }; diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index 16ea1329f3e1..d3e556c1c463 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c @@ -316,7 +316,6 @@ struct alpha_machine_vector noritake_mv __initmv = { init_irq: noritake_init_irq, init_rtc: common_init_rtc, init_pci: common_init_pci, - kill_arch: NULL, pci_map_irq: noritake_map_irq, pci_swizzle: noritake_swizzle, }; @@ -342,6 +341,7 @@ struct alpha_machine_vector noritake_primo_mv __initmv = { init_irq: noritake_init_irq, init_rtc: common_init_rtc, init_pci: cia_init_pci, + kill_arch: cia_kill_arch, pci_map_irq: noritake_map_irq, pci_swizzle: noritake_swizzle, }; diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c index a1966a07b8b3..490c41f1eb5b 100644 --- a/arch/alpha/kernel/sys_ruffian.c +++ b/arch/alpha/kernel/sys_ruffian.c @@ -85,6 +85,7 @@ ruffian_init_rtc(void) static void ruffian_kill_arch (int mode) { + cia_kill_arch(mode); #if 0 /* This only causes re-entry to ARCSBIOS */ /* Perhaps this works for other PYXIS as well? */ diff --git a/arch/alpha/kernel/sys_sx164.c b/arch/alpha/kernel/sys_sx164.c index efcf059d3d8c..a46a19a143df 100644 --- a/arch/alpha/kernel/sys_sx164.c +++ b/arch/alpha/kernel/sys_sx164.c @@ -172,7 +172,7 @@ struct alpha_machine_vector sx164_mv __initmv = { init_irq: sx164_init_irq, init_rtc: common_init_rtc, init_pci: sx164_init_pci, - kill_arch: NULL, + kill_arch: cia_kill_arch, pci_map_irq: sx164_map_irq, pci_swizzle: common_swizzle, }; diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c index 6af89e81b028..f8cfefc02c06 100644 --- a/arch/alpha/kernel/sys_takara.c +++ b/arch/alpha/kernel/sys_takara.c @@ -286,7 +286,7 @@ struct alpha_machine_vector takara_mv __initmv = { init_irq: takara_init_irq, init_rtc: common_init_rtc, init_pci: takara_init_pci, - kill_arch: NULL, + kill_arch: cia_kill_arch, pci_map_irq: takara_map_irq, pci_swizzle: takara_swizzle, }; -- cgit v1.2.3 From a70c0c042166ecc6648031da05fccc3ecd2e8fc1 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 2 Nov 2002 21:35:39 -0800 Subject: New file to debug clobbers of "current". --- arch/alpha/lib/dbg_current.S | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 arch/alpha/lib/dbg_current.S diff --git a/arch/alpha/lib/dbg_current.S b/arch/alpha/lib/dbg_current.S new file mode 100644 index 000000000000..e6d071015f9b --- /dev/null +++ b/arch/alpha/lib/dbg_current.S @@ -0,0 +1,29 @@ +/* + * arch/alpha/lib/dbg_current.S + * Contributed by Richard Henderson (rth@cygnus.com) + * + * Trap if we find current not correct. + */ + +#include + + .text + .set noat + + .globl _mcount + .ent _mcount +_mcount: + .frame $30, 0, $28, 0 + .prologue 0 + + lda $0, -0x4000($30) + cmpult $8, $30, $1 + cmpule $0, $30, $2 + and $1, $2, $3 + bne $3, 1f + + call_pal PAL_bugchk + +1: ret $31, ($28), 1 + + .end _mcount -- cgit v1.2.3