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

📄 u.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef lintstatic char *sccsid = "@(#)u.c	4.5	(ULTRIX)	4/11/91";#endif/************************************************************************ *									* *			Copyright (c) 1988 by				* *		Digital Equipment Corporation, Maynard, MA		* *			All rights reserved.				* *									* *   This software is furnished under a license and may be used and	* *   copied  only  in accordance with the terms of such license and	* *   with the  inclusion  of  the  above  copyright  notice.   This	* *   software  or  any  other copies thereof may not be provided or	* *   otherwise made available to any other person.  No title to and	* *   ownership of the software is hereby transferred.			* *									* *   This software is  derived  from  software  received  from  the	* *   University    of   California,   Berkeley,   and   from   Bell	* *   Laboratories.  Use, duplication, or disclosure is  subject  to	* *   restrictions  under  license  agreements  with  University  of	* *   California and with AT&T.						* *									* *   The information in this software is subject to change  without	* *   notice  and should not be construed as a commitment by Digital	* *   Equipment Corporation.						* *									* *   Digital assumes no responsibility for the use  or  reliability	* *   of its software on equipment which is not supplied by Digital.	* *									* ************************************************************************/#include	"crash.h"#include	<sys/proc.h>#include	<machine/pte.h>#include	<sys/cpudata.h>#include	<sys/vm.h>#include	<frame.h>#include	<stdio.h>#ifdef vax#define KERNELSTACK	(0x7fffffff)#endif vaxstruct uarea u;			/* external uarea buffer */char cmdbuf[CLSIZE*NBPG];	/* global command string buffer */int argaddr;			/* global vaddr of command space */prcpudata(option)	int option;{	struct cpudata cpudata;	int maxcpu;	int i;printf("CPU  ID State   Proc      PCB      Swtch    Syscall     Ints  Locks\n");/*      DDD DDD SSSSSSS  Shhhh 0x88888888 ddddddddd ddddddddd ddddddddd */	for(i=0;i<MAXCPU;i++) {		if (get_cpudata(&cpudata, i) == -1) 			continue;		printf("%3d %3d %s%s%s%s%s%s",cpudata.cpu_num,		       i,		       cpudata.cpu_state & CPU_RUN ? "R":" ",		       cpudata.cpu_state & CPU_TBI ? "T":" ",		       cpudata.cpu_state & CPU_PANIC ? "P":" ",		       cpudata.cpu_state & CPU_SOFT_DISABLE ? "D":" ",		       cpudata.cpu_state & CPU_BOOT ? "B":" ",		       cpudata.cpu_state & CPU_STOP ? "S":" ");#ifdef mips		printf("%s", cpudata.cpu_inisr == 1 ? "I":" ");#else		printf(" ");#endif		printf("  %s",cpudata.cpu_noproc ? "*" : " ");#ifdef mips		if (cpudata.cpu_noproc)			printf("%4d ",getindex((char *)cpudata.cpu_idleproc, procbuckets,					       PROCBUCKETS));		else		printf("%4d ",getindex((char *)cpudata.cpu_proc, procbuckets,		    PROCBUCKETS));#else		printf("%4d ",getindex((char *)cpudata.cpu_proc, procbuckets,		    PROCBUCKETS));#endif		printf("0x%8x ", cpudata.cpu_paddr);		printf("%9d %9d %9d ", cpudata.cpu_switch,		    cpudata.cpu_syscall,cpudata.cpu_intr);		if (cpudata.cpu_hlock) {			praddr(cpudata.cpu_hlock);			printf("\n");		} else			printf("None\n");		if (cpudata.cpu_panicstr) {			printf("panicstr: ");			prod(cpudata.cpu_panicstr, 1, "s");		}#ifdef DEBUG		printf(" stack 0x%x istack 0x%x\n",		       cpudata.cpu_stack, cpudata.cpu_istack);#endif						}}prlockhead() {printf("State   Lost       Spin      Won      avg spin  pcnt lost   Cost  Name\n");/*      SSS dddddddddd dddddddddd dddddddddd   xxx.xxx   xxx.xxx  xxx.xxx */}prlock(lp,mflg)struct lock_t *lp;int mflg; /* if =0, lock pointer is in local memory, =1 -> kernel memory */{	struct lock_t lock;	struct lock_trace trace;	float avg_spin, percent_lost;	if (mflg == 1) {		if (readmem((char *)&lock, (char *)lp, sizeof(struct lock_t))		    != sizeof(struct lock_t)) {			printf("couldn't find lock at 0x%x\n",lp);			return(1);		}	} else 		bcopy(lp, &lock, sizeof(struct lock_t));	if (lock.l_lock)		printf("*L*");	else		printf("   ");	printf(" %10d %10d %10d ",lock.l_lost, lock.l_spin, lock.l_won);	if (lock.l_lost != 0)		avg_spin = (float) lock.l_spin/(float)lock.l_lost;	else		avg_spin = 0;				if ((lock.l_lost+lock.l_won) != 0)		percent_lost = 100.0 * (float) lock.l_lost/			(float) (lock.l_lost + lock.l_won);	else		percent_lost = 0;	printf(" %6.1f %7.2f %7.1f ", avg_spin, percent_lost, 	       avg_spin*percent_lost);	if (mflg == 1)		praddr(lp);	printf("\n");}prlock_long(lp,mflg)struct lock_t *lp;int mflg; /* if =0, lock pointer is in local memory, =1 -> kernel memory */{	struct lock_t lock;	struct lock_trace trace;	struct Symbol *search();	int i;	if (mflg == 1) {		if (readmem((char *)&lock, (char *)lp, sizeof(struct lock_t))		    != sizeof(struct lock_t)) {			printf("couldn't find lock at 0x%x\n",lp);			return(1);		}	} else 		bcopy(lp, &lock, sizeof(struct lock_t));	printf("Lock - ");	if (mflg == 1)		praddr(lp);	else		printf("None");	printf("\n");	printf("\t Lock State: %s%s Type: %s  Pos %4d IPL: %4d\n",	       lock.l_wanted ? "W":" ",	       lock.l_lock ? "L" : " ",	       lock.l_type == LK_SPIN ? "spin" : lock.l_type == LK_WAIT ? "wait" : "UNKN",	       lock.l_hierpos, lock.l_ipl);	printf("\tplock: ");	if (lock.l_plock == NULL)		printf(" Null ");	else		printf("0x%8x",lock.l_plock);	printf(" lost %d spin %d won %d\n",	       lock.l_lost, lock.l_spin, lock.l_won);}prlcktrace(tp)	struct lock_trace *tp;{	struct Symbol *search();	printf("pid %6d  pc 0x%8x (", tp->tr_pid,tp->tr_pc);	prsym(search(tp->tr_pc), tp->tr_pc);	printf(") psl 0x%x lock 0x%8x ",tp->tr_psl,tp->tr_lock);	if (tp->tr_lock)		praddr(tp->tr_lock);	else		printf("None");	printf("\n");}prpcb (p)	int p;			/* proc slot number */{	struct pcb *pcb;	int i;	if (p < 0) return;	if (getuarea(p) == -1) {		printf ("process %d (slot %d): uarea not in core.\n", 		proctab[p].p_pid,p);		return;	}	pcb = &U.u_pcb;	printf("\n");	printf ("process %d (slot %d)\n",proctab[p].p_pid,p);	printf("\n");#ifdef vax	printf ("ksp:   %8x    ",pcb->pcb_ksp);	printf ("usp:   %8x    ",pcb->pcb_usp);	printf ("r0:    %8x\n",  pcb->pcb_r0);	printf ("r1:    %8x    ",pcb->pcb_r1);	printf ("r2:    %8x    ",pcb->pcb_r2);	printf ("r3:    %8x\n",  pcb->pcb_r3);	printf ("r4:    %8x    ",pcb->pcb_r4);	printf ("r5:    %8x    ",pcb->pcb_r5);	printf ("r6:    %8x\n",  pcb->pcb_r6);	printf ("r7:    %8x    ",pcb->pcb_r7);	printf ("r8:    %8x    ",pcb->pcb_r8);	printf ("r9:    %8x\n",  pcb->pcb_r9);	printf ("r10:   %8x    ",pcb->pcb_r10);	printf ("r11:   %8x    ",pcb->pcb_r11);	printf ("ap:    %8x\n",  pcb->pcb_r12);	printf ("fp:    %8x    ",pcb->pcb_r13);	printf ("pc:    %8x    ",pcb->pcb_pc);	printf ("psl:   %8x\n",  pcb->pcb_psl);	printf ("p0br:  %8x    ",(unsigned)pcb->pcb_p0br);	printf ("p0lr:  %8x    ",pcb->pcb_p0lr & 0x3fffff);	printf ("p1br:  %8x\n",  (unsigned)pcb->pcb_p1br);	printf ("p1lr:  %8x\n",  pcb->pcb_p1lr & 0x3fffff);#endif vax#ifdef mips	printf ("pc:    %8x    ",pcb->pcb_regs[10]);	printf ("sp:    %8x    ",pcb->pcb_regs[8]);	printf ("sr:    %8x\n",pcb->pcb_regs[11]);	for(i=0; i<12; i+=4) {		printf("r%2d  %8x r%2d  %8x r%2d  %8x r%2d  %8x \n",		       i,pcb->pcb_regs[i],i+1,pcb->pcb_regs[i+1],		       i+2,pcb->pcb_regs[i+2],i+3,pcb->pcb_regs[i+3]);	}#endif mips}pruarea (p)	int p;			/* proc slot number */{	int uresult;	struct ucred ucred;	char fflg;	char *pofile_of;	int *ofile_of, fp;	register i;	register struct nameidata *nd;	register int *ip;		uresult = getuarea(p);	if (uresult != -1) {		printf ("process %d (slot %d):",		    proctab[uresult].p_pid, uresult);				printf ("\n");		printf ("\n");	}	else {		printf (" uarea not in core.\n");		return;	}/* uarea printing code below is stolen from pstat */	nd  = &U.u_nd;	printf("procp\t%9.1x\n", U.u_procp);	printf("ar0\t%9.1x\n", U.u_ar0);	printf("comm\t %s\n", U.u_comm);	printf("arg");	for (i=0; i<sizeof(U.u_arg)/sizeof(U.u_arg[0]); i++) {		if (i%5==0) printf("\t");		printf("%9.1x", U.u_arg[i]);		if (i%5==4) printf("\n");	}	printf("\n");	printf("ap\t%9.1x\n", U.u_ap);	printf("qsave");	for (i=0; i<sizeof(label_t)/sizeof(int); i++) {		if (i%5==0) printf("\t");		printf("%9.1x", U.u_qsave.val[i]);		if (i%5==4) printf("\n");	}	printf("\n");	printf("error\t%9.1x\n", U.u_error);	printf("r_val?\t%9.1x %9.1x\n", U.u_r.r_val1, U.u_r.r_val2);	printf("eosys\t%9.1x\n", U.u_eosys);/* credentials is now km_alloc-ed -- have to go get them!!! - rr */	lseek(mem,sysvad(U.u_cred),0);	read(mem,(char *)&ucred,sizeof(struct ucred));	printf("\tref %d\n",ucred.cr_ref);	printf("\tuid\t%d\tgid\t%d\n",ucred.cr_uid,ucred.cr_gid);	printf("\truid\t%d\trgid\t%d\n",ucred.cr_ruid,ucred.cr_rgid);	printf("\tgroups\t");	for (i=0;i<NGROUPS;i++) {		if (ucred.cr_groups[i] == -1) continue;		printf("%d",ucred.cr_groups[i]);		if ((i==(NGROUPS/2 - 1))) printf("\n\t\t");		else if (i<NGROUPS-1) putchar(',');	}	printf("\n");/* end of new credentials code */	printf("u_ofile: (u_lastfile: %d)\n",U.u_lastfile);	if (U.u_of_count != 0) {		printf("u_ofile_of: 0x%8x u_pofile_of: 0x%8x\n",		       U.u_ofile_of,U.u_pofile_of);		ofile_of = (int *) malloc(U.u_of_count*					  sizeof(int));		pofile_of = (char *) 			malloc(U.u_of_count);				if (readmem((char *)ofile_of, (int)U.u_ofile_of, 			    U.u_of_count*sizeof(int)) !=		    U.u_of_count*sizeof(int)) {			printf(" read error on fd overflow area\n");			return;		}		if (readmem((char *)pofile_of, (int)U.u_pofile_of, 			    U.u_of_count) !=		    U.u_of_count) {			printf(" read error on fd overflow area\n");			return;		}	}	for (i = 0; i <= U.u_omax; ++i) {		if (i > NOFILE_IN_U) {			fp = (int) ofile_of [i - NOFILE_IN_U];			fflg = pofile_of [i - NOFILE_IN_U];		} else {			fp = (int)U.u_ofile[i];

⌨️ 快捷键说明

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