⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 machdep.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	printf("dump ");	switch ((*bdevsw[major(dumpdev)].d_dump)(dumpdev)) {	case ENXIO:		printf("device bad\n");		break;	case EFAULT:		printf("device not ready\n");		break;	case EINVAL:		printf("area improper\n");		break;	case EIO:		printf("i/o error\n");		break;	default:		printf("succeeded\n");		break;	}	printf("\n\n");	DELAY(1000);}microtime(tvp)	register struct timeval *tvp;{	int s = splhigh();	*tvp = time;	tvp->tv_usec += tick;	while (tvp->tv_usec > 1000000) {		tvp->tv_sec++;		tvp->tv_usec -= 1000000;	}	splx(s);}physstrat(bp, strat, prio)	struct buf *bp;	int (*strat)(), prio;{	register int s;	caddr_t baddr;	/*	 * vmapbuf clobbers b_addr so we must remember it so that it	 * can be restored after vunmapbuf.  This is truely rude, we	 * should really be storing this in a field in the buf struct	 * but none are available and I didn't want to add one at	 * this time.  Note that b_addr for dirty page pushes is 	 * restored in vunmapbuf. (ugh!)	 */	baddr = bp->b_un.b_addr;	vmapbuf(bp);	(*strat)(bp);	/* pageout daemon doesn't wait for pushed pages */	if (bp->b_flags & B_DIRTY)		return;	s = splbio();	while ((bp->b_flags & B_DONE) == 0)		sleep((caddr_t)bp, prio);	splx(s);	vunmapbuf(bp);	bp->b_un.b_addr = baddr;}initcpu(){}/* * Clear registers on exec */setregs(p, entry, retval)	register struct proc *p;	u_long entry;	int retval[2];{	p->p_md.md_regs[sEBP] = 0;	/* bottom of the fp chain */	p->p_md.md_regs[sEIP] = entry;	p->p_addr->u_pcb.pcb_flags = 0;	/* no fp at all */	load_cr0(rcr0() | CR0_EM);	/* start emulating */#include "npx.h"#if NNPX > 0	npxinit(0x262);#endif}/* * machine dependent system variables. */cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p)	int *name;	u_int namelen;	void *oldp;	size_t *oldlenp;	void *newp;	size_t newlen;	struct proc *p;{	/* all sysctl names at this level are terminal */	if (namelen != 1)		return (ENOTDIR);		/* overloaded */	switch (name[0]) {	case CPU_CONSDEV:		return (sysctl_rdstruct(oldp, oldlenp, newp, &cn_tty->t_dev,		    sizeof cn_tty->t_dev));	default:		return (EOPNOTSUPP);	}	/* NOTREACHED */}/* * Initialize 386 and configure to run kernel *//* * Initialize segments & interrupt table */#define	GNULL_SEL	0	/* Null Descriptor */#define	GCODE_SEL	1	/* Kernel Code Descriptor */#define	GDATA_SEL	2	/* Kernel Data Descriptor */#define	GLDT_SEL	3	/* LDT - eventually one per process */#define	GTGATE_SEL	4	/* Process task switch gate */#define	GPANIC_SEL	5	/* Task state to consider panic from */#define	GPROC0_SEL	6	/* Task state process slot zero and up */#define NGDT 	GPROC0_SEL+1union descriptor gdt[GPROC0_SEL+1];/* interrupt descriptor table */struct gate_descriptor idt[32+16];/* local descriptor table */union descriptor ldt[5];#define	LSYS5CALLS_SEL	0	/* forced by intel BCS */#define	LSYS5SIGR_SEL	1#define	L43BSDCALLS_SEL	2	/* notyet */#define	LUCODE_SEL	3#define	LUDATA_SEL	4/* seperate stack, es,fs,gs sels ? *//* #define	LPOSIXCALLS_SEL	5	/* notyet */struct	i386tss	tss, panic_tss;extern  struct user *proc0paddr;/* software prototypes -- in more palitable form */struct soft_segment_descriptor gdt_segs[] = {	/* Null Descriptor */{	0x0,			/* segment base address  */	0x0,			/* length - all address space */	0,			/* segment type */	0,			/* segment descriptor priority level */	0,			/* segment descriptor present */	0,0,	0,			/* default 32 vs 16 bit size */	0  			/* limit granularity (byte/page units)*/ },	/* Code Descriptor for kernel */{	0x0,			/* segment base address  */	0xfffff,		/* length - all address space */	SDT_MEMERA,		/* segment type */	0,			/* segment descriptor priority level */	1,			/* segment descriptor present */	0,0,	1,			/* default 32 vs 16 bit size */	1  			/* limit granularity (byte/page units)*/ },	/* Data Descriptor for kernel */{	0x0,			/* segment base address  */	0xfffff,		/* length - all address space */	SDT_MEMRWA,		/* segment type */	0,			/* segment descriptor priority level */	1,			/* segment descriptor present */	0,0,	1,			/* default 32 vs 16 bit size */	1  			/* limit granularity (byte/page units)*/ },	/* LDT Descriptor */{	(int) ldt,			/* segment base address  */	sizeof(ldt)-1,		/* length - all address space */	SDT_SYSLDT,		/* segment type */	0,			/* segment descriptor priority level */	1,			/* segment descriptor present */	0,0,	0,			/* unused - default 32 vs 16 bit size */	0  			/* limit granularity (byte/page units)*/ },	/* Null Descriptor - Placeholder */{	0x0,			/* segment base address  */	0x0,			/* length - all address space */	0,			/* segment type */	0,			/* segment descriptor priority level */	0,			/* segment descriptor present */	0,0,	0,			/* default 32 vs 16 bit size */	0  			/* limit granularity (byte/page units)*/ },	/* Panic Tss Descriptor */{	(int) &panic_tss,		/* segment base address  */	sizeof(tss)-1,		/* length - all address space */	SDT_SYS386TSS,		/* segment type */	0,			/* segment descriptor priority level */	1,			/* segment descriptor present */	0,0,	0,			/* unused - default 32 vs 16 bit size */	0  			/* limit granularity (byte/page units)*/ },	/* Proc 0 Tss Descriptor */{	(int) kstack,			/* segment base address  */	sizeof(tss)-1,		/* length - all address space */	SDT_SYS386TSS,		/* segment type */	0,			/* segment descriptor priority level */	1,			/* segment descriptor present */	0,0,	0,			/* unused - default 32 vs 16 bit size */	0  			/* limit granularity (byte/page units)*/ }};struct soft_segment_descriptor ldt_segs[] = {	/* Null Descriptor - overwritten by call gate */{	0x0,			/* segment base address  */	0x0,			/* length - all address space */	0,			/* segment type */	0,			/* segment descriptor priority level */	0,			/* segment descriptor present */	0,0,	0,			/* default 32 vs 16 bit size */	0  			/* limit granularity (byte/page units)*/ },	/* Null Descriptor - overwritten by call gate */{	0x0,			/* segment base address  */	0x0,			/* length - all address space */	0,			/* segment type */	0,			/* segment descriptor priority level */	0,			/* segment descriptor present */	0,0,	0,			/* default 32 vs 16 bit size */	0  			/* limit granularity (byte/page units)*/ },	/* Null Descriptor - overwritten by call gate */{	0x0,			/* segment base address  */	0x0,			/* length - all address space */	0,			/* segment type */	0,			/* segment descriptor priority level */	0,			/* segment descriptor present */	0,0,	0,			/* default 32 vs 16 bit size */	0  			/* limit granularity (byte/page units)*/ },	/* Code Descriptor for user */{	0x0,			/* segment base address  */	0xfffff,		/* length - all address space */	SDT_MEMERA,		/* segment type */	SEL_UPL,		/* segment descriptor priority level */	1,			/* segment descriptor present */	0,0,	1,			/* default 32 vs 16 bit size */	1  			/* limit granularity (byte/page units)*/ },	/* Data Descriptor for user */{	0x0,			/* segment base address  */	0xfffff,		/* length - all address space */	SDT_MEMRWA,		/* segment type */	SEL_UPL,		/* segment descriptor priority level */	1,			/* segment descriptor present */	0,0,	1,			/* default 32 vs 16 bit size */	1  			/* limit granularity (byte/page units)*/ } };/* table descriptors - used to load tables by microp */struct region_descriptor r_gdt = {	sizeof(gdt)-1,(char *)gdt};struct region_descriptor r_idt = {	sizeof(idt)-1,(char *)idt};setidt(idx, func, typ, dpl) char *func; {	struct gate_descriptor *ip = idt + idx;	ip->gd_looffset = (int)func;	ip->gd_selector = 8;	ip->gd_stkcpy = 0;	ip->gd_xx = 0;	ip->gd_type = typ;	ip->gd_dpl = dpl;	ip->gd_p = 1;	ip->gd_hioffset = ((int)func)>>16 ;}#define	IDTVEC(name)	__CONCAT(X, name)extern	IDTVEC(div), IDTVEC(dbg), IDTVEC(nmi), IDTVEC(bpt), IDTVEC(ofl),	IDTVEC(bnd), IDTVEC(ill), IDTVEC(dna), IDTVEC(dble), IDTVEC(fpusegm),	IDTVEC(tss), IDTVEC(missing), IDTVEC(stk), IDTVEC(prot),	IDTVEC(page), IDTVEC(rsvd), IDTVEC(fpu), IDTVEC(rsvd0),	IDTVEC(rsvd1), IDTVEC(rsvd2), IDTVEC(rsvd3), IDTVEC(rsvd4),	IDTVEC(rsvd5), IDTVEC(rsvd6), IDTVEC(rsvd7), IDTVEC(rsvd8),	IDTVEC(rsvd9), IDTVEC(rsvd10), IDTVEC(rsvd11), IDTVEC(rsvd12),	IDTVEC(rsvd13), IDTVEC(rsvd14), IDTVEC(rsvd14), IDTVEC(syscall);int lcr0(), lcr3(), rcr0(), rcr2();int _udatasel, _ucodesel, _gsel_tss;init386(first) { extern ssdtosd(), lgdt(), lidt(), lldt(), etext; 	int x, *pi;	unsigned biosbasemem, biosextmem;	struct gate_descriptor *gdp;	extern int sigcode,szsigcode;	proc0.p_addr = proc0paddr;	/*	 * Initialize the console before we print anything out.	 */	cninit (KERNBASE+0xa0000);	/* make gdt memory segments */	gdt_segs[GCODE_SEL].ssd_limit = btoc((int) &etext + NBPG);	for (x=0; x < NGDT; x++) ssdtosd(gdt_segs+x, gdt+x);	/* make ldt memory segments */	ldt_segs[LUCODE_SEL].ssd_limit = btoc(UPT_MIN_ADDRESS);	ldt_segs[LUDATA_SEL].ssd_limit = btoc(UPT_MIN_ADDRESS);	/* Note. eventually want private ldts per process */	for (x=0; x < 5; x++) ssdtosd(ldt_segs+x, ldt+x);	/* exceptions */	setidt(0, &IDTVEC(div),  SDT_SYS386TGT, SEL_KPL);	setidt(1, &IDTVEC(dbg),  SDT_SYS386TGT, SEL_KPL);	setidt(2, &IDTVEC(nmi),  SDT_SYS386TGT, SEL_KPL); 	setidt(3, &IDTVEC(bpt),  SDT_SYS386TGT, SEL_UPL);	setidt(4, &IDTVEC(ofl),  SDT_SYS386TGT, SEL_KPL);	setidt(5, &IDTVEC(bnd),  SDT_SYS386TGT, SEL_KPL);	setidt(6, &IDTVEC(ill),  SDT_SYS386TGT, SEL_KPL);	setidt(7, &IDTVEC(dna),  SDT_SYS386TGT, SEL_KPL);	setidt(8, &IDTVEC(dble),  SDT_SYS386TGT, SEL_KPL);	setidt(9, &IDTVEC(fpusegm),  SDT_SYS386TGT, SEL_KPL);	setidt(10, &IDTVEC(tss),  SDT_SYS386TGT, SEL_KPL);	setidt(11, &IDTVEC(missing),  SDT_SYS386TGT, SEL_KPL);	setidt(12, &IDTVEC(stk),  SDT_SYS386TGT, SEL_KPL);	setidt(13, &IDTVEC(prot),  SDT_SYS386TGT, SEL_KPL);	setidt(14, &IDTVEC(page),  SDT_SYS386TGT, SEL_KPL);	setidt(15, &IDTVEC(rsvd),  SDT_SYS386TGT, SEL_KPL);	setidt(16, &IDTVEC(fpu),  SDT_SYS386TGT, SEL_KPL);	setidt(17, &IDTVEC(rsvd0),  SDT_SYS386TGT, SEL_KPL);	setidt(18, &IDTVEC(rsvd1),  SDT_SYS386TGT, SEL_KPL);	setidt(19, &IDTVEC(rsvd2),  SDT_SYS386TGT, SEL_KPL);	setidt(20, &IDTVEC(rsvd3),  SDT_SYS386TGT, SEL_KPL);	setidt(21, &IDTVEC(rsvd4),  SDT_SYS386TGT, SEL_KPL);	setidt(22, &IDTVEC(rsvd5),  SDT_SYS386TGT, SEL_KPL);	setidt(23, &IDTVEC(rsvd6),  SDT_SYS386TGT, SEL_KPL);	setidt(24, &IDTVEC(rsvd7),  SDT_SYS386TGT, SEL_KPL);	setidt(25, &IDTVEC(rsvd8),  SDT_SYS386TGT, SEL_KPL);	setidt(26, &IDTVEC(rsvd9),  SDT_SYS386TGT, SEL_KPL);	setidt(27, &IDTVEC(rsvd10),  SDT_SYS386TGT, SEL_KPL);	setidt(28, &IDTVEC(rsvd11),  SDT_SYS386TGT, SEL_KPL);	setidt(29, &IDTVEC(rsvd12),  SDT_SYS386TGT, SEL_KPL);	setidt(30, &IDTVEC(rsvd13),  SDT_SYS386TGT, SEL_KPL);	setidt(31, &IDTVEC(rsvd14),  SDT_SYS386TGT, SEL_KPL);#include "isa.h"#if	NISA >0	isa_defaultirq();#endif	lgdt(gdt, sizeof(gdt)-1);	lidt(idt, sizeof(idt)-1);	lldt(GSEL(GLDT_SEL, SEL_KPL));	/*	 * This memory size stuff is a real mess.  Here is a simple	 * setup that just believes the BIOS.  After the rest of	 * the system is a little more stable, we'll come back to	 * this and deal with issues if incorrect BIOS information,	 * and when physical memory is > 16 megabytes.	 */	biosbasemem = rtcin(RTC_BASELO)+ (rtcin(RTC_BASEHI)<<8);	biosextmem = rtcin(RTC_EXTLO)+ (rtcin(RTC_EXTHI)<<8);	Maxmem = btoc ((biosextmem + 1024) * 1024);	maxmem = Maxmem - 1;	physmem = btoc (biosbasemem * 1024 + (biosextmem - 1) * 1024);	printf ("bios %dK+%dK. maxmem %x, physmem %x\n",		biosbasemem, biosextmem, ctob (maxmem), ctob (physmem));	vm_set_page_size();	/* call pmap initialization to make new kernel address space */	pmap_bootstrap (first, 0);	/* now running on new page tables, configured,and u/iom is accessible */	/* make a initial tss so microp can get interrupt stack on syscall! */	proc0.p_addr->u_pcb.pcb_tss.tss_esp0 = (int) kstack + UPAGES*NBPG;	proc0.p_addr->u_pcb.pcb_tss.tss_ss0 = GSEL(GDATA_SEL, SEL_KPL) ;	_gsel_tss = GSEL(GPROC0_SEL, SEL_KPL);	ltr(_gsel_tss);	/* make a call gate to reenter kernel with */	gdp = &ldt[LSYS5CALLS_SEL].gd;		x = (int) &IDTVEC(syscall);	gdp->gd_looffset = x++;	gdp->gd_selector = GSEL(GCODE_SEL,SEL_KPL);	gdp->gd_stkcpy = 0;	gdp->gd_type = SDT_SYS386CGT;	gdp->gd_dpl = SEL_UPL;	gdp->gd_p = 1;	gdp->gd_hioffset = ((int) &IDTVEC(syscall)) >>16;	/* transfer to user mode */	_ucodesel = LSEL(LUCODE_SEL, SEL_UPL);	_udatasel = LSEL(LUDATA_SEL, SEL_UPL);	/* setup proc 0's pcb */	bcopy(&sigcode, proc0.p_addr->u_pcb.pcb_sigc, szsigcode);	proc0.p_addr->u_pcb.pcb_flags = 0;	proc0.p_addr->u_pcb.pcb_ptd = IdlePTD;}extern struct pte	*CMAP1, *CMAP2;extern caddr_t		CADDR1, CADDR2;/* * zero out physical memory * specified in relocation units (NBPG bytes) */clearseg(n) {	*(int *)CMAP2 = PG_V | PG_KW | ctob(n);	load_cr3(rcr3());	bzero(CADDR2,NBPG);	*(int *) CADDR2 = 0;}/* * copy a page of physical memory * specified in relocation units (NBPG bytes) */copyseg(frm, n) {	*(int *)CMAP2 = PG_V | PG_KW | ctob(n);	load_cr3(rcr3());	bcopy((void *)frm, (void *)CADDR2, NBPG);}/* * copy a page of physical memory * specified in relocation units (NBPG bytes) */physcopyseg(frm, to) {	*(int *)CMAP1 = PG_V | PG_KW | ctob(frm);	*(int *)CMAP2 = PG_V | PG_KW | ctob(to);	load_cr3(rcr3());	bcopy(CADDR1, CADDR2, NBPG);}/*aston() {	schednetisr(NETISR_AST);}*/setsoftclock() {	schednetisr(NETISR_SCLK);}/* * insert an element into a queue  */#undef insque_insque(element, head)	register struct prochd *element, *head;{	element->ph_link = head->ph_link;	head->ph_link = (struct proc *)element;	element->ph_rlink = (struct proc *)head;	((struct prochd *)(element->ph_link))->ph_rlink=(struct proc *)element;}/* * remove an element from a queue */#undef remque_remque(element)	register struct prochd *element;{	((struct prochd *)(element->ph_link))->ph_rlink = element->ph_rlink;	((struct prochd *)(element->ph_rlink))->ph_link = element->ph_link;	element->ph_rlink = (struct proc *)0;}vmunaccess() {}/* * Below written in C to allow access to debugging code */copyinstr(fromaddr, toaddr, maxlength, lencopied) u_int *lencopied, maxlength;	void *toaddr, *fromaddr; {	int c,tally;	tally = 0;	while (maxlength--) {		c = fubyte(fromaddr++);		if (c == -1) {			if(lencopied) *lencopied = tally;			return(EFAULT);		}		tally++;		*(char *)toaddr++ = (char) c;		if (c == 0){			if(lencopied) *lencopied = tally;			return(0);		}	}	if(lencopied) *lencopied = tally;	return(ENAMETOOLONG);}copyoutstr(fromaddr, toaddr, maxlength, lencopied) u_int *lencopied, maxlength;	void *fromaddr, *toaddr; {	int c;	int tally;	tally = 0;	while (maxlength--) {		c = subyte(toaddr++, *(char *)fromaddr);		if (c == -1) return(EFAULT);		tally++;		if (*(char *)fromaddr++ == 0){			if(lencopied) *lencopied = tally;			return(0);		}	}	if(lencopied) *lencopied = tally;	return(ENAMETOOLONG);}copystr(fromaddr, toaddr, maxlength, lencopied) u_int *lencopied, maxlength;	void *fromaddr, *toaddr; {	u_int tally;	tally = 0;	while (maxlength--) {		*(u_char *)toaddr = *(u_char *)fromaddr++;		tally++;		if (*(u_char *)toaddr++ == 0) {			if(lencopied) *lencopied = tally;			return(0);		}	}	if(lencopied) *lencopied = tally;	return(ENAMETOOLONG);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -