dec_6600.c revision 1.38
11.38Sthorpej/* $NetBSD: dec_6600.c,v 1.38 2024/03/31 19:11:21 thorpej Exp $ */ 21.1Sross 31.1Sross/* 41.1Sross * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University. 51.1Sross * All rights reserved. 61.1Sross * 71.1Sross * Author: Chris G. Demetriou 81.33Smatt * 91.1Sross * Permission to use, copy, modify and distribute this software and 101.1Sross * its documentation is hereby granted, provided that both the copyright 111.1Sross * notice and this permission notice appear in all copies of the 121.1Sross * software, derivative works or modified versions, and any portions 131.1Sross * thereof, and that both notices appear in supporting documentation. 141.33Smatt * 151.33Smatt * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 161.33Smatt * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 171.1Sross * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 181.33Smatt * 191.1Sross * Carnegie Mellon requests users of this software to return to 201.1Sross * 211.1Sross * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 221.1Sross * School of Computer Science 231.1Sross * Carnegie Mellon University 241.1Sross * Pittsburgh PA 15213-3890 251.1Sross * 261.1Sross * any improvements or extensions that they make and grant Carnegie the 271.1Sross * rights to redistribute these changes. 281.1Sross */ 291.1Sross 301.11Slukem#include "opt_kgdb.h" 311.11Slukem 321.1Sross#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ 331.1Sross 341.38Sthorpej__KERNEL_RCSID(0, "$NetBSD: dec_6600.c,v 1.38 2024/03/31 19:11:21 thorpej Exp $"); 351.1Sross 361.1Sross#include <sys/param.h> 371.1Sross#include <sys/systm.h> 381.1Sross#include <sys/device.h> 391.35Sthorpej#include <sys/lwp.h> 401.1Sross#include <sys/termios.h> 411.35Sthorpej 421.14Sgehenna#include <sys/conf.h> 431.1Sross#include <dev/cons.h> 441.1Sross 451.1Sross#include <machine/rpb.h> 461.1Sross#include <machine/autoconf.h> 471.14Sgehenna#include <machine/cpuconf.h> 481.32Sdyoung#include <sys/bus.h> 491.30Shans#include <machine/alpha.h> 501.30Shans#include <machine/logout.h> 511.1Sross 521.1Sross#include <dev/ic/comreg.h> 531.1Sross#include <dev/ic/comvar.h> 541.1Sross 551.2Sthorpej#include <dev/isa/isareg.h> 561.1Sross#include <dev/isa/isavar.h> 571.6Ssoda#include <dev/ic/i8042reg.h> 581.2Sthorpej#include <dev/ic/pckbcvar.h> 591.1Sross#include <dev/pci/pcireg.h> 601.1Sross#include <dev/pci/pcivar.h> 611.1Sross 621.1Sross#include <alpha/pci/tsreg.h> 631.1Sross#include <alpha/pci/tsvar.h> 641.1Sross 651.1Sross#include <dev/scsipi/scsi_all.h> 661.1Sross#include <dev/scsipi/scsipi_all.h> 671.1Sross#include <dev/scsipi/scsiconf.h> 681.3Sveego#include <dev/ata/atavar.h> 691.1Sross 701.29Smhitch#include <dev/ic/mlxio.h> 711.29Smhitch#include <dev/ic/mlxvar.h> 721.29Smhitch 731.29Smhitch#include <dev/i2o/i2o.h> 741.29Smhitch#include <dev/i2o/iopio.h> 751.29Smhitch#include <dev/i2o/iopvar.h> 761.29Smhitch 771.1Sross#include "pckbd.h" 781.1Sross 791.1Sross#ifndef CONSPEED 801.1Sross#define CONSPEED TTYDEF_SPEED 811.1Sross#endif 821.1Sross 831.1Sross#define DR_VERBOSE(f) while (0) 841.1Sross 851.1Srossstatic int comcnrate __attribute__((unused)) = CONSPEED; 861.1Sross 871.27Sdslvoid dec_6600_init(void); 881.27Sdslstatic void dec_6600_cons_init(void); 891.31Smattstatic void dec_6600_device_register(device_t, void *); 901.30Shansstatic void dec_6600_mcheck(unsigned long, struct ev6_logout_area *); 911.30Shansstatic void dec_6600_mcheck_sys(unsigned int, struct ev6_logout_area *); 921.30Shansstatic void dec_6600_mcheck_handler(unsigned long, struct trapframe *, 931.30Shans unsigned long, unsigned long); 941.1Sross 951.9Sthorpej#ifdef KGDB 961.9Sthorpej#include <machine/db_machdep.h> 971.9Sthorpej 981.9Sthorpejstatic const char *kgdb_devlist[] = { 991.9Sthorpej "com", 1001.9Sthorpej NULL, 1011.9Sthorpej}; 1021.9Sthorpej#endif /* KGDB */ 1031.9Sthorpej 1041.38Sthorpejstatic const struct alpha_variation_table dec_6600_variations[] = { 1051.38Sthorpej { SV_ST_DP264, "AlphaPC DP264" }, 1061.38Sthorpej { SV_ST_CLIPPER, "AlphaServer ES40 (\"Clipper\")" }, 1071.38Sthorpej { SV_ST_GOLDRUSH, "AlphaServer DS20 (\"GoldRush\")" }, 1081.38Sthorpej { SV_ST_WEBBRICK, "AlphaServer DS10 (\"WebBrick\")" }, 1091.38Sthorpej { SV_ST_SHARK, "AlphaServer DS20L (\"Shark\")" }, 1101.38Sthorpej { 0, NULL }, 1111.38Sthorpej}; 1121.38Sthorpej 1131.38Sthorpejstatic const struct alpha_variation_table dec_titan_variations[] = { 1141.38Sthorpej { 0, NULL }, 1151.38Sthorpej}; 1161.38Sthorpej 1171.1Srossvoid 1181.33Smattdec_6600_init(void) 1191.1Sross{ 1201.38Sthorpej uint64_t variation; 1211.1Sross 1221.38Sthorpej platform.family = (hwrpb->rpb_type == ST_DEC_TITAN) ? "Titan" 1231.38Sthorpej : "6600"; 1241.1Sross 1251.1Sross if ((platform.model = alpha_dsr_sysname()) == NULL) { 1261.38Sthorpej const struct alpha_variation_table *vartab = 1271.38Sthorpej (hwrpb->rpb_type == ST_DEC_TITAN) ? dec_titan_variations 1281.38Sthorpej : dec_6600_variations; 1291.38Sthorpej variation = hwrpb->rpb_variation & SV_ST_MASK; 1301.38Sthorpej if ((platform.model = alpha_variation_name(variation, 1311.38Sthorpej vartab)) == NULL) { 1321.38Sthorpej platform.model = alpha_unknown_sysname(); 1331.38Sthorpej } 1341.1Sross } 1351.1Sross 1361.1Sross platform.iobus = "tsc"; 1371.1Sross platform.cons_init = dec_6600_cons_init; 1381.1Sross platform.device_register = dec_6600_device_register; 1391.30Shans platform.mcheck_handler = dec_6600_mcheck_handler; 1401.30Shans 1411.30Shans /* enable Cchip and Pchip error interrupts */ 1421.30Shans STQP(TS_C_DIM0) = 0xe000000000000000; 1431.30Shans STQP(TS_C_DIM1) = 0xe000000000000000; 1441.1Sross} 1451.1Sross 1461.1Srossstatic void 1471.33Smattdec_6600_cons_init(void) 1481.1Sross{ 1491.1Sross struct ctb *ctb; 1501.33Smatt uint64_t ctbslot; 1511.1Sross struct tsp_config *tsp; 1521.1Sross 1531.26Syamt ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off); 1541.1Sross ctbslot = ctb->ctb_turboslot; 1551.1Sross 1561.8Sthorpej /* Console hose defaults to hose 0. */ 1571.8Sthorpej tsp_console_hose = 0; 1581.8Sthorpej 1591.36Sthorpej tsp = tsp_init(tsp_console_hose); 1601.1Sross 1611.1Sross switch (ctb->ctb_term_type) { 1621.33Smatt case CTB_PRINTERPORT: 1631.1Sross /* serial console ... */ 1641.1Sross assert(CTB_TURBOSLOT_HOSE(ctbslot) == 0); 1651.1Sross /* XXX */ 1661.1Sross { 1671.1Sross /* 1681.1Sross * Delay to allow PROM putchars to complete. 1691.1Sross * FIFO depth * character time, 1701.1Sross * character time = (1000000 / (defaultrate / 10)) 1711.1Sross */ 1721.1Sross DELAY(160000000 / comcnrate); 1731.1Sross 1741.1Sross if(comcnattach(&tsp->pc_iot, 0x3f8, comcnrate, 1751.18Sthorpej COM_FREQ, COM_TYPE_NORMAL, 1761.1Sross (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8)) 1771.1Sross panic("can't init serial console"); 1781.1Sross 1791.1Sross break; 1801.1Sross } 1811.1Sross 1821.12Sthorpej case CTB_GRAPHICS: 1831.1Sross#if NPCKBD > 0 1841.1Sross /* display console ... */ 1851.1Sross /* XXX */ 1861.6Ssoda (void) pckbc_cnattach(&tsp->pc_iot, IO_KBD, KBCMDP, 1871.34Sjdc PCKBC_KBD_SLOT, 0); 1881.1Sross 1891.1Sross if (CTB_TURBOSLOT_TYPE(ctbslot) == 1901.1Sross CTB_TURBOSLOT_TYPE_ISA) 1911.1Sross isa_display_console(&tsp->pc_iot, &tsp->pc_memt); 1921.1Sross else { 1931.1Sross /* The display PCI might be different */ 1941.8Sthorpej tsp_console_hose = CTB_TURBOSLOT_HOSE(ctbslot); 1951.36Sthorpej tsp = tsp_init(tsp_console_hose); 1961.1Sross pci_display_console(&tsp->pc_iot, &tsp->pc_memt, 1971.1Sross &tsp->pc_pc, CTB_TURBOSLOT_BUS(ctbslot), 1981.1Sross CTB_TURBOSLOT_SLOT(ctbslot), 0); 1991.1Sross } 2001.1Sross#else 2011.1Sross panic("not configured to use display && keyboard console"); 2021.1Sross#endif 2031.1Sross break; 2041.1Sross 2051.1Sross default: 2061.1Sross printf("ctb_term_type = 0x%lx ctb_turboslot = 0x%lx" 2071.1Sross " hose = %ld\n", ctb->ctb_term_type, ctbslot, 2081.1Sross CTB_TURBOSLOT_HOSE(ctbslot)); 2091.1Sross 2101.17Sprovos panic("consinit: unknown console type %ld", 2111.1Sross ctb->ctb_term_type); 2121.1Sross } 2131.9Sthorpej#ifdef KGDB 2141.9Sthorpej /* Attach the KGDB device. */ 2151.9Sthorpej alpha_kgdb_init(kgdb_devlist, &tsp->pc_iot); 2161.9Sthorpej#endif /* KGDB */ 2171.1Sross} 2181.1Sross 2191.1Srossstatic void 2201.31Smattdec_6600_device_register(device_t dev, void *aux) 2211.1Sross{ 2221.21Smycroft static int found, initted, diskboot, netboot; 2231.31Smatt static device_t primarydev, pcidev, ctrlrdev; 2241.1Sross struct bootdev_data *b = bootdev_data; 2251.31Smatt device_t parent = device_parent(dev); 2261.1Sross 2271.38Sthorpej /* 2281.38Sthorpej * First section: Deal with system-specific quirks. 2291.38Sthorpej */ 2301.38Sthorpej 2311.38Sthorpej if ((hwrpb->rpb_variation & SV_ST_MASK) == SV_ST_WEBBRICK) { 2321.38Sthorpej /* 2331.38Sthorpej * DMA on the on-board ALI IDE controller is not 2341.38Sthorpej * working correctly; disable it for now to let 2351.38Sthorpej * the systems at least hobble along. 2361.38Sthorpej * 2371.38Sthorpej * N.B. There's only one Pchip on a DS10, do there 2381.38Sthorpej * is not need to determine which hose we have here. 2391.38Sthorpej * 2401.38Sthorpej * XXX This is meant to be temporary until we can find 2411.38Sthorpej * XXX and fix the issue with bus-master DMA. 2421.38Sthorpej */ 2431.38Sthorpej if (device_is_a(parent, "pci") && device_is_a(dev, "aceride")) { 2441.38Sthorpej struct pci_attach_args *pa = aux; 2451.38Sthorpej 2461.38Sthorpej if (pa->pa_bus == 0 && pa->pa_device == 13 && 2471.38Sthorpej pa->pa_function == 0) { 2481.38Sthorpej prop_dictionary_set_bool(device_properties(dev), 2491.38Sthorpej "pciide-disable-dma", true); 2501.38Sthorpej } 2511.38Sthorpej } 2521.38Sthorpej } 2531.38Sthorpej 2541.38Sthorpej /* 2551.38Sthorpej * Second section: Boot device detection. 2561.38Sthorpej */ 2571.38Sthorpej 2581.37Sthorpej if (b == NULL || found) 2591.1Sross return; 2601.1Sross 2611.1Sross if (!initted) { 2621.21Smycroft diskboot = (strcasecmp(b->protocol, "SCSI") == 0) || 2631.29Smhitch (strcasecmp(b->protocol, "RAID") == 0) || 2641.29Smhitch (strcasecmp(b->protocol, "I2O") == 0) || 2651.21Smycroft (strcasecmp(b->protocol, "IDE") == 0); 2661.21Smycroft netboot = (strcasecmp(b->protocol, "BOOTP") == 0) || 2671.21Smycroft (strcasecmp(b->protocol, "MOP") == 0); 2681.21Smycroft DR_VERBOSE(printf("diskboot = %d, netboot = %d\n", diskboot, 2691.21Smycroft netboot)); 2701.1Sross initted = 1; 2711.1Sross } 2721.21Smycroft 2731.1Sross if (primarydev == NULL) { 2741.24Sthorpej if (!device_is_a(dev, "tsp")) 2751.1Sross return; 2761.1Sross else { 2771.1Sross struct tsp_attach_args *tsp = aux; 2781.1Sross 2791.1Sross if (b->bus != tsp->tsp_slot) 2801.1Sross return; 2811.1Sross primarydev = dev; 2821.1Sross DR_VERBOSE(printf("\nprimarydev = %s\n", 2831.31Smatt device_xname(dev))); 2841.1Sross return; 2851.1Sross } 2861.1Sross } 2871.21Smycroft 2881.1Sross if (pcidev == NULL) { 2891.24Sthorpej if (!device_is_a(dev, "pci")) 2901.1Sross return; 2911.21Smycroft /* 2921.21Smycroft * Try to find primarydev anywhere in the ancestry. This is 2931.21Smycroft * necessary if the PCI bus is hidden behind a bridge. 2941.21Smycroft */ 2951.21Smycroft while (parent) { 2961.21Smycroft if (parent == primarydev) 2971.21Smycroft break; 2981.23Sthorpej parent = device_parent(parent); 2991.21Smycroft } 3001.21Smycroft if (!parent) 3011.1Sross return; 3021.1Sross else { 3031.1Sross struct pcibus_attach_args *pba = aux; 3041.1Sross 3051.1Sross if ((b->slot / 1000) != pba->pba_bus) 3061.1Sross return; 3071.1Sross 3081.1Sross pcidev = dev; 3091.31Smatt DR_VERBOSE(printf("\npcidev = %s\n", device_xname(dev))); 3101.1Sross return; 3111.1Sross } 3121.1Sross } 3131.21Smycroft 3141.21Smycroft if (ctrlrdev == NULL) { 3151.1Sross if (parent != pcidev) 3161.1Sross return; 3171.1Sross else { 3181.1Sross struct pci_attach_args *pa = aux; 3191.21Smycroft int slot; 3201.1Sross 3211.21Smycroft slot = pa->pa_bus * 1000 + pa->pa_function * 100 + 3221.21Smycroft pa->pa_device; 3231.21Smycroft if (b->slot != slot) 3241.1Sross return; 3251.1Sross 3261.21Smycroft if (netboot) { 3271.21Smycroft booted_device = dev; 3281.21Smycroft DR_VERBOSE(printf("\nbooted_device = %s\n", 3291.31Smatt device_xname(dev))); 3301.21Smycroft found = 1; 3311.21Smycroft } else { 3321.21Smycroft ctrlrdev = dev; 3331.21Smycroft DR_VERBOSE(printf("\nctrlrdev = %s\n", 3341.31Smatt device_xname(dev))); 3351.21Smycroft } 3361.1Sross return; 3371.1Sross } 3381.1Sross } 3391.21Smycroft 3401.21Smycroft if (!diskboot) 3411.21Smycroft return; 3421.21Smycroft 3431.24Sthorpej if (device_is_a(dev, "sd") || 3441.24Sthorpej device_is_a(dev, "st") || 3451.24Sthorpej device_is_a(dev, "cd")) { 3461.1Sross struct scsipibus_attach_args *sa = aux; 3471.21Smycroft struct scsipi_periph *periph = sa->sa_periph; 3481.21Smycroft int unit; 3491.1Sross 3501.23Sthorpej if (device_parent(parent) != ctrlrdev) 3511.1Sross return; 3521.1Sross 3531.21Smycroft unit = periph->periph_target * 100 + periph->periph_lun; 3541.21Smycroft if (b->unit != unit) 3551.1Sross return; 3561.21Smycroft if (b->channel != periph->periph_channel->chan_channel) 3571.1Sross return; 3581.1Sross 3591.1Sross /* we've found it! */ 3601.1Sross booted_device = dev; 3611.31Smatt DR_VERBOSE(printf("\nbooted_device = %s\n", device_xname(dev))); 3621.1Sross found = 1; 3631.1Sross } 3641.1Sross 3651.29Smhitch if (device_is_a(dev, "ld") && device_is_a(parent, "iop")) { 3661.29Smhitch /* 3671.29Smhitch * Argh! The attach arguments for ld devices is not 3681.29Smhitch * consistent, so each supported raid controller requires 3691.29Smhitch * different checks. 3701.29Smhitch */ 3711.29Smhitch struct iop_attach_args *iopa = aux; 3721.29Smhitch 3731.29Smhitch if (parent != ctrlrdev) 3741.29Smhitch return; 3751.29Smhitch 3761.29Smhitch if (b->unit != iopa->ia_tid) 3771.29Smhitch return; 3781.29Smhitch /* we've found it! */ 3791.29Smhitch booted_device = dev; 3801.31Smatt DR_VERBOSE(printf("\nbooted_device = %s\n", device_xname(dev))); 3811.29Smhitch found = 1; 3821.29Smhitch } 3831.29Smhitch 3841.29Smhitch if (device_is_a(dev, "ld") && device_is_a(parent, "mlx")) { 3851.29Smhitch /* 3861.29Smhitch * Argh! The attach arguments for ld devices is not 3871.29Smhitch * consistent, so each supported raid controller requires 3881.29Smhitch * different checks. 3891.29Smhitch */ 3901.29Smhitch struct mlx_attach_args *mlxa = aux; 3911.29Smhitch 3921.29Smhitch if (parent != ctrlrdev) 3931.29Smhitch return; 3941.29Smhitch 3951.29Smhitch if (b->unit != mlxa->mlxa_unit) 3961.29Smhitch return; 3971.29Smhitch /* we've found it! */ 3981.29Smhitch booted_device = dev; 3991.31Smatt DR_VERBOSE(printf("\nbooted_device = %s\n", device_xname(dev))); 4001.29Smhitch found = 1; 4011.29Smhitch } 4021.29Smhitch 4031.1Sross /* 4041.1Sross * Support to boot from IDE drives. 4051.1Sross */ 4061.24Sthorpej if (device_is_a(dev, "wd")) { 4071.13Sbouyer struct ata_device *adev = aux; 4081.21Smycroft 4091.24Sthorpej if (!device_is_a(parent, "atabus")) 4101.1Sross return; 4111.23Sthorpej if (device_parent(parent) != ctrlrdev) 4121.21Smycroft return; 4131.21Smycroft 4141.3Sveego DR_VERBOSE(printf("\nAtapi info: drive: %d, channel %d\n", 4151.13Sbouyer adev->adev_drv_data->drive, adev->adev_channel)); 4161.3Sveego DR_VERBOSE(printf("Bootdev info: unit: %d, channel: %d\n", 4171.3Sveego b->unit, b->channel)); 4181.13Sbouyer if (b->unit != adev->adev_drv_data->drive || 4191.13Sbouyer b->channel != adev->adev_channel) 4201.3Sveego return; 4211.1Sross 4221.1Sross /* we've found it! */ 4231.1Sross booted_device = dev; 4241.31Smatt DR_VERBOSE(printf("booted_device = %s\n", device_xname(dev))); 4251.1Sross found = 1; 4261.1Sross } 4271.1Sross} 4281.30Shans 4291.30Shans 4301.30Shansstatic void 4311.30Shansdec_6600_mcheck(unsigned long vector, struct ev6_logout_area *la) 4321.30Shans{ 4331.30Shans const char *t = "Unknown", *c = ""; 4341.30Shans 4351.30Shans if (vector == ALPHA_SYS_ERROR || vector == ALPHA_PROC_ERROR) 4361.30Shans c = " Correctable"; 4371.30Shans 4381.30Shans switch (vector) { 4391.30Shans case ALPHA_SYS_ERROR: 4401.30Shans case ALPHA_SYS_MCHECK: 4411.30Shans t = "System"; 4421.30Shans break; 4431.30Shans 4441.30Shans case ALPHA_PROC_ERROR: 4451.30Shans case ALPHA_PROC_MCHECK: 4461.30Shans t = "Processor"; 4471.30Shans break; 4481.30Shans 4491.30Shans case ALPHA_ENV_MCHECK: 4501.30Shans t = "Environmental"; 4511.30Shans break; 4521.30Shans } 4531.30Shans 4541.30Shans printf("\n%s%s Machine Check (%lx): " 4551.30Shans "Rev 0x%x, Code 0x%x, Flags 0x%x\n\n", 4561.30Shans t, c, vector, la->mchk_rev, la->mchk_code, la->la.la_flags); 4571.30Shans} 4581.30Shans 4591.30Shansstatic void 4601.30Shansdec_6600_mcheck_sys(unsigned int indent, struct ev6_logout_area *la) 4611.30Shans{ 4621.33Smatt struct ev6_logout_sys *ls = 4631.30Shans (struct ev6_logout_sys *)ALPHA_LOGOUT_SYSTEM_AREA(&la->la); 4641.30Shans 4651.30Shans#define FMT "%-30s = 0x%016lx\n" 4661.30Shans 4671.30Shans IPRINTF(indent, FMT, "Software Error Summary Flags", ls->flags); 4681.30Shans 4691.30Shans IPRINTF(indent, FMT, "CPU Device Interrupt Requests", ls->dir); 4701.30Shans tsc_print_dir(indent + 1, ls->dir); 4711.30Shans 4721.30Shans IPRINTF(indent, FMT, "Cchip Miscellaneous Register", ls->misc); 4731.30Shans tsc_print_misc(indent + 1, ls->misc); 4741.30Shans 4751.30Shans IPRINTF(indent, FMT, "Pchip 0 Error Register", ls->p0_error); 4761.30Shans if (ls->flags & 0x5) 4771.30Shans tsp_print_error(indent + 1, ls->p0_error); 4781.30Shans 4791.30Shans IPRINTF(indent, FMT, "Pchip 1 Error Register", ls->p1_error); 4801.30Shans if (ls->flags & 0x6) 4811.30Shans tsp_print_error(indent + 1, ls->p1_error); 4821.30Shans} 4831.30Shans 4841.30Shansstatic void 4851.30Shansdec_6600_mcheck_handler(unsigned long mces, struct trapframe *framep, 4861.30Shans unsigned long vector, unsigned long param) 4871.30Shans{ 4881.30Shans struct mchkinfo *mcp; 4891.30Shans struct ev6_logout_area *la = (struct ev6_logout_area *)param; 4901.30Shans 4911.30Shans /* 4921.30Shans * If we expected a machine check, just go handle it in common code. 4931.30Shans */ 4941.30Shans mcp = &curcpu()->ci_mcinfo; 4951.33Smatt if (mcp->mc_expected) 4961.30Shans machine_check(mces, framep, vector, param); 4971.30Shans 4981.30Shans dec_6600_mcheck(vector, la); 4991.30Shans 5001.30Shans switch (vector) { 5011.30Shans case ALPHA_SYS_ERROR: 5021.30Shans case ALPHA_SYS_MCHECK: 5031.30Shans dec_6600_mcheck_sys(1, la); 5041.30Shans break; 5051.30Shans 5061.30Shans } 5071.30Shans 5081.30Shans machine_check(mces, framep, vector, param); 5091.30Shans} 510