~kris/9p

9hist

3e1eb67a243ace3c11dca32572f209466201b43e — David du Colombier 24 years ago 684b040
Plan 9 from Bell Labs 2002-04-15
7 files changed, 46 insertions(+), 8 deletions(-)

M pc/apic.c
M pc/archmp.c
M pc/dat.h
M pc/fns.h
M pc/i8253.c
M pc/mp.c
M port/proc.c
M pc/apic.c => pc/apic.c +0 -3
@@ 343,8 343,6 @@ ioapicinit(Apic* apic, int apicno)
		ioapicrdtw(apic, v, hi, lo);
}

ulong lapicperiodset[32];

void
lapictimerset(uvlong next)
{


@@ 366,7 364,6 @@ lapictimerset(uvlong next)
	}

	lapicw(LapicTICR, period);
	lapicperiodset[m->machno]++;

	unlock(&m->apictimerlock);
	splx(x);

M pc/archmp.c => pc/archmp.c +36 -1
@@ 89,12 89,47 @@ identify(void)
	return 0;
}

Lock mpsynclock;

void
syncclock(void)
{
	uvlong x;

	if(m->machno == 0){
		wrmsr(0x10, 0);
		m->tscticks = 0;
		m->tscoff = 0;
	} else {
		x = MACHP(0)->tscticks;
		while(x == MACHP(0)->tscticks)
			;
		m->tscoff = MACHP(0)->tscticks;
		wrmsr(0x10, 0);
		m->tscticks = 0;
	}
}

uvlong
tscticks(uvlong *hz)
{
	uvlong t;

	if(hz != nil)
		*hz = m->cpuhz;

	rdtsc(&t);
	m->tscticks = t;

	return t+m->tscoff;
}

PCArch archmp = {
.id=		"_MP_",	
.ident=		identify,
.reset=		mpshutdown,
.intrinit=	mpinit,
.intrenable=	mpintrenable,
.fastclock=	i8253read,
.fastclock=	tscticks,
.timerset=	lapictimerset,
};

M pc/dat.h => pc/dat.h +3 -1
@@ 185,13 185,15 @@ struct Mach

	Lock	apictimerlock;
	int	cpumhz;
	vlong	cpuhz;
	uvlong	cpuhz;
	int	cpuidax;
	int	cpuiddx;
	char	cpuidid[16];
	char*	cpuidtype;
	int	havetsc;
	int	havepge;
	uvlong	tscticks;
	uvlong	tscoff;

	vlong	mtrrcap;
	vlong	mtrrdef;

M pc/fns.h => pc/fns.h +2 -1
@@ 121,11 121,12 @@ void	procsetup(Proc*);
void	putcr3(ulong);
void	putcr4(ulong);
void	rdmsr(int, vlong*);
void	rdtsc(vlong*);
void	rdtsc(uvlong*);
void	screeninit(void);
int	screenprint(char*, ...);			/* debugging */
void	(*screenputs)(char*, int);
void	sfence(void);
void	syncclock(void);
void	touser(void*);
void	trapenable(int, void (*)(Ureg*, void*), void*, char*);
void	trapinit(void);

M pc/i8253.c => pc/i8253.c +1 -1
@@ 116,7 116,7 @@ void
guesscpuhz(int aalcycles)
{
	int cpufreq, loops, incr, x, y;
	vlong a, b;
	uvlong a, b;

	/* find biggest loop that doesn't wrap */
	incr = 16000000/(aalcycles*HZ*2);

M pc/mp.c => pc/mp.c +2 -0
@@ 365,6 365,7 @@ squidboy(Apic* apic)

	lapicinit(apic);
	lapiconline();
	syncclock();
	timersinit();

	lock(&active);


@@ 460,6 461,7 @@ mpinit(void)
	Apic *apic, *bpapic;

	i8259init();
	syncclock();

	if(_mp_ == 0)
		return;

M port/proc.c => port/proc.c +2 -1
@@ 263,7 263,7 @@ found:

	l = 0;
	for(p = rq->head; p; p = p->rnext){
		if(p->mp == MACHP(m->machno) || p->movetime < MACHP(0)->ticks)
		if(p->mp == MACHP(m->machno) || p->movetime <= MACHP(0)->ticks)
			break;
		l = p;
	}


@@ 359,6 359,7 @@ newproc(void)
	p->errbuf1[0] = '\0';
	p->nlocks = 0;
	p->delaysched = 0;
	p->movetime = 0;
	kstrdup(&p->user, "*nouser");
	kstrdup(&p->text, "*notext");
	kstrdup(&p->args, "");