machdep.c (778) | machdep.c (798) |
---|---|
1/*- 2 * Copyright (c) 1992 Terrence R. Lambert. 3 * Copyright (c) 1982, 1987, 1990 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * William Jolitz. 8 * --- 21 unchanged lines hidden (view full) --- 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 * 37 * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 | 1/*- 2 * Copyright (c) 1992 Terrence R. Lambert. 3 * Copyright (c) 1982, 1987, 1990 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * William Jolitz. 8 * --- 21 unchanged lines hidden (view full) --- 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 * 37 * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 |
38 * $Id: machdep.c,v 1.17 1993/11/16 09:54:47 davidg Exp $ | 38 * $Id: machdep.c,v 1.18 1993/11/17 23:24:56 wollman Exp $ |
39 */ 40 41#include "npx.h" 42#include "isa.h" 43 44#include <stddef.h> 45#include "param.h" 46#include "systm.h" --- 37 unchanged lines hidden (view full) --- 84#include "machine/reg.h" 85#include "machine/psl.h" 86#include "machine/specialreg.h" 87#include "machine/sysarch.h" 88 89#include "i386/isa/isa.h" 90#include "i386/isa/rtc.h" 91 | 39 */ 40 41#include "npx.h" 42#include "isa.h" 43 44#include <stddef.h> 45#include "param.h" 46#include "systm.h" --- 37 unchanged lines hidden (view full) --- 84#include "machine/reg.h" 85#include "machine/psl.h" 86#include "machine/specialreg.h" 87#include "machine/sysarch.h" 88 89#include "i386/isa/isa.h" 90#include "i386/isa/rtc.h" 91 |
92static void identifycpu(void); 93static void initcpu(void); |
|
92 93#define EXPECT_BASEMEM 640 /* The expected base memory*/ 94#define INFORM_WAIT 1 /* Set to pause berfore crash in weird cases*/ 95 96#ifndef PANIC_REBOOT_WAIT_TIME 97#define PANIC_REBOOT_WAIT_TIME 15 /* default to 15 seconds */ 98#endif 99 --- 39 unchanged lines hidden (view full) --- 139 register int unixsize; 140 register unsigned i; 141 register struct pte *pte; 142 int mapaddr, j; 143 register caddr_t v; 144 int maxbufs, base, residual; 145 extern long Usrptsize; 146 vm_offset_t minaddr, maxaddr; | 94 95#define EXPECT_BASEMEM 640 /* The expected base memory*/ 96#define INFORM_WAIT 1 /* Set to pause berfore crash in weird cases*/ 97 98#ifndef PANIC_REBOOT_WAIT_TIME 99#define PANIC_REBOOT_WAIT_TIME 15 /* default to 15 seconds */ 100#endif 101 --- 39 unchanged lines hidden (view full) --- 141 register int unixsize; 142 register unsigned i; 143 register struct pte *pte; 144 int mapaddr, j; 145 register caddr_t v; 146 int maxbufs, base, residual; 147 extern long Usrptsize; 148 vm_offset_t minaddr, maxaddr; |
147 vm_size_t size; | 149 vm_size_t size = 0; |
148 int firstaddr; 149 150 /* 151 * Initialize error message buffer (at end of core). 152 */ 153 154 /* avail_end was pre-decremented in pmap_bootstrap to compensate */ 155 for (i = 0; i < btoc(sizeof (struct msgbuf)); i++) --- 154 unchanged lines hidden (view full) --- 310 { "Intel 80286", CPUCLASS_286 }, /* CPU_286 */ 311 { "i386SX", CPUCLASS_386 }, /* CPU_386SX */ 312 { "i386DX", CPUCLASS_386 }, /* CPU_386 */ 313 { "i486SX", CPUCLASS_486 }, /* CPU_486SX */ 314 { "i486DX", CPUCLASS_486 }, /* CPU_486 */ 315 { "i586", CPUCLASS_586 }, /* CPU_586 */ 316}; 317 | 150 int firstaddr; 151 152 /* 153 * Initialize error message buffer (at end of core). 154 */ 155 156 /* avail_end was pre-decremented in pmap_bootstrap to compensate */ 157 for (i = 0; i < btoc(sizeof (struct msgbuf)); i++) --- 154 unchanged lines hidden (view full) --- 312 { "Intel 80286", CPUCLASS_286 }, /* CPU_286 */ 313 { "i386SX", CPUCLASS_386 }, /* CPU_386SX */ 314 { "i386DX", CPUCLASS_386 }, /* CPU_386 */ 315 { "i486SX", CPUCLASS_486 }, /* CPU_486SX */ 316 { "i486DX", CPUCLASS_486 }, /* CPU_486 */ 317 { "i586", CPUCLASS_586 }, /* CPU_586 */ 318}; 319 |
320static void |
|
318identifycpu() /* translated from hp300 -- cgd */ 319{ 320 printf("CPU: "); 321 if (cpu >= 0 && cpu < (sizeof i386_cpus/sizeof(struct cpu_nameclass))) { 322 printf("%s", i386_cpus[cpu].cpu_name); 323 cpu_class = i386_cpus[cpu].cpu_class; 324 } else { 325 printf("unknown cpu type %d\n", cpu); --- 174 unchanged lines hidden (view full) --- 500 * make sure that the user has not modified the 501 * psl to gain improper priviledges or to cause 502 * a machine fault. 503 */ 504struct sigreturn_args { 505 struct sigcontext *sigcntxp; 506}; 507 | 321identifycpu() /* translated from hp300 -- cgd */ 322{ 323 printf("CPU: "); 324 if (cpu >= 0 && cpu < (sizeof i386_cpus/sizeof(struct cpu_nameclass))) { 325 printf("%s", i386_cpus[cpu].cpu_name); 326 cpu_class = i386_cpus[cpu].cpu_class; 327 } else { 328 printf("unknown cpu type %d\n", cpu); --- 174 unchanged lines hidden (view full) --- 503 * make sure that the user has not modified the 504 * psl to gain improper priviledges or to cause 505 * a machine fault. 506 */ 507struct sigreturn_args { 508 struct sigcontext *sigcntxp; 509}; 510 |
511int |
|
508sigreturn(p, uap, retval) 509 struct proc *p; 510 struct sigreturn_args *uap; 511 int *retval; 512{ 513 register struct sigcontext *scp; 514 register struct sigframe *fp; 515 register int *regs = p->p_regs; --- 208 unchanged lines hidden (view full) --- 724 while (tvp->tv_usec > 1000000) { 725 tvp->tv_sec++; 726 tvp->tv_usec -= 1000000; 727 } 728 splx(s); 729} 730#endif /* HZ */ 731 | 512sigreturn(p, uap, retval) 513 struct proc *p; 514 struct sigreturn_args *uap; 515 int *retval; 516{ 517 register struct sigcontext *scp; 518 register struct sigframe *fp; 519 register int *regs = p->p_regs; --- 208 unchanged lines hidden (view full) --- 728 while (tvp->tv_usec > 1000000) { 729 tvp->tv_sec++; 730 tvp->tv_usec -= 1000000; 731 } 732 splx(s); 733} 734#endif /* HZ */ 735 |
736void |
|
732physstrat(bp, strat, prio) 733 struct buf *bp; 734 int (*strat)(), prio; 735{ 736 register int s; 737 caddr_t baddr; 738 | 737physstrat(bp, strat, prio) 738 struct buf *bp; 739 int (*strat)(), prio; 740{ 741 register int s; 742 caddr_t baddr; 743 |
739 /* 740 * vmapbuf clobbers b_addr so we must remember it so that it 741 * can be restored after vunmapbuf. This is truely rude, we 742 * should really be storing this in a field in the buf struct 743 * but none are available and I didn't want to add one at 744 * this time. Note that b_addr for dirty page pushes is 745 * restored in vunmapbuf. (ugh!) 746 */ 747 baddr = bp->b_un.b_addr; | |
748 vmapbuf(bp); 749 (*strat)(bp); 750 /* pageout daemon doesn't wait for pushed pages */ 751 if (bp->b_flags & B_DIRTY) 752 return; 753 s = splbio(); 754 while ((bp->b_flags & B_DONE) == 0) 755 tsleep((caddr_t)bp, prio, "physstr", 0); 756 splx(s); 757 vunmapbuf(bp); | 744 vmapbuf(bp); 745 (*strat)(bp); 746 /* pageout daemon doesn't wait for pushed pages */ 747 if (bp->b_flags & B_DIRTY) 748 return; 749 s = splbio(); 750 while ((bp->b_flags & B_DONE) == 0) 751 tsleep((caddr_t)bp, prio, "physstr", 0); 752 splx(s); 753 vunmapbuf(bp); |
758 bp->b_un.b_addr = baddr; | |
759} 760 | 754} 755 |
756static void |
|
761initcpu() 762{ 763} 764 765/* 766 * Clear registers on exec 767 */ 768void --- 158 unchanged lines hidden (view full) --- 927 0xfffff, /* length - all address space */ 928 SDT_MEMRWA, /* segment type */ 929 SEL_UPL, /* segment descriptor priority level */ 930 1, /* segment descriptor present */ 931 0, 0, 932 1, /* default 32 vs 16 bit size */ 933 1 /* limit granularity (byte/page units)*/ } }; 934 | 757initcpu() 758{ 759} 760 761/* 762 * Clear registers on exec 763 */ 764void --- 158 unchanged lines hidden (view full) --- 923 0xfffff, /* length - all address space */ 924 SDT_MEMRWA, /* segment type */ 925 SEL_UPL, /* segment descriptor priority level */ 926 1, /* segment descriptor present */ 927 0, 0, 928 1, /* default 32 vs 16 bit size */ 929 1 /* limit granularity (byte/page units)*/ } }; 930 |
935setidt(idx, func, typ, dpl) char *func; { | 931void 932setidt(idx, func, typ, dpl) 933 int idx; 934 caddr_t func; 935 int typ; 936 int dpl; 937{ |
936 struct gate_descriptor *ip = idt + idx; 937 938 ip->gd_looffset = (int)func; 939 ip->gd_selector = 8; 940 ip->gd_stkcpy = 0; 941 ip->gd_xx = 0; 942 ip->gd_type = typ; 943 ip->gd_dpl = dpl; --- 9 unchanged lines hidden (view full) --- 953 IDTVEC(rsvd1), IDTVEC(rsvd2), IDTVEC(rsvd3), IDTVEC(rsvd4), 954 IDTVEC(rsvd5), IDTVEC(rsvd6), IDTVEC(rsvd7), IDTVEC(rsvd8), 955 IDTVEC(rsvd9), IDTVEC(rsvd10), IDTVEC(rsvd11), IDTVEC(rsvd12), 956 IDTVEC(rsvd13), IDTVEC(rsvd14), IDTVEC(rsvd14), IDTVEC(syscall); 957 958int lcr0(), lcr3(), rcr0(), rcr2(); 959int _gsel_tss; 960 | 938 struct gate_descriptor *ip = idt + idx; 939 940 ip->gd_looffset = (int)func; 941 ip->gd_selector = 8; 942 ip->gd_stkcpy = 0; 943 ip->gd_xx = 0; 944 ip->gd_type = typ; 945 ip->gd_dpl = dpl; --- 9 unchanged lines hidden (view full) --- 955 IDTVEC(rsvd1), IDTVEC(rsvd2), IDTVEC(rsvd3), IDTVEC(rsvd4), 956 IDTVEC(rsvd5), IDTVEC(rsvd6), IDTVEC(rsvd7), IDTVEC(rsvd8), 957 IDTVEC(rsvd9), IDTVEC(rsvd10), IDTVEC(rsvd11), IDTVEC(rsvd12), 958 IDTVEC(rsvd13), IDTVEC(rsvd14), IDTVEC(rsvd14), IDTVEC(syscall); 959 960int lcr0(), lcr3(), rcr0(), rcr2(); 961int _gsel_tss; 962 |
963void |
|
961init386(first) | 964init386(first) |
965 int first; |
|
962{ 963 extern ssdtosd(), lgdt(), lidt(), lldt(), etext; 964 int x, *pi; 965 unsigned biosbasemem, biosextmem; 966 struct gate_descriptor *gdp; 967 extern int sigcode,szsigcode; 968 /* table descriptors - used to load tables by microp */ 969 unsigned short r_gdt[3], r_idt[3]; --- 195 unchanged lines hidden (view full) --- 1165} 1166 1167extern struct pte *CMAP1, *CMAP2; 1168extern caddr_t CADDR1, CADDR2; 1169/* 1170 * zero out physical memory 1171 * specified in relocation units (NBPG bytes) 1172 */ | 966{ 967 extern ssdtosd(), lgdt(), lidt(), lldt(), etext; 968 int x, *pi; 969 unsigned biosbasemem, biosextmem; 970 struct gate_descriptor *gdp; 971 extern int sigcode,szsigcode; 972 /* table descriptors - used to load tables by microp */ 973 unsigned short r_gdt[3], r_idt[3]; --- 195 unchanged lines hidden (view full) --- 1169} 1170 1171extern struct pte *CMAP1, *CMAP2; 1172extern caddr_t CADDR1, CADDR2; 1173/* 1174 * zero out physical memory 1175 * specified in relocation units (NBPG bytes) 1176 */ |
1173clearseg(n) { | 1177void 1178clearseg(n) 1179 int n; 1180{ |
1174 1175 *(int *)CMAP2 = PG_V | PG_KW | ctob(n); 1176 load_cr3(rcr3()); 1177 bzero(CADDR2,NBPG); 1178#ifndef MACHINE_NONCONTIG 1179 *(int *) CADDR2 = 0; 1180#endif /* MACHINE_NONCONTIG */ 1181} 1182 1183/* 1184 * copy a page of physical memory 1185 * specified in relocation units (NBPG bytes) 1186 */ 1187void | 1181 1182 *(int *)CMAP2 = PG_V | PG_KW | ctob(n); 1183 load_cr3(rcr3()); 1184 bzero(CADDR2,NBPG); 1185#ifndef MACHINE_NONCONTIG 1186 *(int *) CADDR2 = 0; 1187#endif /* MACHINE_NONCONTIG */ 1188} 1189 1190/* 1191 * copy a page of physical memory 1192 * specified in relocation units (NBPG bytes) 1193 */ 1194void |
1188copyseg(frm, n) { | 1195copyseg(frm, n) 1196 int frm; 1197 int n; 1198{ |
1189 1190 *(int *)CMAP2 = PG_V | PG_KW | ctob(n); 1191 load_cr3(rcr3()); 1192 bcopy((void *)frm, (void *)CADDR2, NBPG); 1193} 1194 1195/* 1196 * copy a page of physical memory 1197 * specified in relocation units (NBPG bytes) 1198 */ 1199void | 1199 1200 *(int *)CMAP2 = PG_V | PG_KW | ctob(n); 1201 load_cr3(rcr3()); 1202 bcopy((void *)frm, (void *)CADDR2, NBPG); 1203} 1204 1205/* 1206 * copy a page of physical memory 1207 * specified in relocation units (NBPG bytes) 1208 */ 1209void |
1200physcopyseg(frm, to) { | 1210physcopyseg(frm, to) 1211 int frm; 1212 int to; 1213{ |
1201 1202 *(int *)CMAP1 = PG_V | PG_KW | ctob(frm); 1203 *(int *)CMAP2 = PG_V | PG_KW | ctob(to); 1204 load_cr3(rcr3()); 1205 bcopy(CADDR1, CADDR2, NBPG); 1206} 1207 1208/*aston() { --- 4 unchanged lines hidden (view full) --- 1213setsoftclock() { 1214 schednetisr(NETISR_SCLK); 1215} 1216 1217/* 1218 * insert an element into a queue 1219 */ 1220#undef insque | 1214 1215 *(int *)CMAP1 = PG_V | PG_KW | ctob(frm); 1216 *(int *)CMAP2 = PG_V | PG_KW | ctob(to); 1217 load_cr3(rcr3()); 1218 bcopy(CADDR1, CADDR2, NBPG); 1219} 1220 1221/*aston() { --- 4 unchanged lines hidden (view full) --- 1226setsoftclock() { 1227 schednetisr(NETISR_SCLK); 1228} 1229 1230/* 1231 * insert an element into a queue 1232 */ 1233#undef insque |
1234void /* XXX replace with inline FIXME! */ |
|
1221_insque(element, head) 1222 register struct prochd *element, *head; 1223{ 1224 element->ph_link = head->ph_link; 1225 head->ph_link = (struct proc *)element; 1226 element->ph_rlink = (struct proc *)head; 1227 ((struct prochd *)(element->ph_link))->ph_rlink=(struct proc *)element; 1228} 1229 1230/* 1231 * remove an element from a queue 1232 */ 1233#undef remque | 1235_insque(element, head) 1236 register struct prochd *element, *head; 1237{ 1238 element->ph_link = head->ph_link; 1239 head->ph_link = (struct proc *)element; 1240 element->ph_rlink = (struct proc *)head; 1241 ((struct prochd *)(element->ph_link))->ph_rlink=(struct proc *)element; 1242} 1243 1244/* 1245 * remove an element from a queue 1246 */ 1247#undef remque |
1248void /* XXX replace with inline FIXME! */ |
|
1234_remque(element) 1235 register struct prochd *element; 1236{ 1237 ((struct prochd *)(element->ph_link))->ph_rlink = element->ph_rlink; 1238 ((struct prochd *)(element->ph_rlink))->ph_link = element->ph_link; 1239 element->ph_rlink = (struct proc *)0; 1240} 1241 --- 234 unchanged lines hidden --- | 1249_remque(element) 1250 register struct prochd *element; 1251{ 1252 ((struct prochd *)(element->ph_link))->ph_rlink = element->ph_rlink; 1253 ((struct prochd *)(element->ph_rlink))->ph_link = element->ph_link; 1254 element->ph_rlink = (struct proc *)0; 1255} 1256 --- 234 unchanged lines hidden --- |