📄 tm-convex.h
字号:
/* OBSOLETE *//* OBSOLETE /* Describe the pointer in each stack frame to the previous stack frame *//* OBSOLETE (its caller). *x/ *//* OBSOLETE *//* OBSOLETE /* FRAME_CHAIN takes a frame_info with a frame's nominal address in fi->frame, *//* OBSOLETE and produces the frame's chain-pointer. *x/ *//* OBSOLETE *//* OBSOLETE /* (caller fp is saved at 8(fp)) *x/ *//* OBSOLETE *//* OBSOLETE #define FRAME_CHAIN(fi) (read_memory_integer ((fi)->frame + 8, 4)) *//* OBSOLETE *//* OBSOLETE /* Define other aspects of the stack frame. *x/ *//* OBSOLETE *//* OBSOLETE /* We need the boundaries of the text in the exec file, as a kludge, *//* OBSOLETE for FRAMELESS_FUNCTION_INVOCATION and CALL_DUMMY_LOCATION. *x/ *//* OBSOLETE *//* OBSOLETE #define NEED_TEXT_START_END 1 *//* OBSOLETE *//* OBSOLETE /* An expression that tells us whether the function invocation represented *//* OBSOLETE by FI does not have a frame on the stack associated with it. *//* OBSOLETE On convex, check at the return address for `callq' -- if so, frameless, *//* OBSOLETE otherwise, not. *x/ *//* OBSOLETE *//* OBSOLETE extern int convex_frameless_function_invocation PARAMS ((struct frame_info *fi)); *//* OBSOLETE #define FRAMELESS_FUNCTION_INVOCATION(FI) (convex_frameless_function_invocatio (FI)) *//* OBSOLETE *//* OBSOLETE #define FRAME_SAVED_PC(fi) (read_memory_integer ((fi)->frame, 4)) *//* OBSOLETE *//* OBSOLETE #define FRAME_ARGS_ADDRESS(fi) (read_memory_integer ((fi)->frame + 12, 4)) *//* OBSOLETE *//* OBSOLETE #define FRAME_LOCALS_ADDRESS(fi) (fi)->frame *//* OBSOLETE *//* OBSOLETE /* Return number of args passed to a frame. *//* OBSOLETE Can return -1, meaning no way to tell. *x/ *//* OBSOLETE *//* OBSOLETE extern int convex_frame_num_args PARAMS ((struct frame_info *fi)); *//* OBSOLETE #define FRAME_NUM_ARGS(fi) (convex_frame_num_args ((fi))) *//* OBSOLETE *//* OBSOLETE /* Return number of bytes at start of arglist that are not really args. *x/ *//* OBSOLETE *//* OBSOLETE #define FRAME_ARGS_SKIP 0 *//* OBSOLETE *//* OBSOLETE /* Put here the code to store, into a struct frame_saved_regs, *//* OBSOLETE the addresses of the saved registers of frame described by FRAME_INFO. *//* OBSOLETE This includes special registers such as pc and fp saved in special *//* OBSOLETE ways in the stack frame. sp is even more special: *//* OBSOLETE the address we return for it IS the sp for the next frame. *x/ *//* OBSOLETE *//* OBSOLETE /* Normal (short) frames save only PC, FP, (callee's) AP. To reasonably *//* OBSOLETE handle gcc and pcc register variables, scan the code following the *//* OBSOLETE call for the instructions the compiler inserts to reload register *//* OBSOLETE variables from stack slots and record the stack slots as the saved *//* OBSOLETE locations of those registers. This will occasionally identify some *//* OBSOLETE random load as a saved register; this is harmless. vc does not *//* OBSOLETE declare its register allocation actions in the stabs. *x/ *//* OBSOLETE *//* OBSOLETE #define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \ *//* OBSOLETE { register int regnum; \ *//* OBSOLETE register int frame_length = /* 3 short, 2 long, 1 extended, 0 context *x/\ *//* OBSOLETE (read_memory_integer ((frame_info)->frame + 4, 4) >> 25) & 3; \ *//* OBSOLETE register CORE_ADDR frame_fp = \ *//* OBSOLETE read_memory_integer ((frame_info)->frame + 8, 4); \ *//* OBSOLETE register CORE_ADDR next_addr; \ *//* OBSOLETE memset (&frame_saved_regs, '\0', sizeof frame_saved_regs); \ *//* OBSOLETE (frame_saved_regs).regs[PC_REGNUM] = (frame_info)->frame + 0; \ *//* OBSOLETE (frame_saved_regs).regs[PS_REGNUM] = (frame_info)->frame + 4; \ *//* OBSOLETE (frame_saved_regs).regs[FP_REGNUM] = (frame_info)->frame + 8; \ *//* OBSOLETE (frame_saved_regs).regs[AP_REGNUM] = frame_fp + 12; \ *//* OBSOLETE next_addr = (frame_info)->frame + 12; \ *//* OBSOLETE if (frame_length < 3) \ *//* OBSOLETE for (regnum = A5_REGNUM; regnum < SP_REGNUM; ++regnum) \ *//* OBSOLETE (frame_saved_regs).regs[regnum] = (next_addr += 4); \ *//* OBSOLETE if (frame_length < 2) \ *//* OBSOLETE (frame_saved_regs).regs[SP_REGNUM] = (next_addr += 4); \ *//* OBSOLETE next_addr -= 4; \ *//* OBSOLETE if (frame_length < 3) \ *//* OBSOLETE for (regnum = S7_REGNUM; regnum < S0_REGNUM; ++regnum) \ *//* OBSOLETE (frame_saved_regs).regs[regnum] = (next_addr += 8); \ *//* OBSOLETE if (frame_length < 2) \ *//* OBSOLETE (frame_saved_regs).regs[S0_REGNUM] = (next_addr += 8); \ *//* OBSOLETE else \ *//* OBSOLETE (frame_saved_regs).regs[SP_REGNUM] = next_addr + 8; \ *//* OBSOLETE if (frame_length == 3) { \ *//* OBSOLETE CORE_ADDR pc = read_memory_integer ((frame_info)->frame, 4); \ *//* OBSOLETE int op, ix, disp; \ *//* OBSOLETE op = read_memory_integer (pc, 2); \ *//* OBSOLETE if ((op & 0xffc7) == 0x1480) pc += 4; /* add.w #-,sp *x/ \ *//* OBSOLETE else if ((op & 0xffc7) == 0x58c0) pc += 2; /* add.w #-,sp *x/ \ *//* OBSOLETE op = read_memory_integer (pc, 2); \ *//* OBSOLETE if ((op & 0xffc7) == 0x2a06) pc += 4; /* ld.w -,ap *x/ \ *//* OBSOLETE for (;;) { \ *//* OBSOLETE op = read_memory_integer (pc, 2); \ *//* OBSOLETE ix = (op >> 3) & 7; \ *//* OBSOLETE if ((op & 0xfcc0) == 0x2800) { /* ld.- -,ak *x/ \ *//* OBSOLETE regnum = SP_REGNUM - (op & 7); \ *//* OBSOLETE disp = read_memory_integer (pc + 2, 2); \ *//* OBSOLETE pc += 4;} \ *//* OBSOLETE else if ((op & 0xfcc0) == 0x2840) { /* ld.- -,ak *x/ \ *//* OBSOLETE regnum = SP_REGNUM - (op & 7); \ *//* OBSOLETE disp = read_memory_integer (pc + 2, 4); \ *//* OBSOLETE pc += 6;} \ *//* OBSOLETE if ((op & 0xfcc0) == 0x3000) { /* ld.- -,sk *x/ \ *//* OBSOLETE regnum = S0_REGNUM - (op & 7); \ *//* OBSOLETE disp = read_memory_integer (pc + 2, 2); \ *//* OBSOLETE pc += 4;} \ *//* OBSOLETE else if ((op & 0xfcc0) == 0x3040) { /* ld.- -,sk *x/ \ *//* OBSOLETE regnum = S0_REGNUM - (op & 7); \ *//* OBSOLETE disp = read_memory_integer (pc + 2, 4); \ *//* OBSOLETE pc += 6;} \ *//* OBSOLETE else if ((op & 0xff00) == 0x7100) { /* br crossjump *x/ \ *//* OBSOLETE pc += 2 * (char) op; \ *//* OBSOLETE continue;} \ *//* OBSOLETE else if (op == 0x0140) { /* jmp crossjump *x/ \ *//* OBSOLETE pc = read_memory_integer (pc + 2, 4); \ *//* OBSOLETE continue;} \ *//* OBSOLETE else break; \ *//* OBSOLETE if ((frame_saved_regs).regs[regnum]) \ *//* OBSOLETE break; \ *//* OBSOLETE if (ix == 7) disp += frame_fp; \ *//* OBSOLETE else if (ix == 6) disp += read_memory_integer (frame_fp + 12, 4); \ *//* OBSOLETE else if (ix != 0) break; \ *//* OBSOLETE (frame_saved_regs).regs[regnum] = \ *//* OBSOLETE disp - 8 + (1 << ((op >> 8) & 3)); \ *//* OBSOLETE if (regnum >= S7_REGNUM) \ *//* OBSOLETE (frame_saved_regs).regs[regnum - S0_REGNUM + s0_REGNUM] = \ *//* OBSOLETE disp - 4 + (1 << ((op >> 8) & 3)); \ *//* OBSOLETE } \ *//* OBSOLETE } \ *//* OBSOLETE } *//* OBSOLETE *//* OBSOLETE /* Things needed for making the inferior call functions. *x/ *//* OBSOLETE *//* OBSOLETE #define CALL_DUMMY_LOCATION BEFORE_TEXT_END *//* OBSOLETE *//* OBSOLETE /* Push an empty stack frame, to record the current PC, etc. *x/ *//* OBSOLETE *//* OBSOLETE #define PUSH_DUMMY_FRAME \ *//* OBSOLETE { register CORE_ADDR sp = read_register (SP_REGNUM); \ *//* OBSOLETE register int regnum; \ *//* OBSOLETE char buf[8]; \ *//* OBSOLETE long word; \ *//* OBSOLETE for (regnum = S0_REGNUM; regnum >= S7_REGNUM; --regnum) { \ *//* OBSOLETE read_register_bytes (REGISTER_BYTE (regnum), buf, 8); \ *//* OBSOLETE sp = push_bytes (sp, buf, 8);} \ *//* OBSOLETE for (regnum = SP_REGNUM; regnum >= FP_REGNUM; --regnum) { \ *//* OBSOLETE word = read_register (regnum); \ *//* OBSOLETE sp = push_bytes (sp, &word, 4);} \ *//* OBSOLETE word = (read_register (PS_REGNUM) &~ (3<<25)) | (1<<25); \ *//* OBSOLETE sp = push_bytes (sp, &word, 4); \ *//* OBSOLETE word = read_register (PC_REGNUM); \ *//* OBSOLETE sp = push_bytes (sp, &word, 4); \ *//* OBSOLETE write_register (SP_REGNUM, sp); \ *//* OBSOLETE write_register (FP_REGNUM, sp); \ *//* OBSOLETE write_register (AP_REGNUM, sp);} *//* OBSOLETE *//* OBSOLETE /* Discard from the stack the innermost frame, restoring all registers. *x/ *//* OBSOLETE *//* OBSOLETE #define POP_FRAME do {\ *//* OBSOLETE register CORE_ADDR fp = read_register (FP_REGNUM); \ *//* OBSOLETE register int regnum; \ *//* OBSOLETE register int frame_length = /* 3 short, 2 long, 1 extended, 0 context *x/ \ *//* OBSOLETE (read_memory_integer (fp + 4, 4) >> 25) & 3; \ *//* OBSOLETE char buf[8]; \ *//* OBSOLETE write_register (PC_REGNUM, read_memory_integer (fp, 4)); \ *//* OBSOLETE write_register (PS_REGNUM, read_memory_integer (fp += 4, 4)); \ *//* OBSOLETE write_register (FP_REGNUM, read_memory_integer (fp += 4, 4)); \ *//* OBSOLETE write_register (AP_REGNUM, read_memory_integer (fp += 4, 4)); \ *//* OBSOLETE if (frame_length < 3) \ *//* OBSOLETE for (regnum = A5_REGNUM; regnum < SP_REGNUM; ++regnum) \ *//* OBSOLETE write_register (regnum, read_memory_integer (fp += 4, 4)); \ *//* OBSOLETE if (frame_length < 2) \ *//* OBSOLETE write_register (SP_REGNUM, read_memory_integer (fp += 4, 4)); \ *//* OBSOLETE fp -= 4; \ *//* OBSOLETE if (frame_length < 3) \ *//* OBSOLETE for (regnum = S7_REGNUM; regnum < S0_REGNUM; ++regnum) { \ *//* OBSOLETE read_memory (fp += 8, buf, 8); \ *//* OBSOLETE write_register_bytes (REGISTER_BYTE (regnum), buf, 8);} \ *//* OBSOLETE if (frame_length < 2) { \ *//* OBSOLETE read_memory (fp += 8, buf, 8); \ *//* OBSOLETE write_register_bytes (REGISTER_BYTE (regnum), buf, 8);} \ *//* OBSOLETE else write_register (SP_REGNUM, fp + 8); \ *//* OBSOLETE flush_cached_frames (); \ *//* OBSOLETE } while (0) *//* OBSOLETE *//* OBSOLETE /* This sequence of words is the instructions *//* OBSOLETE mov sp,ap *//* OBSOLETE pshea 69696969 *//* OBSOLETE calls 32323232 *//* OBSOLETE bkpt *//* OBSOLETE Note this is 16 bytes. *x/ *//* OBSOLETE *//* OBSOLETE #define CALL_DUMMY {0x50860d4069696969LL,0x2140323232327d50LL} *//* OBSOLETE *//* OBSOLETE #define CALL_DUMMY_LENGTH 16 *//* OBSOLETE *//* OBSOLETE #define CALL_DUMMY_START_OFFSET 0 *//* OBSOLETE *//* OBSOLETE /* Insert the specified number of args and function address *//* OBSOLETE into a call sequence of the above form stored at DUMMYNAME. *x/ *//* OBSOLETE *//* OBSOLETE #define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \ *//* OBSOLETE { *(int *)((char *) dummyname + 4) = nargs; \ *//* OBSOLETE *(int *)((char *) dummyname + 10) = fun; } *//* OBSOLETE *//* OBSOLETE /* Defs to read soff symbol tables, see dbxread.c *x/ *//* OBSOLETE *//* OBSOLETE #define NUMBER_OF_SYMBOLS ((long) opthdr.o_nsyms) *//* OBSOLETE #define STRING_TABLE_OFFSET ((long) filehdr.h_strptr) *//* OBSOLETE #define SYMBOL_TABLE_OFFSET ((long) opthdr.o_symptr) *//* OBSOLETE #define STRING_TABLE_SIZE ((long) filehdr.h_strsiz) *//* OBSOLETE #define SIZE_OF_TEXT_SEGMENT ((long) txthdr.s_size) *//* OBSOLETE #define ENTRY_POINT ((long) opthdr.o_entry) *//* OBSOLETE *//* OBSOLETE #define READ_STRING_TABLE_SIZE(BUFFER) \ *//* OBSOLETE (BUFFER = STRING_TABLE_SIZE) *//* OBSOLETE *//* OBSOLETE #define DECLARE_FILE_HEADERS \ *//* OBSOLETE FILEHDR filehdr; \ *//* OBSOLETE OPTHDR opthdr; \ *//* OBSOLETE SCNHDR txthdr *//* OBSOLETE *//* OBSOLETE #define READ_FILE_HEADERS(DESC,NAME) \ *//* OBSOLETE { \ *//* OBSOLETE int n; \ *//* OBSOLETE val = myread (DESC, &filehdr, sizeof filehdr); \ *//* OBSOLETE if (val < 0) \ *//* OBSOLETE perror_with_name (NAME); \ *//* OBSOLETE if (! IS_SOFF_MAGIC (filehdr.h_magic)) \ *//* OBSOLETE error ("%s: not an executable file.", NAME); \ *//* OBSOLETE lseek (DESC, 0L, 0); \ *//* OBSOLETE if (myread (DESC, &filehdr, sizeof filehdr) < 0) \ *//* OBSOLETE perror_with_name (NAME); \ *//* OBSOLETE if (myread (DESC, &opthdr, filehdr.h_opthdr) <= 0) \ *//* OBSOLETE perror_with_name (NAME); \ *//* OBSOLETE for (n = 0; n < filehdr.h_nscns; n++) \ *//* OBSOLETE { \ *//* OBSOLETE if (myread (DESC, &txthdr, sizeof txthdr) < 0) \ *//* OBSOLETE perror_with_name (NAME); \ *//* OBSOLETE if ((txthdr.s_flags & S_TYPMASK) == S_TEXT) \ *//* OBSOLETE break; \ *//* OBSOLETE } \ *//* OBSOLETE } */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -