~kris/9p

9hist

cb382d00f751c5d8a48d515b87a10bb24ddb3891 — David du Colombier 24 years ago 7b28ff9
Plan 9 from Bell Labs 2002-06-09
3 files changed, 42 insertions(+), 2 deletions(-)

M pc/fns.h
M pc/i8253.c
M pc/main.c
M pc/fns.h => pc/fns.h +3 -2
@@ 41,10 41,11 @@ void	i8042reset(void);
void	i8250console(void);
void*	i8250alloc(int, int, int);
void	i8250mouse(char*, int (*)(Queue*, int), int);
void	i8253init(void);
void	i8253enable(void);
void	i8253timerset(uvlong);
void	i8253init(void);
void	i8253link(void);
uvlong	i8253read(uvlong*);
void	i8253timerset(uvlong);
void	i8259init(void);
int	i8259isr(int);
int	i8259enable(Vctl*);

M pc/i8253.c => pc/i8253.c +38 -0
@@ 186,6 186,7 @@ guesscpuhz(int aalcycles)
}

ulong i8253periodset;
int i8253dotimerset = 1;

void
i8253timerset(uvlong next)


@@ 194,6 195,9 @@ i8253timerset(uvlong next)
	ulong want;
	ulong now;

	if(i8253dotimerset == 0)
		return;

	want = next>>Tickshift;
	now = i8253.ticks;	/* assuming whomever called us just did fastticks() */



@@ 235,6 239,40 @@ i8253enable(void)
	intrenable(IrqCLOCK, i8253clock, 0, BUSUNKNOWN, "clock");
}

static long
i8253timerread(Chan*, void *a, long n, vlong offset)
{
	if(n < 16)
		error("need more room");
	if(offset)
		return 0;
	return snprint(a, n, "timerset %s", i8253dotimerset ? "on" : "off");
}

static long
i8253timerwrite(Chan*, void *a, long n, vlong)
{
	if(n==3 && memcmp(a, "off", 3) == 0){
		i8253dotimerset = 0;
		outb(Tmode, Load0|Square);
		outb(T0cntr, (Freq/HZ));
		outb(T0cntr, (Freq/HZ)>>8);
		return n;
	}
	if(n==2 && memcmp(a, "on", 2) == 0){
		i8253dotimerset = 1;
		return n;
	}
	error("invalid control message");
	return -1;
}

void
i8253link(void)
{
	addarchfile("i8253timerset", 0664, i8253timerread, i8253timerwrite);
}

/*
 *  return the total ticks of counter 1.  We shift by
 *  8 to give timesync more wriggle room for interpretation

M pc/main.c => pc/main.c +1 -0
@@ 105,6 105,7 @@ main(void)
	links();
conf.monitor = 1;
	chandevreset();
	i8253link();
	pageinit();
	swapinit();
	userinit();