Add locore assembler functions to read mips3 cycle counter, and
read and write compare register (controls cycle-driven periodic interrupt). Use cycle counter for microsecond time on mips3, but for now only on 3min motherboards (5000/150). the MAXINE baseboard microsecond counter is more stable and I don't ave no 5000/260 to test. XXX clkread() is a mess, it should be rewritten. XXX should add nanotime() to give inkernel nanosecond resolution, and then microtime() reworked to use nanotime().
This commit is contained in:
parent
4ea6444493
commit
53c671e26c
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: locore_r4000.S,v 1.42 1998/03/12 05:45:06 thorpej Exp $ */
|
/* $NetBSD: locore_r4000.S,v 1.43 1998/04/19 01:48:34 jonathan Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997 Jonathan Stone (hereinafter referred to as the author)
|
* Copyright (c) 1997 Jonathan Stone (hereinafter referred to as the author)
|
||||||
|
@ -2282,6 +2282,62 @@ NLEAF(mips3_cpu_switch_resume)
|
||||||
li v0, 1 # possible return to 'savectx()'
|
li v0, 1 # possible return to 'savectx()'
|
||||||
END(mips3_cpu_switch_resume)
|
END(mips3_cpu_switch_resume)
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* mips3_cycle_count --
|
||||||
|
*
|
||||||
|
* u_int32_t mips3_cycle_count(void)
|
||||||
|
*
|
||||||
|
* read 32-bit cycle-counter clock in coprocessor 0.
|
||||||
|
*
|
||||||
|
* Results:
|
||||||
|
* returns 32-bit clock value, incremented automatically by CPU
|
||||||
|
* at nominal cycle rate (i.e., half the maximum issue rate.)
|
||||||
|
*
|
||||||
|
* Side effects:
|
||||||
|
* none.
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
LEAF(mips3_cycle_count)
|
||||||
|
mfc0 v0, MIPS_COP_0_COUNT
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
j ra
|
||||||
|
nop
|
||||||
|
END(mips3_cycle_count)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read compare register.
|
||||||
|
*
|
||||||
|
* On mips3, generates a hardint 5 interrupt request is generated
|
||||||
|
* each time the COUNT register increments past the COMPARE register.
|
||||||
|
*
|
||||||
|
* (The mips interrupt mask defintions currently leaves this interrupt
|
||||||
|
* unconditionally masked out on mips3 CPUs.)
|
||||||
|
*/
|
||||||
|
LEAF(mips3_read_compare)
|
||||||
|
mfc0 v0, MIPS_COP_0_COMPARE
|
||||||
|
nop
|
||||||
|
j ra
|
||||||
|
nop
|
||||||
|
END(mips3_read_compare)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write value to compare register.
|
||||||
|
*
|
||||||
|
* Side Effects:
|
||||||
|
* Clears interrupt request from cycle-counter clock.
|
||||||
|
*/
|
||||||
|
LEAF(mips3_write_compare)
|
||||||
|
mtc0 a0, MIPS_COP_0_COMPARE
|
||||||
|
nop
|
||||||
|
j ra
|
||||||
|
nop
|
||||||
|
END(mips3_write_compare)
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------
|
||||||
*
|
*
|
||||||
* XXX END of r4000-specific code XXX
|
* XXX END of r4000-specific code XXX
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: dec_3min.c,v 1.5 1998/03/30 06:45:37 jonathan Exp $ */
|
/* $NetBSD: dec_3min.c,v 1.6 1998/04/19 01:48:35 jonathan Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1998 Jonathan Stone. All rights reserved.
|
* Copyright (c) 1998 Jonathan Stone. All rights reserved.
|
||||||
|
@ -73,7 +73,7 @@
|
||||||
|
|
||||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||||
|
|
||||||
__KERNEL_RCSID(0, "$NetBSD: dec_3min.c,v 1.5 1998/03/30 06:45:37 jonathan Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: dec_3min.c,v 1.6 1998/04/19 01:48:35 jonathan Exp $");
|
||||||
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -380,9 +380,16 @@ dec_3min_intr(mask, pc, statusReg, causeReg)
|
||||||
kn02ba_errintr();
|
kn02ba_errintr();
|
||||||
|
|
||||||
if (intr & KMIN_INTR_CLOCK) {
|
if (intr & KMIN_INTR_CLOCK) {
|
||||||
|
extern u_int32_t mips3_cycle_count __P((void));
|
||||||
|
|
||||||
temp = c->regc; /* XXX clear interrupt bits */
|
temp = c->regc; /* XXX clear interrupt bits */
|
||||||
cf.pc = pc;
|
cf.pc = pc;
|
||||||
cf.sr = statusReg;
|
cf.sr = statusReg;
|
||||||
|
#ifdef MIPS3
|
||||||
|
if (CPUISMIPS3) {
|
||||||
|
latched_cycle_cnt = mips3_cycle_count();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
hardclock(&cf);
|
hardclock(&cf);
|
||||||
intrcnt[HARDCLOCK]++;
|
intrcnt[HARDCLOCK]++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: machdep.c,v 1.113 1998/03/31 11:32:52 jonathan Exp $ */
|
/* $NetBSD: machdep.c,v 1.114 1998/04/19 01:48:35 jonathan Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988 University of Utah.
|
* Copyright (c) 1988 University of Utah.
|
||||||
|
@ -43,7 +43,7 @@
|
||||||
|
|
||||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||||
|
|
||||||
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.113 1998/03/31 11:32:52 jonathan Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.114 1998/04/19 01:48:35 jonathan Exp $");
|
||||||
|
|
||||||
/* from: Utah Hdr: machdep.c 1.63 91/04/24 */
|
/* from: Utah Hdr: machdep.c 1.63 91/04/24 */
|
||||||
|
|
||||||
|
@ -857,6 +857,14 @@ clkread()
|
||||||
register u_long usec, cycles; /* really 32 bits? */
|
register u_long usec, cycles; /* really 32 bits? */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(DEC_3MIN)
|
||||||
|
if (systype == DS_3MIN && CPUISMIPS3) {
|
||||||
|
extern u_int32_t mips3_cycle_count __P((void));
|
||||||
|
register u_int32_t mips3_cycles =
|
||||||
|
mips3_cycle_count() - (u_int32_t)latched_cycle_cnt;
|
||||||
|
return ((mips3_cycles / cpu_mhz);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
#ifdef DEC_MAXINE
|
#ifdef DEC_MAXINE
|
||||||
if (systype == DS_MAXINE)
|
if (systype == DS_MAXINE)
|
||||||
return (*(u_long*)(MIPS_PHYS_TO_KSEG1(XINE_REG_FCTR)) -
|
return (*(u_long*)(MIPS_PHYS_TO_KSEG1(XINE_REG_FCTR)) -
|
||||||
|
@ -972,6 +980,7 @@ initcpu()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert an ASCII string into an integer.
|
* Convert an ASCII string into an integer.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue