Annotation of 43BSDReno/contrib/emacs-18.55/gdb/gld-pinsn.c, revision 1.1.1.1

1.1       root        1: /* Print GOULD RISC instructions for GDB, the GNU debugger.
                      2:    Copyright (C) 1986, 1987 Free Software Foundation, Inc.
                      3: 
                      4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY
                      5: WARRANTY.  No author or distributor accepts responsibility to anyone
                      6: for the consequences of using it or for whether it serves any
                      7: particular purpose or works at all, unless he says so in writing.
                      8: Refer to the GDB General Public License for full details.
                      9: 
                     10: Everyone is granted permission to copy, modify and redistribute GDB,
                     11: but only under the conditions described in the GDB General Public
                     12: License.  A copy of this license is supposed to have been given to you
                     13: along with GDB so you can know your rights and responsibilities.  It
                     14: should be in a file named COPYING.  Among other things, the copyright
                     15: notice and this notice must be preserved on all copies.
                     16: 
                     17: In other words, go ahead and share GDB, but don't try to stop
                     18: anyone else from sharing it farther.  Help stamp out software hoarding!
                     19: */
                     20: 
                     21: #include <stdio.h>
                     22: #include <a.out.h>
                     23: 
                     24: #include "defs.h"
                     25: #include "param.h"
                     26: #include "symtab.h"
                     27: #include "frame.h"
                     28: #include "opcode.h"
                     29: 
                     30: /* GOULD RISC instructions are never longer than this many bytes.  */
                     31: #define MAXLEN 4
                     32: 
                     33: /* Number of elements in the opcode table.  */
                     34: #define NOPCODES (sizeof gld_opcodes / sizeof gld_opcodes[0])
                     35: 
                     36: 
                     37: /* Print the GOULD instruction at address MEMADDR in debugged memory,
                     38:    on STREAM.  Returns length of the instruction, in bytes.  */
                     39: 
                     40: int
                     41: print_insn (memaddr, stream)
                     42:        CORE_ADDR memaddr;
                     43:        FILE *stream;
                     44: {
                     45:        unsigned char buffer[MAXLEN];
                     46:        register int i;
                     47:        register char *d;
                     48:        register int bestmask;
                     49:        unsigned best;
                     50:        int temp, index, bestlen;
                     51: 
                     52:        read_memory (memaddr, buffer, MAXLEN);
                     53: 
                     54:        bestmask = 0;
                     55:        index = -1;
                     56:        best = 0xffffffff;
                     57:        for (i = 0; i < NOPCODES; i++)
                     58:        {
                     59:                register unsigned int opcode = gld_opcodes[i].opcode;
                     60:                register unsigned int mask = gld_opcodes[i].mask;
                     61:                register unsigned int len = gld_opcodes[i].length;
                     62:                register unsigned int test;
                     63: 
                     64:                /* Get possible opcode bytes into integer */
                     65:                test = buffer[0] << 24;
                     66:                test |= buffer[1] << 16;
                     67:                test |= buffer[2] << 8;
                     68:                test |= buffer[3];
                     69: 
                     70:                /* Mask with opcode and see if match */
                     71:                if ((opcode & mask) == (test & mask))
                     72:                {
                     73:                        /* See if second or third match */
                     74:                        if (index >= 0)
                     75:                        {
                     76:                                /* Take new one if it looks good */
                     77:                                if (bestlen == MAXLEN && len == MAXLEN)
                     78:                                {
                     79:                                        /* See if lower bits matched */
                     80:                                        if (((bestmask & 3) == 0) &&
                     81:                                            ((mask & 3) != 0))
                     82:                                        {
                     83:                                                bestmask = mask;
                     84:                                                bestlen = len;
                     85:                                                best = test;
                     86:                                                index = i;
                     87:                                        }
                     88:                                }
                     89:                        }
                     90:                        else
                     91:                        {
                     92:                                /* First match, save it */
                     93:                                bestmask = mask;
                     94:                                bestlen = len;
                     95:                                best = test;
                     96:                                index = i;
                     97:                        }
                     98:                }
                     99:        }
                    100: 
                    101:        /* Handle undefined instructions.  */
                    102:        if (index < 0)
                    103:        {
                    104:                fprintf (stream, "undefined   0%o",(buffer[0]<<8)+buffer[1]);
                    105:                return 2;
                    106:        }
                    107: 
                    108:        /* Print instruction name */
                    109:        fprintf (stream, "%-12s", gld_opcodes[index].name);
                    110: 
                    111:        /* Adjust if short instruction */
                    112:        if (gld_opcodes[index].length < 4)
                    113:        {
                    114:                best >>= 16;
                    115:                i = 0;
                    116:        }
                    117:        else
                    118:        {
                    119:                i = 16;
                    120:        }
                    121: 
                    122:        /* Dump out instruction arguments */
                    123:        for (d = gld_opcodes[index].args; *d; ++d)
                    124:        {
                    125:            switch (*d)
                    126:            {
                    127:                case 'f':
                    128:                    fprintf (stream, "%d",  (best >> (7 + i)) & 7);
                    129:                    break;
                    130:                case 'r':
                    131:                    fprintf (stream, "r%d", (best >> (7 + i)) & 7);
                    132:                    break;
                    133:                case 'R':
                    134:                    fprintf (stream, "r%d", (best >> (4 + i)) & 7);
                    135:                    break;
                    136:                case 'b':
                    137:                    fprintf (stream, "b%d", (best >> (7 + i)) & 7);
                    138:                    break;
                    139:                case 'B':
                    140:                    fprintf (stream, "b%d", (best >> (4 + i)) & 7);
                    141:                    break;
                    142:                case 'v':
                    143:                    fprintf (stream, "b%d", (best >> (7 + i)) & 7);
                    144:                    break;
                    145:                case 'V':
                    146:                    fprintf (stream, "b%d", (best >> (4 + i)) & 7);
                    147:                    break;
                    148:                case 'X':
                    149:                    temp = (best >> 20) & 7;
                    150:                    if (temp)
                    151:                        fprintf (stream, "r%d", temp);
                    152:                    else
                    153:                        putc ('0', stream);
                    154:                    break;
                    155:                case 'A':
                    156:                    temp = (best >> 16) & 7;
                    157:                    if (temp)
                    158:                        fprintf (stream, "(b%d)", temp);
                    159:                    break;
                    160:                case 'S':
                    161:                    fprintf (stream, "#%d", best & 0x1f);
                    162:                    break;
                    163:                case 'I':
                    164:                    fprintf (stream, "#%x", best & 0xffff);
                    165:                    break;
                    166:                case 'O':
                    167:                    fprintf (stream, "%x", best & 0xffff);
                    168:                    break;
                    169:                case 'h':
                    170:                    fprintf (stream, "%d", best & 0xfffe);
                    171:                    break;
                    172:                case 'd':
                    173:                    fprintf (stream, "%d", best & 0xfffc);
                    174:                    break;
                    175:                case 'T':
                    176:                    fprintf (stream, "%d", (best >> 8) & 0xff);
                    177:                    break;
                    178:                case 'N':
                    179:                    fprintf (stream, "%d", best & 0xff);
                    180:                    break;
                    181:                default:
                    182:                    putc (*d, stream);
                    183:                    break;
                    184:            }
                    185:        }
                    186: 
                    187:        /* Return length of instruction */
                    188:        return (gld_opcodes[index].length);
                    189: }
                    190: 
                    191: /*
                    192:  * Find the number of arguments to a function.
                    193:  */
                    194: findarg(frame)
                    195:        struct frame_info frame;
                    196: {
                    197:        register struct symbol *func;
                    198:        register unsigned pc;
                    199: 
                    200: #ifdef notdef
                    201:        /* find starting address of frame function */
                    202:        pc = get_pc_function_start (frame.pc);
                    203: 
                    204:        /* find function symbol info */
                    205:        func = find_pc_function (pc);
                    206: 
                    207:        /* call blockframe code to look for match */
                    208:        if (func != NULL)
                    209:                 return (func->value.block->nsyms / sizeof(int));
                    210: #endif
                    211: 
                    212:         return (-1);
                    213: } 
                    214: 
                    215: /*
                    216:  * In the case of the NPL, the frame's norminal address is Br2 and the 
                    217:  * previous routines frame is up the stack X bytes.  Finding out what
                    218:  * 'X' is can be tricky.
                    219:  *
                    220:  *    1.) stored in the code function header xA(Br1).
                    221:  *    2.) must be careful of recurssion.
                    222:  */
                    223: findframe(thisframe)
                    224:     FRAME thisframe;
                    225: {
                    226:     register FRAME pointer;
                    227:     struct frame_info frame;
                    228: 
                    229:     /* Setup toplevel frame structure */
                    230:     frame.pc = read_pc();
                    231:     frame.next_frame = 0;
                    232:     frame.frame = read_register (SP_REGNUM);   /* Br2 */
                    233: 
                    234:     /* Search for this frame (start at current Br2) */
                    235:     do
                    236:     {
                    237:        pointer = framechain(frame);
                    238:        frame.next_frame = frame.frame;
                    239:        frame.frame = pointer;
                    240:        frame.pc = FRAME_SAVED_PC(frame.next_frame);
                    241:     }
                    242:     while (frame.next_frame != thisframe);
                    243: 
                    244:     /* stop gap for now, end at __base3 */
                    245:     if (frame.pc == 0)
                    246:        return 0;
                    247: 
                    248:     return pointer;
                    249: }
                    250: 
                    251: /*
                    252:  * Gdb front-end and internal framechain routine.
                    253:  * Go back up stack one level.  Tricky...
                    254:  */
                    255: framechain(frame)
                    256:     register struct frame_info frame;
                    257: {
                    258:     register CORE_ADDR func, prevsp;
                    259:     register unsigned value;
                    260: 
                    261:     /* Get real function start address from internal frame address */
                    262:     func = get_pc_function_start(frame.pc);
                    263: 
                    264:     /* If no stack given, read register Br1 "(sp)" */
                    265:     if (!frame.frame)
                    266:        prevsp = read_register (SP_REGNUM);
                    267:     else
                    268:        prevsp = frame.frame;
                    269: 
                    270:     /* Check function header, case #2 */
                    271:     value = read_memory_integer (func, 4);
                    272:     if (value)
                    273:     {
                    274:        /* 32bit call push value stored in function header */
                    275:        prevsp += value;
                    276:     }
                    277:     else
                    278:     {
                    279:        /* read half-word from suabr at start of function */
                    280:        prevsp += read_memory_integer (func + 10, 2);
                    281:     }
                    282: 
                    283:     return (prevsp);
                    284: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.