📄 msaturn.c
字号:
#include "u.h"#include "../port/lib.h"#include "mem.h"#include "dat.h"#include "fns.h"#include "io.h"#include "../port/error.h"#include "msaturn.h"enum { Isr = Saturn + 0x0400, Ipol = Saturn + 0x0404, Issr = Saturn + 0x0500, Ier = Saturn + 0x0504, Ipri = Saturn + 0x0600, Ithresh = Saturn + 0x0706,#define Iar Ithresh};enum{ Syscfg = Saturn + 0x0100,};static uchar intprio[] = { Vecuart0, // uart 0 Vecunused, // uart 1 Vecunused, // sint Vectimer0, // timer 0 Vecunused, // timer 1 Vecether, // ethernet Vecunused, // tea Vecunused, // irq0 Vecunused, // irq1 Vecunused, // irq2 Vecunused, // irq3 Vecunused, // irq4 Vecunused, // irq5 Vecunused, // irq6 Vecunused, // irq7 Vecunused, // irq8 };voidintend(int){}voidhwintrinit(void){ int i; *(ulong*)Ier=0; for(i=0; i<nelem(intprio)/2; i++) ((uchar*)Ipri)[i] = (intprio[2*i]<<4)|intprio[2*i+1];}intvectorenable(Vctl*v){ int i; for(i=0; i<nelem(intprio); i++) if(v->irq==intprio[i]){ *(ulong*)Ier |= 1<<(31-i); return v->irq; } print("intrenable: cannot enable intr %d\n", v->irq); return -1;}voidvectordisable(Vctl*v){ int i; for(i=0; i<nelem(intprio); i++) if(v->irq==intprio[i]){ *(ulong*)Ier &= ~(1<<(31-i)); return; }}intintvec(void){ ushort iar; int i; iar = *(ushort*)Iar; // push(prio) onto stack for(i=0; i<nelem(intprio); i++) if(iar==intprio[i]) return iar; iprint("saturnint: no vector %d\n", iar); intack(); return -1;}voidintack(void){ *(ushort*)Ithresh = 0; // pop(prio) stack}voidmachinit(void){ int rrate; ulong hid; extern char* plan9inistr; ulong l2cr; memset(m, 0, sizeof(*m)); m->cputype = getpvr()>>16; m->imap = (Imap*)INTMEM; m->loopconst = 1096; rrate = (*(ushort*)Syscfg >> 6) & 3; switch(rrate){ case 0: m->bushz = 66666666; break; case 1: m->bushz = 83333333; break; case 2: m->bushz = 100000000; break; case 3: m->bushz = 133333333; break; } if(getpll() == 0x80000000) m->cpuhz = 300000000; else m->cpuhz = 200000000; /* 750FX? */ m->cyclefreq = m->bushz / 4; active.machs = 1; active.exiting = 0; putmsr(getmsr() | MSR_ME); dcflush((void*)KZERO, 0x2000000); l2cr = getl2cr(); putl2cr(l2cr|BIT(10)); kfpinit(); hid=gethid0(); hid |= BIT(28)|BIT(26)|BIT(24); puthid0(hid); plan9inistr = "console=0\n" "ether0=type=saturn\n" "fs=135.104.9.42\n" "auth=135.104.9.7\n" "authdom=cs.bell-labs.com\n" "sys=ucu\n" "ntp=135.104.9.52\n";}voidsharedseginit(void){}voidtrapinit(void){ int i; for(i = 0x0; i < 0x2000; i += 0x100) sethvec(i, trapvec); dcflush(KADDR(0), 0x2000); icflush(KADDR(0), 0x2000); putmsr(getmsr() & ~MSR_IP);}voidreboot(void*, void*, ulong){}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -