1*48101Sbostic /*- 2*48101Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48101Sbostic * All rights reserved. 4*48101Sbostic * 5*48101Sbostic * %sccs.include.redist.c% 622367Sdist */ 75485Slinton 822367Sdist #ifndef lint 9*48101Sbostic static char sccsid[] = "@(#)printinst.c 5.3 (Berkeley) 04/16/91"; 10*48101Sbostic #endif /* not lint */ 11*48101Sbostic 125485Slinton /* 135485Slinton * decode and print the instructions 145485Slinton */ 155485Slinton 165485Slinton #include "defs.h" 175485Slinton #include "machine.h" 185485Slinton #include "process.h" 195485Slinton #include "pxops.h" 205485Slinton #include "optab.h" 215485Slinton #include "object.h" 2230845Smckusick #include "process/process.rep" 2330845Smckusick #include "process/pxinfo.h" 245485Slinton 255485Slinton LOCAL ADDRESS printop(), docase(); 265485Slinton 275485Slinton /* 285485Slinton * print instructions within the given address range 295485Slinton */ 305485Slinton 315485Slinton printinst(lowaddr, highaddr) 325485Slinton ADDRESS lowaddr; 335485Slinton ADDRESS highaddr; 345485Slinton { 355743Slinton register ADDRESS addr; 365485Slinton 375743Slinton for (addr = lowaddr; addr <= highaddr; ) { 385743Slinton addr = printop(addr); 395743Slinton } 405485Slinton } 415485Slinton 425485Slinton /* 435485Slinton * print the opcode at the given address, return the address 445485Slinton * of the next instruction 455485Slinton */ 465485Slinton 475485Slinton LOCAL ADDRESS printop(addr) 485485Slinton register ADDRESS addr; 495485Slinton { 505743Slinton int i; 515743Slinton PXOP op; 525743Slinton OPTAB *o; 535743Slinton char subop; 545743Slinton short arg; 555743Slinton long longarg; 565743Slinton union { 575743Slinton short i; 585743Slinton struct { char c1, c2; } opword; 595743Slinton } u; 605485Slinton 615743Slinton iread(&u.i, addr, sizeof(u.i)); 625743Slinton op = (PXOP) u.opword.c1; 635743Slinton subop = u.opword.c2; 645743Slinton o = &optab[op]; 655743Slinton printf("%5d %s", addr, o->opname); 665743Slinton addr += sizeof(u); 675743Slinton for (i = 0; o->argtype[i] != 0; i++) { 685743Slinton if (i == 0) { 695743Slinton putchar('\t'); 705743Slinton } else { 715743Slinton putchar(','); 725743Slinton } 735743Slinton switch(o->argtype[i]) { 745743Slinton case ADDR4: 755743Slinton case LWORD: 7630845Smckusick #ifdef tahoe 7730845Smckusick addr = (ADDRESS)(((int)addr + 3) & ~3); 7830845Smckusick #endif 795743Slinton iread(&longarg, addr, sizeof(longarg)); 805743Slinton printf("%d", longarg); 815743Slinton addr += sizeof(long); 825743Slinton break; 835743Slinton 845743Slinton case SUBOP: 855743Slinton printf("%d", subop); 865743Slinton break; 875743Slinton 885743Slinton case ADDR2: 895743Slinton case DISP: 905743Slinton case PSUBOP: 915743Slinton case VLEN: 925743Slinton case HWORD: 935743Slinton if (i != 0 || subop == 0) { 945743Slinton iread(&arg, addr, sizeof(arg)); 955743Slinton addr += sizeof(short); 965485Slinton } else { 975743Slinton arg = subop; 985485Slinton } 995743Slinton printf("%d", arg); 1005743Slinton break; 1015485Slinton 1025743Slinton case STRING: { 1035743Slinton char c; 1045485Slinton 1055743Slinton putchar('\''); 1065743Slinton while (subop > 0) { 1075743Slinton iread(&c, addr, sizeof(c)); 1085743Slinton if (c == '\0') { 1095743Slinton break; 1105743Slinton } 1115743Slinton putchar(c); 1125743Slinton subop--; 1135743Slinton addr++; 1145743Slinton } 1155743Slinton addr++; 1165743Slinton putchar('\''); 11730845Smckusick #ifdef tahoe 11830845Smckusick addr = (ADDRESS)(((int)addr + 3) & ~3); 11930845Smckusick #else 1205743Slinton if ((addr&1) != 0) { 1215743Slinton addr++; 1225743Slinton } 12330845Smckusick #endif 1245743Slinton break; 1255743Slinton } 1265485Slinton 1275743Slinton default: 1285743Slinton panic("bad argtype %d", o->argtype[i]); 1295743Slinton /*NOTREACHED*/ 1305743Slinton } 1315743Slinton } 1325743Slinton switch(op) { 1335743Slinton case O_CON: 1345743Slinton addr += arg; 13530845Smckusick #ifdef tahoe 13630845Smckusick addr = (ADDRESS)(((int)addr + 3) & ~3); 13730845Smckusick #endif 1385743Slinton break; 1395485Slinton 1405743Slinton case O_CASE1OP: 1415743Slinton addr = docase(addr, 1, subop); 1425743Slinton break; 1435485Slinton 1445743Slinton case O_CASE2OP: 1455743Slinton addr = docase(addr, 2, subop); 1465743Slinton break; 1475485Slinton 1485743Slinton case O_CASE4OP: 1495743Slinton addr = docase(addr, 4, subop); 1505743Slinton break; 1515743Slinton } 1525743Slinton putchar('\n'); 1535743Slinton return(addr); 1545485Slinton } 1555485Slinton 1565485Slinton /* 1575485Slinton * print out the destinations and cases 1585485Slinton */ 1595485Slinton 1605485Slinton LOCAL ADDRESS docase(addr, size, n) 1615485Slinton ADDRESS addr; 1625485Slinton int size; 1635485Slinton int n; 1645485Slinton { 1655743Slinton register int i; 1665743Slinton char c; 1675743Slinton short arg; 1685743Slinton long longarg; 1695485Slinton 1705743Slinton iread(&arg, addr, sizeof(arg)); 1715743Slinton printf("\n\t%5d", arg); 1725743Slinton addr += 2; 1735743Slinton for (i = 1; i < n; i++) { 1745485Slinton iread(&arg, addr, sizeof(arg)); 1755743Slinton printf(", %5d", arg); 1765485Slinton addr += 2; 1775743Slinton } 1785743Slinton printf("\n\t"); 1795743Slinton for (i = 0; i < n; i++) { 1805743Slinton switch(size) { 1815743Slinton case 1: 1825743Slinton iread(&c, addr, sizeof(c)); 1835743Slinton printf("%5d", c); 1845743Slinton break; 1855743Slinton 1865743Slinton case 2: 1875485Slinton iread(&arg, addr, sizeof(arg)); 1885743Slinton printf("%5d", arg); 1895743Slinton break; 1905485Slinton 1915743Slinton case 4: 19230845Smckusick #ifdef tahoe 19330845Smckusick addr = (ADDRESS)(((int)addr + 3) & ~3); 19430845Smckusick #endif 1955743Slinton iread(&longarg, addr, sizeof(longarg)); 1965743Slinton printf("%5d", longarg); 1975743Slinton break; 1985485Slinton } 1995743Slinton addr += size; 2005743Slinton if (i < n - 1) { 2015743Slinton printf(", "); 2025485Slinton } 2035743Slinton } 20430845Smckusick #ifdef tahoe 20530845Smckusick addr = (ADDRESS)(((int)addr + 3) & ~3); 20630845Smckusick #else 2075743Slinton if ((addr&01) == 01) { 2085743Slinton addr++; 2095743Slinton } 21030845Smckusick #endif 2115743Slinton return(addr); 2125485Slinton } 213