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