1 /* 2 * Copyright (c) 1988 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * @(#)ka630.c 7.5 (Berkeley) 07/09/88 7 */ 8 9 #ifdef VAX630 10 #include "param.h" 11 #include "time.h" 12 #include "kernel.h" 13 #include "vmmac.h" 14 15 #include "mtpr.h" 16 #include "cpu.h" 17 #include "clock.h" 18 #include "pte.h" 19 #include "ka630.h" 20 21 /* 22 * 630-specific routines 23 */ 24 extern struct pte Clockmap[]; 25 extern struct pte Ka630map[]; 26 struct ka630clock ka630clock; 27 struct ka630cpu ka630cpu; 28 29 ka630_init() 30 { 31 32 /* 33 * Map in the clock and the CPU. 34 */ 35 ioaccess((caddr_t)0x200b8000, &Clockmap[0], sizeof(struct ka630clock)); 36 ioaccess((caddr_t)0x20080000, &Ka630map[0], sizeof(struct ka630cpu)); 37 38 /* 39 * Clear restart and boot in progress flags in the CPMBX. 40 */ 41 ka630clock.cpmbx = (ka630clock.cpmbx & KA630CLK_LANG) | KA630CLK_REBOOT; 42 43 /* 44 * Enable memory parity error detection. 45 */ 46 ka630cpu.ka630_mser = KA630MSER_PAREN; 47 } 48 49 /* Start the real-time clock */ 50 ka630_clkstartrt() 51 { 52 53 mtpr(ICCS, ICCS_IE); 54 } 55 56 /* init system time from tod clock */ 57 /* ARGSUSED */ 58 ka630_clkread(base) 59 time_t base; 60 { 61 register struct ka630clock *claddr = &ka630clock; 62 struct chiptime c; 63 64 claddr->csr1 = KA630CLK_SET; 65 while ((claddr->csr0 & KA630CLK_UIP) != 0) 66 ; 67 /* If the clock is valid, use it. */ 68 if ((claddr->csr3 & KA630CLK_VRT) != 0 && 69 (claddr->csr1 & KA630CLK_ENABLE) == KA630CLK_ENABLE) { 70 c.sec = claddr->sec; 71 c.min = claddr->min; 72 c.hour = claddr->hr; 73 c.day = claddr->day; 74 c.mon = claddr->mon; 75 c.year = claddr->yr; 76 #ifndef lint 77 { int t = claddr->csr2; } /* ??? */ 78 #endif 79 claddr->csr0 = KA630CLK_RATE; 80 claddr->csr1 = KA630CLK_ENABLE; 81 82 time.tv_sec = chiptotime(&c); 83 return (time.tv_sec ? CLKREAD_OK : CLKREAD_BAD); 84 } 85 printf("WARNING: TOY clock invalid"); 86 return (CLKREAD_BAD); 87 } 88 89 /* Set the time of day clock, called via. stime system call.. */ 90 ka630_clkwrite() 91 { 92 register struct ka630clock *claddr = &ka630clock; 93 struct chiptime c; 94 int s; 95 96 timetochip(&c); 97 s = splhigh(); 98 claddr->csr1 = KA630CLK_SET; 99 while ((claddr->csr0 & KA630CLK_UIP) != 0) 100 ; 101 claddr->sec = c.sec; 102 claddr->min = c.min; 103 claddr->hr = c.hour; 104 claddr->day = c.day; 105 claddr->mon = c.mon; 106 claddr->yr = c.year; 107 #ifndef lint 108 { int t = claddr->csr2; } /* ??? */ 109 { int t = claddr->csr3; } /* ??? */ 110 #endif 111 claddr->csr0 = KA630CLK_RATE; 112 claddr->csr1 = KA630CLK_ENABLE; 113 splx(s); 114 } 115 116 ka630_memnop() 117 { 118 119 /* void */ 120 } 121 122 #define NMC630 10 123 char *mc630[] = { 124 0, "immcr (fsd)", "immcr (ssd)", "fpu err 0", 125 "fpu err 7", "mmu st(tb)", "mmu st(m=0)", "pte in p0", 126 "pte in p1", "un intr id", 127 }; 128 129 struct mc630frame { 130 int mc63_bcnt; /* byte count == 0xc */ 131 int mc63_summary; /* summary parameter */ 132 int mc63_mrvaddr; /* most recent vad */ 133 int mc63_istate; /* internal state */ 134 int mc63_pc; /* trapped pc */ 135 int mc63_psl; /* trapped psl */ 136 }; 137 138 ka630_mchk(cmcf) 139 caddr_t cmcf; 140 { 141 register struct ka630cpu *ka630addr = &ka630cpu; 142 register struct mc630frame *mcf = (struct mc630frame *)cmcf; 143 register u_int type = mcf->mc63_summary; 144 145 printf("machine check %x: %s\n", type, 146 type < NMC630 ? mc630[type] : "???"); 147 printf("\tvap %x istate %x pc %x psl %x\n", 148 mcf->mc63_mrvaddr, mcf->mc63_istate, 149 mcf->mc63_pc, mcf->mc63_psl); 150 if (ka630addr->ka630_mser & KA630MSER_MERR) { 151 printf("\tmser=0x%x ", ka630addr->ka630_mser); 152 if (ka630addr->ka630_mser & KA630MSER_CPUER) 153 printf("page=%d", ka630addr->ka630_cear); 154 if (ka630addr->ka630_mser & KA630MSER_DQPE) 155 printf("page=%d", ka630addr->ka630_dear); 156 printf("\n"); 157 } 158 return (MCHK_PANIC); 159 } 160 #endif 161