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

📄 sun.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
    register Optab *o;    o = &optab[0];    while (o->mask != 0 and (inst&o->mask) != o->match) {	++o;    }    return o;}private Address printop(addr)Address addr;{    Optab *o;    short inst;    printf("%08x  ", addr);    iread(&inst, addr, sizeof(inst));    o = decode(inst, addr);    if (o->mask == 0) {	printf("\tbadop");	instaddr = addr + sizeof(inst);    } else {	printing = true;	following = false;	instaddr = addr + sizeof(inst);	(*o->opfun)(inst, o->farg);	printing = false;    }    printf("\n");    return instaddr;}/* * Quickly find the return address of the current procedure or function * while single stepping.  Just get the word pointed at by sp. */private Address currtnaddr (){    Address retaddr;    dread(&retaddr, reg(STKP), sizeof(retaddr));    return retaddr;}/* * Print out the effective address for the given parameters. */private printea(mode, reg, size)long mode, reg;int size;{    long index, disp;    static char *aregs[] = { "a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp" };    Byte b;    short w;    long l;    switch ((int)(mode)) {	case 0:	    if (printing) {		printf("d%D", reg);	    }	    break;	case 1:	    if (printing) {		printf("%s", aregs[reg]);	    }	    break;	case 2:	    if (printing) {		printf("%s@", aregs[reg]);	    }	    break;	case 3:	    if (printing) {		printf("%s@+", aregs[reg]);	    }	    break;	case 4:	    if (printing) {		printf("%s@-", aregs[reg]);	    }	    break;	case 5:	    instread(w);	    if (printing) {		printf("%s@(%D)", aregs[reg], w);	    }	    break;	case 6:	    instread(w);	    if (printing) {		index = w;		disp = (char)(index&0377);		printf("%s@(%d,%c%D:%c)", aregs[reg], disp,		    (index&0100000)?'a':'d',(index>>12)&07,		    (index&04000)?'l':'w');	    }	    break;	case 7:	    switch ((int)(reg)) {		case 0:		    instread(w);		    if (printing) {			index = w;			psymoff(index);		    }		    break;		case 1:		    instread(l);		    if (printing) {			index = l;			psymoff(index);		    }		    break;		case 2:			    instread(w);		    if (printing) {			disp = w;			psymoff(disp + instaddr);		    }		    break;		case 3:		    instread(w);		    if (printing) {			index = w;			disp = (char)(index&0377);			printf("pc@(%D,%c%D:%c)", disp,			    (index&0100000)?'a':'d',(index>>12)&07,			    (index&04000)?'l':'w');		    }		    break;		case 4:		    switch (size) {			case sizeof(b):			    instread(w);			    index = (w&0xff);			    break;			case sizeof(w):			    instread(w);			    index = w;			    break;			case sizeof(l):			    instread(l);			    index = l;			    break;			default:			    if (printing) {			    	printf("unexpected size %d in printea\n", size);			    }			    instread(l);			    index = l;			    break;		    }		    if (printing) {			printf(IMDF, index);		    }		    break;		default:		    if (printing) {			printf("???");		    }		    break;	    }	    break;	default:	    if (printing) {		printf("???");	    }	    break;    }}private printEA(ea, size)long ea;int size;{    printea((ea>>3)&07, ea&07, size);}private mapsize(inst)register long inst;{    int m;    inst >>= 6;    inst &= 03;    switch (inst) {	case 0:	    m = 1;	    break;	case 1:	    m = 2;	    break;	case 2:	    m = 4;	    break;	default:	    m = -1;	    break;    }    return m;}private char suffix(size)int size;{    char c;    switch (size) {	case 1:	    c = 'b';	    break;	case 2:	    c = 'w';	    break;	case 4:	    c = 'l';	    break;	default:	    panic("bad size %d in suffix", size);    }    return c;}/* * Print an address offset.  Eventually this should attempt to be symbolic, * but for now its just printed in hex. */private psymoff (off)Word off;{    Symbol f;    f = whatblock((Address) (off + FUNCOFFSET));    if (codeloc(f) == off + FUNCOFFSET) {	printf("%s", symname(f));    } else {	printf("0x%x", off);    }}/* * Instruction class specific routines. */public omove(inst, s)long inst;String s;{    register int c;    int size;    c = s[0];    if (printing) {	printf("\tmov%c\t", c);    }    size = ((c == 'b') ? 1 : (c == 'w') ? 2 : 4);    printea((inst>>3)&07, inst&07, size);    if (printing) {	printf(",");    }    printea((inst>>6)&07, (inst>>9)&07, size);}/*  * Two types: bsr (4 bytes) and bsrs (2 bytes) */public obranch(inst, dummy)long inst;{    long disp;    String s;     short w;    Address startingaddr;	/* address of branch instruction */    int branchtype;		/* type of branch (0 = unconditional) */    Address dest;    Address retaddr;		/* for bsr instruction */    startingaddr = instaddr - 2;    disp = inst&0377;    s = "s ";    if (disp == 0) {	retaddr = startingaddr + 4;    } else {	retaddr = startingaddr + 2;    }    if (disp > 127) {	disp |= ~0377;    } else if (disp == 0){	s = " ";	instread(w);	disp = w;    }    branchtype = (int)((inst>>8)&017);    dest = startingaddr + 2 + disp;    if (printing) {	printf("\tb%s%s\t", bname[branchtype], s);	psymoff(dest);    }    if (following) {	/*	 * If we're to follow the dynamic flow of instructions,	 * we must see where the branch leads.  A branchtype of 0	 * indicates an unconditional branch which we simply take	 * as the new instruction address.  For a conditional branch,	 * we continue execution up to the current address, single step,	 * and keep going.	 */	if (branchtype == 0) {	    instaddr = dest;	} else if (branchtype == 01) {		/* bsr */	    if (followcalls) {		steppast(startingaddr);		curfunc = whatblock(pc, true);		if (not isbperr()) {		    printstatus();		    /* NOTREACHED */		}		bpact();		if (nosource(curfunc) and canskip(curfunc) and		  nlhdr.nlines != 0) {		    stepto(retaddr);		    instaddr = pc;		    bpact();		} else {		    callnews(/* iscall = */ true);		}	    }	} else {	    steppast(startingaddr);	}    }}public odbcc(inst, form)long inst;String form;{    long disp;    short w;    instread(w);    if (printing) {    	printf(form, dbname[(int)((inst>>8)&017)], inst&07);	psymoff(w + sizeof(w));    }}public oscc(inst, dummy)long inst;long dummy;{    if (printing) {	printf("\ts%s\t", cname[(int)((inst>>8)&017)]);    }    printea((inst>>3)&07, inst&07, 1);}public biti(inst, dummy)long inst;long dummy;{    short w;    if (printing) {	printf("\t%s\t", bit[(int)((inst>>6)&03)]);    }    if (inst&0x0100) {	if (printing) {	    printf("d%D,", inst>>9);	}    } else {	instread(w);	if (printing) {	    printf(IMDF, w);	    printf(",");	}    }    printEA(inst);}public opmode(inst, opcode)long inst;long opcode;{    register int opmode;    register int reg;    int size;    opmode = (int)((inst>>6) & 07);    reg = (int)((inst>>9) & 07);    if (opmode == 0 or opmode == 4) {	size = 1;    } else if (opmode == 1 or opmode == 3 or opmode == 5) {	size = 2;    } else {	size = 4;    }    if (printing) {	printf("\t%s%c\t", opcode, suffix(size));    }    if (opmode >= 4 and opmode <= 6) {	if (printing) {	    printf("d%d,", reg);	}	printea((inst>>3)&07, inst&07, size);    } else {	printea((inst>>3)&07, inst&07, size);	if (printing) {	    printf(",%c%d",(opmode<=2) ? 'd' : 'a', reg);	}    }}public shroi(inst, ds)long inst;String ds;{    int rx, ry;    String opcode;    if ((inst & 0xC0) == 0xC0) {	opcode = shro[(int)((inst>>9)&03)];	if (printing) {	    printf("\t%s%s\t", opcode, ds);	}	printEA(inst);    } else {	if (printing) {	    opcode = shro[(int)((inst>>3)&03)];	    printf("\t%s%s%c\t", opcode, ds, suffix(mapsize(inst)));	    rx = (int)((inst>>9)&07); ry = (int)(inst&07);	    if ((inst>>5)&01) {		printf("d%d,d%d", rx, ry);	    } else {		printf(IMDF, (rx ? rx : 8));		printf(",d%d", ry);	    }	}    }}		public oimmed(inst, opcode)long inst;register String opcode;{    register int size;    long const;    short w;    size = mapsize(inst);    if (size > 0) {	if (size == 4) {	    instread(const);	} else {	    instread(w);	    const = w;	}	if (printing) {	    printf("\t%s%c\t", opcode, suffix(size));	    printf(IMDF, const);	    printf(",");	}	printEA(inst, size);    } else {	if (printing) {	    printf("\tbadop");	}    }}public oreg(inst, opcode)long inst;register String opcode;{    if (printing) {	printf(opcode, (inst & 07));    }}public extend(inst, opcode)long inst;String opcode;{    register int size;    int ry, rx;    char c;    if (printing) {	size = mapsize(inst);	ry = (inst&07);	rx = ((inst>>9)&07);	c = ((inst & 0x1000) ? suffix(size) : ' ');	printf("\t%s%c\t", opcode, c);	if (opcode[0] == 'e') {	    if (inst & 0x0080) {		printf("d%D,a%D", rx, ry);	    } else if (inst & 0x0008) {		printf("a%D,a%D", rx, ry);	    } else {		printf("d%D,d%D", rx, ry);	    }	} else if ((inst & 0xF000) == 0xB000) {	    printf("a%D@+,a%D@+", ry, rx);	} else if (inst & 0x8) {	    printf("a%D@-,a%D@-", ry, rx);	} else {	    printf("d%D,d%D", ry, rx);	}    }}public olink(inst, dummy)long inst;long dummy;{    short w;    instread(w);    if (printing) {	printf("\tlink\ta%D,", inst&07);	printf(IMDF, w);    }}public otrap(inst, dummy)long inst;{    if (printing) {	printf("\ttrap\t");	printf(IMDF, inst&017);    }}public oneop(inst, opcode)long inst;register String opcode;{    if (printing) {	printf("\t%s",opcode);    }    printEA(inst);}public jsrop(inst, opcode)long inst;register String opcode;{    Address startingaddr;	/* beginning of jsr instruction */    Address retaddr; /* can't call return_addr (frame not set up yet) */    startingaddr = instaddr - 2;    switch ((inst >> 3) & 07) {	case 2:	    retaddr = instaddr;		/* two byte instruction */	    break;	case 5:	case 6:	    retaddr = instaddr + 2;	/* four byte instruction */	    break;	case 7:	default:	    switch (inst & 07) {		case 0:		case 2:		case 3:		    retaddr = instaddr + 2;		    break;		case 1:		default:		    retaddr = instaddr + 4;	/* six byte instruction */		    break;

⌨️ 快捷键说明

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