From 8514be287235f1cd1a3d033aaad34be9beb9b3a6 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 2 Mar 1994 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1994-03-02 --- pc/clock.c | 30 ++++++++++++++++++++++++++++++ pc/fns.h | 3 +++ pc/l.s | 24 +++++++++++++++++++++++- pc/main.c | 11 ++++++++++- port/portfns.h | 2 +- 5 files changed, 67 insertions(+), 3 deletions(-) diff --git a/pc/clock.c b/pc/clock.c index 44afd132ad248dc145b96fe2f0e7deee0f266300..77a8a26dcf579720d26c9131bb598ea0c3824947 100644 --- a/pc/clock.c +++ b/pc/clock.c @@ -82,6 +82,36 @@ clock(Ureg *ur, void *arg) splhi(); } +/* + * experimentally determined and justified by counting cycles in + * delay()'s inner loop + */ +enum +{ + mul386= 380, + mul486= 121, +}; + +void +printcpufreq(void) +{ + ulong freq; + int cpu; + + switch(cpu = x86()){ + default: + case 486: + freq = mul486; + break; + case 386: + freq = mul386; + break; + } + freq *= delayloop; + freq /= 10000; + print("CPU is a %ud MHz %d\n", freq, cpu); +} + void clockinit(void) { diff --git a/pc/fns.h b/pc/fns.h index 2456e2f260849b864417e88f11a1ddc61b6605aa..f6781646a281de981fadc9569848370dc6c88c71 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -66,6 +66,7 @@ void pcmspecialclose(int); long pcmwrite(int, int, void*, long, ulong); void prflush(void); void prhex(ulong); +void printcpufreq(void); void procrestore(Proc*); void procsave(Proc*); void procsetup(Proc*); @@ -86,6 +87,8 @@ void trapinit(void); int tas(void*); void uartclock(void); void vgainit(void); +int x86(void); + #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) #define kmapperm(x) kmap(x) #define getcallerpc(x) (*(ulong*)(x)) diff --git a/pc/l.s b/pc/l.s index 97be6af82bd1080ccf975d4e914a97d4504797a1..5d234639623136e63a26aa6f017c6372bca550e2 100644 --- a/pc/l.s +++ b/pc/l.s @@ -54,7 +54,7 @@ setpte: MOVL AX,CR3 MOVL CR0,AX ORL $0X80010000,AX - ANDL $~(0x8|0x2),AX /* TS=0, MP=0 */ + ANDL $~(0x40000000|0x20000000|0x8|0x2),AX /* CD=0, NW=0, TS=0, MP=0 */ MOVL AX,CR0 /* @@ -566,6 +566,28 @@ TEXT idle(SB),$0 HLT RET +/* + * return cpu type (what is a pentium?) + */ +TEXT x86(SB),$0 + + PUSHFL + MOVL 0(SP),AX + ORL $0x40000,AX + PUSHL AX + POPFL + PUSHFL + POPL AX + ANDL $0x40000,AX + JZ is386 + MOVL $486,AX + JMP done +is386: + MOVL $386,AX +done: + POPFL + RET + /* * label consists of a stack pointer and a PC */ diff --git a/pc/main.c b/pc/main.c index 1dee5f733cc2ec8b7bb63d43364cf1469986a66b..715b47dc3e7d40501373dddcd4954af1721ac82e 100644 --- a/pc/main.c +++ b/pc/main.c @@ -58,6 +58,7 @@ main(void) procinit0(); initseg(); links(); + printcpufreq(); chandevreset(); swapinit(); userinit(); @@ -391,7 +392,15 @@ confinit(void) conf.monitor = 1; conf.nswap = conf.nproc*80; conf.nimage = 50; - conf.copymode = 0; /* copy on write */ + switch(x86()){ + case 386: + conf.copymode = 1; /* copy on reference */ + break; + default: + case 486: + conf.copymode = 0; /* copy on write */ + break; + } conf.nfloppy = 2; conf.nhard = 2; conf.nmach = 1; diff --git a/port/portfns.h b/port/portfns.h index 723a2fb42f3a5893b1b9e642c1fe9ea833c6abe6..3779b8eb45c3c4b25bd8af6c12791f3ab82eea23 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -218,7 +218,7 @@ void sched(void); void schedinit(void); int screenbits(void); void screenupdate(void); -int scsiexec(Target*, int, uchar*, int, void*, int); +int scsiexec(Target*, int, uchar*, int, void*, int*); int scsiinv(int, int, Target**, uchar**, char*); Target* scsiunit(int, int); long seconds(void);