Annotation of 43BSDReno/contrib/emacs-18.55/gdb/m-npl.h, revision 1.1.1.1

1.1       root        1: /* Parameters for execution on a Gould NP1, 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: /* Read file headers properly in core.c */
                     21: #define gould
                     22: 
                     23: /* Macro for text-offset and data info (in NPL a.out format).  */
                     24: #define        TEXTINFO                                                \
                     25:         text_offset = N_TXTOFF (exec_coffhdr, exec_aouthdr);   \
                     26:         exec_data_offset = N_TXTOFF (exec_coffhdr, exec_aouthdr)\
                     27:                 + exec_aouthdr.a_text
                     28: 
                     29: /* Macro for number of symbol table entries */
                     30: #define END_OF_TEXT_DEFAULT                                    \
                     31:        (0xffffff)
                     32: 
                     33: /* Macro for number of symbol table entries */
                     34: #define NUMBER_OF_SYMBOLS                                      \
                     35:        (coffhdr.f_nsyms)
                     36: 
                     37: /* Macro for file-offset of symbol table (in NPL a.out format).  */
                     38: #define SYMBOL_TABLE_OFFSET                                    \
                     39:        N_SYMOFF (coffhdr)
                     40: 
                     41: /* Macro for file-offset of string table (in NPL a.out format).  */
                     42: #define STRING_TABLE_OFFSET                                    \
                     43:        (N_STROFF (coffhdr) + sizeof(int))
                     44: 
                     45: /* Macro to store the length of the string table data in INTO.  */
                     46: #define READ_STRING_TABLE_SIZE(INTO)                           \
                     47:        { INTO = hdr.a_stsize; }
                     48: 
                     49: /* Macro to declare variables to hold the file's header data.  */
                     50: #define DECLARE_FILE_HEADERS  struct exec hdr;                 \
                     51:                              FILHDR coffhdr
                     52: 
                     53: /* Macro to read the header data from descriptor DESC and validate it.
                     54:    NAME is the file name, for error messages.  */
                     55: #define READ_FILE_HEADERS(DESC, NAME)                          \
                     56: { val = myread (DESC, &coffhdr, sizeof coffhdr);               \
                     57:   if (val < 0)                                                 \
                     58:     perror_with_name (NAME);                                   \
                     59:   val = myread (DESC, &hdr, sizeof hdr);                       \
                     60:   if (val < 0)                                                 \
                     61:     perror_with_name (NAME);                                   \
                     62:   if (coffhdr.f_magic != GNP1MAGIC)                            \
                     63:     error ("File \"%s\" not in coff executable format.", NAME);        \
                     64:   if (N_BADMAG (hdr))                                          \
                     65:     error ("File \"%s\" not in executable format.", NAME); }
                     66: 
                     67: /* Define COFF and other symbolic names needed on NP1 */
                     68: #define        NS32GMAGIC      GNP1MAGIC
                     69: #define        NS32SMAGIC      GPNMAGIC
                     70: #define vprintf                printf
                     71: 
                     72: /* Get rid of any system-imposed stack limit if possible.  */
                     73: #define SET_STACK_LIMIT_HUGE
                     74: 
                     75: /* Define this if the C compiler puts an underscore at the front
                     76:    of external names before giving them to the linker.  */
                     77: #define NAMES_HAVE_UNDERSCORE
                     78: 
                     79: /* Debugger information will be in DBX format.  */
                     80: #define READ_DBX_FORMAT
                     81: 
                     82: /* Offset from address of function to start of its code.
                     83:    Zero on most machines.  */
                     84: #define FUNCTION_START_OFFSET  8
                     85: 
                     86: /* Advance PC across any function entry prologue instructions
                     87:    to reach some "real" code.  One NPL we can have one two startup
                     88:    sequences depending on the size of the local stack:
                     89: 
                     90:    Either:
                     91:       "suabr b2, #"
                     92:    of
                     93:       "lil r4, #", "suabr b2, #(r4)"
                     94: 
                     95:    "lwbr b6, #", "stw r1, 8(b2)"
                     96:    Optional "stwbr b3, c(b2)"
                     97:    Optional "trr r2,r7"      (Gould first argument register passing)
                     98:      or
                     99:    Optional "stw r2,8(b3)"   (Gould first argument register passing)
                    100:  */
                    101: #define SKIP_PROLOGUE(pc) {                                            \
                    102:        register int op = read_memory_integer ((pc), 4);                \
                    103:        if ((op & 0xffff0000) == 0xFA0B0000) {                          \
                    104:            pc += 4;                                                    \
                    105:            op = read_memory_integer ((pc), 4);                         \
                    106:            if ((op & 0xffff0000) == 0x59400000) {                      \
                    107:                pc += 4;                                                \
                    108:                op = read_memory_integer ((pc), 4);                     \
                    109:                if ((op & 0xffff0000) == 0x5F000000) {                  \
                    110:                    pc += 4;                                            \
                    111:                    op = read_memory_integer ((pc), 4);                 \
                    112:                    if (op == 0xD4820008) {                             \
                    113:                        pc += 4;                                        \
                    114:                        op = read_memory_integer ((pc), 4);             \
                    115:                        if (op == 0x5582000C) {                         \
                    116:                            pc += 4;                                    \
                    117:                            op = read_memory_integer ((pc), 2);         \
                    118:                            if (op == 0x2fa0) {                         \
                    119:                                pc += 2;                                \
                    120:                            } else {                                    \
                    121:                                op = read_memory_integer ((pc), 4);     \
                    122:                                if (op == 0xd5030008) {                 \
                    123:                                    pc += 4;                            \
                    124:                                }                                       \
                    125:                            }                                           \
                    126:                        } else {                                        \
                    127:                            op = read_memory_integer ((pc), 2);         \
                    128:                            if (op == 0x2fa0) {                         \
                    129:                                pc += 2;                                \
                    130:                            }                                           \
                    131:                        }                                               \
                    132:                    }                                                   \
                    133:                }                                                       \
                    134:            }                                                           \
                    135:        }                                                               \
                    136:        if ((op & 0xffff0000) == 0x59000000) {                          \
                    137:            pc += 4;                                                    \
                    138:            op = read_memory_integer ((pc), 4);                         \
                    139:            if ((op & 0xffff0000) == 0x5F000000) {                      \
                    140:                pc += 4;                                                \
                    141:                op = read_memory_integer ((pc), 4);                     \
                    142:                if (op == 0xD4820008) {                                 \
                    143:                    pc += 4;                                            \
                    144:                    op = read_memory_integer ((pc), 4);                 \
                    145:                    if (op == 0x5582000C) {                             \
                    146:                        pc += 4;                                        \
                    147:                        op = read_memory_integer ((pc), 2);             \
                    148:                        if (op == 0x2fa0) {                             \
                    149:                            pc += 2;                                    \
                    150:                        } else {                                        \
                    151:                            op = read_memory_integer ((pc), 4);         \
                    152:                            if (op == 0xd5030008) {                     \
                    153:                                pc += 4;                                \
                    154:                            }                                           \
                    155:                        }                                               \
                    156:                    } else {                                            \
                    157:                        op = read_memory_integer ((pc), 2);             \
                    158:                        if (op == 0x2fa0) {                             \
                    159:                            pc += 2;                                    \
                    160:                        }                                               \
                    161:                    }                                                   \
                    162:                }                                                       \
                    163:            }                                                           \
                    164:        }                                                               \
                    165: }
                    166: 
                    167: /* Immediately after a function call, return the saved pc.
                    168:    Can't go through the frames for this because on some machines
                    169:    the new frame is not set up until the new function executes
                    170:    some instructions.  True on NPL! Return address is in R1.
                    171:    The true return address is REALLY 4 past that location! */
                    172: #define SAVED_PC_AFTER_CALL(frame) \
                    173:        (read_register(R1_REGNUM) + 4)
                    174: 
                    175: /* Address of U in kernel space */
                    176: #define        KERNEL_U_ADDR           0x7fffc000
                    177: 
                    178: /* Address of end of stack space.  */
                    179: #define STACK_END_ADDR                 0x7fffc000
                    180: 
                    181: /* Stack grows downward.  */
                    182: #define INNER_THAN             <
                    183: 
                    184: /* Sequence of bytes for breakpoint instruction.  */
                    185: #define BREAKPOINT             {0x28, 0x09}
                    186: 
                    187: /* Amount PC must be decremented by after a breakpoint.
                    188:    This is often the number of bytes in BREAKPOINT
                    189:    but not always.  */
                    190: #define DECR_PC_AFTER_BREAK    2
                    191: 
                    192: /* Nonzero if instruction at PC is a return instruction. "bu 4(r1)" */
                    193: #define ABOUT_TO_RETURN(pc)    (read_memory_integer (pc, 4) == 0x40100004)
                    194: 
                    195: /* Return 1 if P points to an invalid floating point value.  */
                    196: #define INVALID_FLOAT(p, len)  ((*(short *)p & 0xff80) == 0x8000)
                    197: 
                    198: /* Say how long (ordinary) registers are.  */
                    199: #define REGISTER_TYPE          long
                    200: 
                    201: /* Size of bytes of vector register (NP1 only), 32 elements * sizeof(int) */
                    202: #define VR_SIZE                        128
                    203: 
                    204: /* Number of machine registers */
                    205: #define NUM_REGS               27
                    206: #define NUM_GEN_REGS           16
                    207: #define NUM_CPU_REGS           4
                    208: #define NUM_VECTOR_REGS                7
                    209: 
                    210: /* Initializer for an array of names of registers.
                    211:    There should be NUM_REGS strings in this initializer.  */
                    212: #define REGISTER_NAMES { \
                    213:   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
                    214:   "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", \
                    215:   "sp", "ps", "pc", "ve", \
                    216:   "v1", "v2", "v3", "v4", "v5", "v6", "v7", \
                    217: }
                    218: 
                    219: /* Register numbers of various important registers.
                    220:    Note that some of these values are "real" register numbers,
                    221:    and correspond to the general registers of the machine,
                    222:    and some are "phony" register numbers which are too large
                    223:    to be actual register numbers as far as the user is concerned
                    224:    but do serve to get the desired values when passed to read_register.  */
                    225: #define R1_REGNUM      1       /* Gr1 => return address of caller */
                    226: #define R4_REGNUM      4       /* Gr4 => register save area */
                    227: #define R5_REGNUM      5       /* Gr5 => register save area */
                    228: #define R6_REGNUM      6       /* Gr6 => register save area */
                    229: #define R7_REGNUM      7       /* Gr7 => register save area */
                    230: #define B1_REGNUM      9       /* Br1 => start of this code routine */
                    231: #define FP_REGNUM      10      /* Br2 == (sp) */
                    232: #define AP_REGNUM      11      /* Br3 == (ap) */
                    233: #define SP_REGNUM      16      /* A copy of Br2 saved in trap */
                    234: #define PS_REGNUM      17      /* Contains processor status */
                    235: #define PC_REGNUM      18      /* Contains program counter */
                    236: #define VE_REGNUM      19      /* Vector end (user setup) register */
                    237: #define V1_REGNUM      20      /* First vector register */
                    238: #define V7_REGNUM      27      /* First vector register */
                    239: 
                    240: /* This is a piece of magic that is given a register number REGNO
                    241:    and as BLOCKEND the address in the system of the end of the user structure
                    242:    and stores in ADDR the address in the kernel or core dump
                    243:    of that register. */
                    244: #define REGISTER_U_ADDR(addr, blockend, regno) {                       \
                    245:        addr = blockend + regno * 4;                                    \
                    246:        if (regno == VE_REGNUM) addr = blockend - 9 * 4;                \
                    247:        if (regno == PC_REGNUM) addr = blockend - 8 * 4;                \
                    248:        if (regno == PS_REGNUM) addr = blockend - 7 * 4;                \
                    249:        if (regno == SP_REGNUM) addr = blockend - 6 * 4;                \
                    250:        if (regno >= V1_REGNUM)                                         \
                    251:            addr = blockend + 16 * 4 + (regno - V1_REGNUM) * VR_SIZE;   \
                    252: }
                    253: 
                    254: /* Total amount of space needed to store our copies of the machine's
                    255:    register state, the array `registers'.  */
                    256: #define REGISTER_BYTES \
                    257:        (NUM_GEN_REGS*4 + NUM_VECTOR_REGS*VR_SIZE + NUM_CPU_REGS*4)
                    258: 
                    259: /* Index within `registers' of the first byte of the space for
                    260:    register N.  */
                    261: #define REGISTER_BYTE(N)  \
                    262:        (((N) < V1_REGNUM) ? ((N) * 4) : (((N) - V1_REGNUM) * VR_SIZE) + 80)
                    263: 
                    264: /* Number of bytes of storage in the actual machine representation
                    265:    for register N.  On the NP1, all normal regs are 4 bytes, but
                    266:    the vector registers are VR_SIZE*4 bytes long. */
                    267: #define REGISTER_RAW_SIZE(N) \
                    268:        (((N) < V1_REGNUM) ? 4 : VR_SIZE)
                    269: 
                    270: /* Number of bytes of storage in the program's representation
                    271:    for register N.  On the NP1, all regs are 4 bytes. */
                    272: #define REGISTER_VIRTUAL_SIZE(N) \
                    273:        (((N) < V1_REGNUM) ? 4 : VR_SIZE)
                    274: 
                    275: /* Largest value REGISTER_RAW_SIZE can have.  */
                    276: #define MAX_REGISTER_RAW_SIZE          VR_SIZE
                    277: 
                    278: /* Largest value REGISTER_VIRTUAL_SIZE can have.  */
                    279: #define MAX_REGISTER_VIRTUAL_SIZE      VR_SIZE
                    280: 
                    281: /* Nonzero if register N requires conversion
                    282:    from raw format to virtual format.  */
                    283: #define REGISTER_CONVERTIBLE(N)                (0)
                    284: 
                    285: /* Convert data from raw format for register REGNUM
                    286:    to virtual format for register REGNUM.  */
                    287: #define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,FROM,TO)    \
                    288:        bcopy ((FROM), (TO), REGISTER_RAW_SIZE(REGNUM));
                    289: 
                    290: /* Convert data from virtual format for register REGNUM
                    291:    to raw format for register REGNUM.  */
                    292: #define REGISTER_CONVERT_TO_RAW(REGNUM,FROM,TO)        \
                    293:        bcopy ((FROM), (TO), REGISTER_VIRTUAL_SIZE(REGNUM));
                    294: 
                    295: /* Return the GDB type object for the "standard" data type
                    296:    of data in register N.  */
                    297: #define REGISTER_VIRTUAL_TYPE(N)       (builtin_type_int)
                    298: 
                    299: /* Extract from an arrary REGBUF containing the (raw) register state
                    300:    a function return value of type TYPE, and copy that, in virtual format,
                    301:    into VALBUF. */
                    302: 
                    303: #define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
                    304:        bcopy (REGBUF, VALBUF, TYPE_LENGTH (TYPE))
                    305: 
                    306: /* Write into appropriate registers a function return value
                    307:    of type TYPE, given in virtual format.  */
                    308: 
                    309: #define STORE_RETURN_VALUE(TYPE,VALBUF) \
                    310:        write_register_bytes (0, VALBUF, TYPE_LENGTH (TYPE))
                    311: 
                    312: /* Extract from an array REGBUF containing the (raw) register state
                    313:    the address in which a function should return its structure value,
                    314:    as a CORE_ADDR (or an expression that can be used as one).  */
                    315: 
                    316: #define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(int *)(REGBUF))
                    317: 
                    318: 
                    319: /* Describe the pointer in each stack frame to the previous stack frame
                    320:    (its caller).  */
                    321: 
                    322: /* FRAME_CHAIN takes a frame's nominal address
                    323:    and produces the frame's chain-pointer.
                    324: 
                    325:    FRAME_CHAIN_COMBINE takes the chain pointer and the frame's nominal address
                    326:    and produces the nominal address of the caller frame.
                    327: 
                    328:    However, if FRAME_CHAIN_VALID returns zero,
                    329:    it means the given frame is the outermost one and has no caller.
                    330:    In that case, FRAME_CHAIN_COMBINE is not used.  */
                    331: 
                    332: /* In the case of the NPL, the frame's norminal address is Br2 and the 
                    333:    previous routines frame is up the stack X bytes, where X is the
                    334:    value stored in the code function header xA(Br1). */
                    335: #define FRAME_CHAIN(thisframe)         (findframe(thisframe))
                    336: 
                    337: #define FRAME_CHAIN_VALID(chain, thisframe) \
                    338:         (chain != 0 && chain != thisframe)
                    339: 
                    340: #define FRAME_CHAIN_COMBINE(chain, thisframe) \
                    341:        (chain)
                    342: 
                    343: /* Define other aspects of the stack frame on NPL.  */
                    344: #define FRAME_SAVED_PC(frame) \
                    345:        (read_memory_integer (frame + 8, 4))
                    346: 
                    347: #define FRAME_ARGS_ADDRESS(fi) \
                    348:        ((fi).next_frame ? \
                    349:         read_memory_integer ((fi).frame + 12, 4) : \
                    350:         read_register (AP_REGNUM))
                    351: 
                    352: #define FRAME_LOCALS_ADDRESS(fi)       ((fi).frame + 80)
                    353: 
                    354: /* Set VAL to the number of args passed to frame described by FI.
                    355:    Can set VAL to -1, meaning no way to tell.  */
                    356: 
                    357: /* We can check the stab info to see how
                    358:    many arg we have.  No info in stack will tell us */
                    359: #define FRAME_NUM_ARGS(val,fi)         (val = findarg(fi))
                    360: 
                    361: /* Return number of bytes at start of arglist that are not really args.  */
                    362: #define FRAME_ARGS_SKIP                        8
                    363: 
                    364: /* Put here the code to store, into a struct frame_saved_regs,
                    365:    the addresses of the saved registers of frame described by FRAME_INFO.
                    366:    This includes special registers such as pc and fp saved in special
                    367:    ways in the stack frame.  sp is even more special:
                    368:    the address we return for it IS the sp for the next frame.  */
                    369: 
                    370: #define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs)            \
                    371: {                                                                       \
                    372:   bzero (&frame_saved_regs, sizeof frame_saved_regs);                  \
                    373:   (frame_saved_regs).regs[PC_REGNUM] = (frame_info).frame + 8;         \
                    374:   (frame_saved_regs).regs[R4_REGNUM] = (frame_info).frame + 0x30;      \
                    375:   (frame_saved_regs).regs[R5_REGNUM] = (frame_info).frame + 0x34;      \
                    376:   (frame_saved_regs).regs[R6_REGNUM] = (frame_info).frame + 0x38;      \
                    377:   (frame_saved_regs).regs[R7_REGNUM] = (frame_info).frame + 0x3C;      \
                    378: }
                    379: 
                    380: /* Things needed for making the inferior call functions.  */
                    381: 
                    382: /* Push an empty stack frame, to record the current PC, etc.  */
                    383: 
                    384: #define PUSH_DUMMY_FRAME \
                    385: { register CORE_ADDR sp = read_register (SP_REGNUM);                   \
                    386:   register int regnum;                                                 \
                    387:   sp = push_word (sp, read_register (PC_REGNUM));                      \
                    388:   sp = push_word (sp, read_register (FP_REGNUM));                      \
                    389:   write_register (FP_REGNUM, sp);                                      \
                    390:   for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)                  \
                    391:     sp = push_word (sp, read_register (regnum));                       \
                    392:   sp = push_word (sp, read_register (PS_REGNUM));                      \
                    393:   write_register (SP_REGNUM, sp);  }
                    394: 
                    395: /* Discard from the stack the innermost frame, 
                    396:    restoring all saved registers.  */
                    397: 
                    398: #define POP_FRAME  \
                    399: { register CORE_ADDR fp = read_register (FP_REGNUM);            \
                    400:   register int regnum;                                          \
                    401:   struct frame_saved_regs fsr;                                  \
                    402:   struct frame_info fi;                                                 \
                    403:   fi = get_frame_info (fp);                                     \
                    404:   get_frame_saved_regs (&fi, &fsr);                             \
                    405:   for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)           \
                    406:     if (fsr.regs[regnum])                                       \
                    407:       write_register (regnum, read_memory_integer (fsr.regs[regnum], 4)); \
                    408:   if (fsr.regs[PS_REGNUM])                                      \
                    409:     write_register (PS_REGNUM, read_memory_integer (fsr.regs[PS_REGNUM], 4)); \
                    410:   write_register (FP_REGNUM, read_memory_integer (fp, 4));      \
                    411:   write_register (PC_REGNUM, read_memory_integer (fp + 4, 4));   \
                    412:   write_register (SP_REGNUM, fp + 8);                           \
                    413:   set_current_frame (read_register (FP_REGNUM)); }
                    414: 
                    415: /* This sequence of words is the instructions:
                    416:      halt
                    417:      halt
                    418:      halt
                    419:      halt
                    420:      suabr     b2, #<stacksize>
                    421:      lwbr      b6, #con
                    422:      stw       r1, 8(b2)       - save caller address, do we care?
                    423:      lw                r2, 60(b2)      - arg1
                    424:      labr      b3, 50(b2)
                    425:      std       r4, 30(b2)      - save r4-r7
                    426:      std       r6, 38(b2)
                    427:      lwbr      b1, #<func>     - load function call address
                    428:      brlnk     r1, 8(b1)       - call function
                    429:      halt
                    430:      halt
                    431:      ld                r4, 30(b2)      - restore r4-r7
                    432:      ld                r6, 38(b2)
                    433: 
                    434:    Setup our stack frame, load argumemts, call and then restore registers.
                    435: */
                    436: 
                    437: #define CALL_DUMMY {0xf227e0ff, 0x48e7fffc, 0x426742e7, 0x4eb93232, 0x3232dffc, 0x69696969, 0x4e4f4e71}
                    438: 
                    439: #define CALL_DUMMY_LENGTH 28
                    440: 
                    441: #define CALL_DUMMY_START_OFFSET 12
                    442: 
                    443: /* Insert the specified number of args and function address
                    444:    into a call sequence of the above form stored at DUMMYNAME.  */
                    445: 
                    446: #define FIX_CALL_DUMMY(dummyname, fun, nargs)     \
                    447: { *(int *)((char *) dummyname + 20) = nargs * 4;  \
                    448:   *(int *)((char *) dummyname + 14) = fun; }
                    449: 
                    450: /*
                    451:  * No KDB support, Yet! */
                    452: /* Interface definitions for kernel debugger KDB.  */
                    453: 
                    454: /* Map machine fault codes into signal numbers.
                    455:    First subtract 0, divide by 4, then index in a table.
                    456:    Faults for which the entry in this table is 0
                    457:    are not handled by KDB; the program's own trap handler
                    458:    gets to handle then.  */
                    459: 
                    460: #define FAULT_CODE_ORIGIN 0
                    461: #define FAULT_CODE_UNITS 4
                    462: #define FAULT_TABLE    \
                    463: { 0, 0, 0, 0, SIGTRAP, 0, 0, 0, \
                    464:   0, SIGTRAP, 0, 0, 0, 0, 0, SIGKILL, \
                    465:   0, 0, 0, 0, 0, 0, 0, 0, \
                    466:   SIGILL }
                    467: 
                    468: /* Start running with a stack stretching from BEG to END.
                    469:    BEG and END should be symbols meaningful to the assembler.
                    470:    This is used only for kdb.  */
                    471: 
                    472: #define INIT_STACK(beg, end)  \
                    473: { asm (".globl end");         \
                    474:   asm ("movel $ end, sp");      \
                    475:   asm ("clrl fp"); }
                    476: 
                    477: /* Push the frame pointer register on the stack.  */
                    478: #define PUSH_FRAME_PTR        \
                    479:   asm ("movel fp, -(sp)");
                    480: 
                    481: /* Copy the top-of-stack to the frame pointer register.  */
                    482: #define POP_FRAME_PTR  \
                    483:   asm ("movl (sp), fp");
                    484: 
                    485: /* After KDB is entered by a fault, push all registers
                    486:    that GDB thinks about (all NUM_REGS of them),
                    487:    so that they appear in order of ascending GDB register number.
                    488:    The fault code will be on the stack beyond the last register.  */
                    489: 
                    490: #define PUSH_REGISTERS        \
                    491: { asm ("clrw -(sp)");        \
                    492:   asm ("pea 10(sp)");        \
                    493:   asm ("movem $ 0xfffe,-(sp)"); }
                    494: 
                    495: /* Assuming the registers (including processor status) have been
                    496:    pushed on the stack in order of ascending GDB register number,
                    497:    restore them and return to the address in the saved PC register.  */
                    498: 
                    499: #define POP_REGISTERS          \
                    500: { asm ("subil $8,28(sp)");     \
                    501:   asm ("movem (sp),$ 0xffff"); \
                    502:   asm ("rte"); }

unix.superglobalmegacorp.com

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