## diffname pc/archgeneric.c 1992/0923
## diff -e /dev/null /n/bootesdump/1992/0923/sys/src/9/pc/archgeneric.c
0a
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "io.h"
static void
genericreset(void)
{
print("Reset the machine!\n");
for(;;);
}
PCArch generic =
{
"generic",
genericreset,
0,
0,
0,
0,
0,
0,
};
.
## diffname pc/archgeneric.c 1992/1013
## diff -e /n/bootesdump/1992/0923/sys/src/9/pc/archgeneric.c /n/bootesdump/1992/1013/sys/src/9/pc/archgeneric.c
18c
i8042reset,
.
## diffname pc/archgeneric.c 1997/0327
## diff -e /n/bootesdump/1992/1013/sys/src/9/pc/archgeneric.c /n/emeliedump/1997/0327/sys/src/brazil/pc/archgeneric.c
25a
void
cpuidprint(void)
{
int i;
char buf[128];
i = sprint(buf, "cpu%d: %dMHz ", m->machno, m->cpumhz);
if(m->cpuidid[0])
i += sprint(buf+i, "%s ", m->cpuidid);
sprint(buf+i, "%s (cpuid: AX 0x%4.4luX DX 0x%4.4luX)\n",
m->cpuidtype, m->cpuidax, m->cpuiddx);
print(buf);
}
int
cpuidentify(void)
{
int family, model;
X86type *t;
ulong cr4, mct[2];
cpuid(m->cpuidid, &m->cpuidax, &m->cpuiddx);
family = X86FAMILY(m->cpuidax);
model = X86MODEL(m->cpuidax);
for(t = x86type; t->name; t++){
if((t->family == family && t->model == model)
|| (t->family == family && t->model == -1)
|| (t->family == -1))
break;
}
m->cpuidtype = t->name;
i8253init(t->aalcycles);
/*
* If machine check exception or page size extensions are supported
* enable them in CR4 and clear any other set extensions.
* If machine check was enabled clear out any lingering status.
*/
if(m->cpuiddx & 0x88){
cr4 = 0;
if(m->cpuiddx & 0x08)
cr4 |= 0x10; /* page size extensions */
if(m->cpuiddx & 0x80)
cr4 |= 0x40; /* machine check enable */
putcr4(cr4);
if(m->cpuiddx & 0x80)
rdmsr(0x01, &mct[1], &mct[0]);
}
return t->family;
}
void
archinit(void)
{
PCArch **p;
arch = 0;
for(p = knownarch; *p; p++){
if((*p)->ident && (*p)->ident() == 0){
arch = *p;
break;
}
}
if(arch == 0)
arch = &archgeneric;
else{
if(arch->id == 0)
arch->id = archgeneric.id;
if(arch->reset == 0)
arch->reset = archgeneric.reset;
if(arch->serialpower == 0)
arch->serialpower = archgeneric.serialpower;
if(arch->modempower == 0)
arch->modempower = archgeneric.modempower;
if(arch->intrinit == 0)
arch->intrinit = archgeneric.intrinit;
if(arch->intrenable == 0)
arch->intrenable = archgeneric.intrenable;
}
/*
* Decide whether to use copy-on-reference (386 and mp).
*/
if(X86FAMILY(m->cpuidax) == 3 || conf.nmach > 1)
conf.copymode = 1;
if(X86FAMILY(m->cpuidax) == 6 /*&& conf.nmach > 1*/)
coherence = wbflush;
}
.
17,24c
{ 4, 0, 22, "486DX", }, /* known chips */
{ 4, 1, 22, "486DX50", },
{ 4, 2, 22, "486SX", },
{ 4, 3, 22, "486DX2", },
{ 4, 4, 22, "486SL", },
{ 4, 5, 22, "486SX2", },
{ 4, 7, 22, "DX2WB", }, /* P24D */
{ 4, 8, 22, "DX4", },
{ 4, 9, 22, "DX4WB", },
{ 5, 0, 23, "P5", },
{ 5, 1, 23, "P5", },
{ 5, 2, 23, "P54C", },
{ 5, 3, 23, "P24T", }, /* PODP5V83 */
{ 5, 4, 23, "PODP54", },
{ 5, 5, 23, "PODDX4", },
{ 5, 6, 23, "PODP5", },
{ 6, 4, 23, "P55CT", },
{ 6, 1, 16, "PentiumPro", },/* determined by trial and error */
{ 3, -1, 32, "386", }, /* family defaults */
{ 4, -1, 22, "486", },
{ 5, -1, 23, "Pentium", },
{ 6, -1, 16, "PentiumPro", },
{ -1, -1, 23, "unknown", }, /* total default */
.
15c
void (*coherence)(void) = nop;
PCArch* arch;
extern PCArch* knownarch[];
PCArch archgeneric = {
"generic", /* id */
0, /* ident */
i8042reset, /* reset */
unimplemented, /* serialpower */
unimplemented, /* modempower */
i8259init, /* intrinit */
i8259enable, /* intrenable */
i8253enable, /* clockenable */
};
typedef struct {
int family;
int model;
int aalcycles;
char* name;
} X86type;
static X86type x86type[] =
.
11,12d
9c
nop(void)
.
7a
static int
unimplemented(int)
{
return 0;
}
.
## diffname pc/archgeneric.c 1997/0404
## diff -e /n/emeliedump/1997/0327/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1997/0404/sys/src/brazil/pc/archgeneric.c
61a
{ 5, 7, 23, "P54C VRT", },
.
59c
{ 5, 4, 23, "P54C MMX", },
.
## diffname pc/archgeneric.c 1997/0407
## diff -e /n/emeliedump/1997/0404/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1997/0407/sys/src/brazil/pc/archgeneric.c
63d
58,59c
{ 5, 3, 23, "P24T", },
{ 5, 4, 23, "P55C MMX", },
.
53,54c
{ 4, 8, 22, "DX4", }, /* P24C */
{ 4, 9, 22, "DX4WB", }, /* P24CT */
.
## diffname pc/archgeneric.c 1997/0408
## diff -e /n/emeliedump/1997/0407/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1997/0408/sys/src/brazil/pc/archgeneric.c
60,61d
## diffname pc/archgeneric.c 1998/0115
## diff -e /n/emeliedump/1997/0408/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/0115/sys/src/brazil/pc/archgeneric.c
61a
{ 6, 3, 16, "PentiumII", }, /* determined by trial and error */
.
## diffname pc/archgeneric.c 1998/0401
## diff -e /n/emeliedump/1998/0115/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/0401/sys/src/brazil/pc/archgeneric.c
118c
rdmsr(0x01, &mct);
.
91c
ulong cr4;
vlong mct;
.
## diffname pc/archgeneric.c 1998/0404
## diff -e /n/emeliedump/1998/0401/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/0404/sys/src/brazil/pc/archgeneric.c
62a
{ 6, 5, 16, "PentiumII", }, /* determined by trial and error */
.
## diffname pc/archgeneric.c 1998/0522
## diff -e /n/emeliedump/1998/0404/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/0522/sys/src/brazil/pc/archgeneric.c
102a
t++;
.
98c
while(t->name){
.
95a
if(strncmp(m->cpuidid, "AuthenticAMD", 12) == 0)
t = x86amd;
else
t = x86intel;
.
72a
/*
* The AMD processors all implement the CPUID instruction.
* The later ones also return the processor name via functions
* 0x80000002, 0x80000003 and 0x80000004 in registers AX, BX, CX
* and DX:
* K5 "AMD-K5(tm) Processor"
* K6 "AMD-K6tm w/ multimedia extensions"
* K6 3D "AMD-K6(tm) 3D processor"
* K6 3D+ ?
*/
static X86type x86amd[] =
{
{ 5, 0, 23, "AMD-K5", }, /* guesswork */
{ 5, 1, 23, "AMD-K5", }, /* guesswork */
{ 5, 2, 23, "AMD-K5", }, /* guesswork */
{ 5, 3, 23, "AMD-K5", }, /* guesswork */
{ 5, 6, 23, "AMD-K6", }, /* guesswork */
{ 5, 7, 23, "AMD-K6", }, /* guesswork */
{ 5, 8, 23, "AMD-K6 3D", }, /* guesswork */
{ 5, 9, 23, "AMD-K6 3D+", },/* guesswork */
{ 4, -1, 22, "Am486", }, /* guesswork */
{ 5, -1, 23, "AMD-K5/K6", }, /* guesswork */
{ -1, -1, 23, "unknown", }, /* total default */
};
.
44c
static X86type x86intel[] =
.
## diffname pc/archgeneric.c 1998/0702
## diff -e /n/emeliedump/1998/0522/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/0702/sys/src/brazil/pc/archgeneric.c
89,90c
{ 5, 6, 11, "AMD-K6", }, /* determined by trial and error */
{ 5, 7, 11, "AMD-K6", }, /* determined by trial and error */
.
## diffname pc/archgeneric.c 1998/0710
## diff -e /n/emeliedump/1998/0702/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/0710/sys/src/brazil/pc/archgeneric.c
195a
}
static uvlong fasthz;
void
cycletimerinit(void)
{
fasthz = 1000000LL*m->cpumhz;
}
/*
* return the most precice clock we have
*/
uvlong
cycletimer(uvlong *hz)
{
uvlong tsc;
rdmsr(0x10, (vlong*)&tsc);
if(hz != nil)
*hz = fasthz;
return tsc;
}
uvlong
fastticks(uvlong *hz)
{
return (*arch->fastclock)(hz);
.
187a
/* pick the better timer */
if(X86FAMILY(m->cpuidax) >= 5){
cycletimerinit();
arch->fastclock = cycletimer;
}
.
34a
i8253read, /* read the standard timer */
.
19a
void cycletimerinit(void);
uvlong cycletimer(uvlong*);
.
## diffname pc/archgeneric.c 1998/0716
## diff -e /n/emeliedump/1998/0710/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/0716/sys/src/brazil/pc/archgeneric.c
212a
wrmsr(0x10, 0);
.
## diffname pc/archgeneric.c 1998/0717
## diff -e /n/emeliedump/1998/0716/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/0717/sys/src/brazil/pc/archgeneric.c
225a
m->fastclock = tsc;
.
## diffname pc/archgeneric.c 1998/0825
## diff -e /n/emeliedump/1998/0717/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/0825/sys/src/brazil/pc/archgeneric.c
113c
sprint(buf+i, "%s (cpuid: AX 0x%4.4uX DX 0x%4.4uX)\n",
.
## diffname pc/archgeneric.c 1998/0906
## diff -e /n/emeliedump/1998/0825/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/0906/sys/src/brazil/pc/archgeneric.c
71,72c
{ 5, -1, 23, "P5", },
{ 6, -1, 16, "P6", },
.
66,67c
{ 6, 3, 16, "PentiumII", },
{ 6, 5, 16, "PentiumII/Xeon", },
.
## diffname pc/archgeneric.c 1998/1106
## diff -e /n/emeliedump/1998/0906/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/1106/sys/src/brazil/pc/archgeneric.c
218c
* return the most precise clock we have
.
## diffname pc/archgeneric.c 1998/1222
## diff -e /n/emeliedump/1998/1106/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1998/1222/sys/src/brazil/pc/archgeneric.c
95,96c
{ 5, 8, 11, "AMD-K6 3D", }, /* guesswork */
{ 5, 9, 11, "AMD-K6 3D+", },/* guesswork */
.
## diffname pc/archgeneric.c 1999/0112
## diff -e /n/emeliedump/1998/1222/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1999/0112/sys/src/brazil/pc/archgeneric.c
204c
if(X86FAMILY(m->cpuidax) >= 5)
.
## diffname pc/archgeneric.c 1999/0129
## diff -e /n/emeliedump/1999/0112/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1999/0129/sys/src/brazil/pc/archgeneric.c
230,235d
208c
extern uvlong fasthz;
.
## diffname pc/archgeneric.c 1999/0130
## diff -e /n/emeliedump/1999/0129/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1999/0130/sys/src/brazil/pc/archgeneric.c
229a
}
vlong
fastticks(uvlong *hz)
{
return (*arch->fastclock)(hz);
.
208c
static uvlong fasthz;
.
## diffname pc/archgeneric.c 1999/0131
## diff -e /n/emeliedump/1999/0130/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1999/0131/sys/src/brazil/pc/archgeneric.c
141c
i8253init(t->aalcycles, t->family >= 5);
.
## diffname pc/archgeneric.c 1999/0218
## diff -e /n/emeliedump/1999/0131/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1999/0218/sys/src/brazil/pc/archgeneric.c
214c
fasthz = m->cpuhz;
.
## diffname pc/archgeneric.c 1999/0820 # deleted
## diff -e /n/emeliedump/1999/0218/sys/src/brazil/pc/archgeneric.c /n/emeliedump/1999/0820/sys/src/brazil/pc/archgeneric.c
1,236d
|