- Timestamp:
- Apr 18, 2007, 11:37:28 PM (18 years ago)
- Location:
- branches/x8664-call/ccl/lisp-kernel
- Files:
-
- 5 edited
-
x86-exceptions.c (modified) (1 diff)
-
x86-exceptions.h (modified) (1 diff)
-
x86-gc.c (modified) (3 diffs)
-
x86_print.c (modified) (1 diff)
-
xlbt.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/x8664-call/ccl/lisp-kernel/x86-exceptions.c
r6275 r6306 316 316 tra = xpGPR(xp,Ira0); 317 317 if (tag_of(tra) == tag_tra) { 318 tra_f = tra - ((int *)tra)[-1]; 318 if ((*((unsigned short *)tra) == RECOVER_FN_FROM_RIP_WORD0) && 319 (*((unsigned char *)(tra+2)) == RECOVER_FN_FROM_RIP_BYTE2)) { 320 int sdisp = (*(int *) (tra+3)); 321 tra_f = RECOVER_FN_FROM_RIP_LENGTH+tra+sdisp; 322 } 319 323 if (fulltag_of(tra_f) != fulltag_function) { 320 324 tra_f = 0; -
branches/x8664-call/ccl/lisp-kernel/x86-exceptions.h
r6219 r6306 151 151 void setup_sigaltstack(area *); 152 152 #endif 153 154 /* recognizing the function associated with a tagged return address */ 155 /* now involves recognizinig an "(lea (@ disp (% rip)) (% rn))" */ 156 /* instruction at the tra */ 157 158 #define RECOVER_FN_FROM_RIP_LENGTH 7 /* the instruction is 7 bytes long */ 159 #define RECOVER_FN_FROM_RIP_DISP_OFFSET 3 /* displacement word is 3 bytes in */ 160 #define RECOVER_FN_FROM_RIP_WORD0 0x8d4c /* 0x4c 0x8d, little-endian */ 161 #define RECOVER_FN_FROM_RIP_BYTE2 0x2d /* third byte of opcode */ -
branches/x8664-call/ccl/lisp-kernel/x86-gc.c
r5963 r6306 291 291 292 292 if (tag_of(n) == tag_tra) { 293 n = n - (((int *)n)[-1]); 294 tag_n = fulltag_function; 293 if ((*((unsigned short *)n) == RECOVER_FN_FROM_RIP_WORD0) && 294 (*((unsigned char *)(n+2)) == RECOVER_FN_FROM_RIP_BYTE2)) { 295 int sdisp = (*(int *) (n+3)); 296 n = RECOVER_FN_FROM_RIP_LENGTH+n+sdisp; 297 tag_n = fulltag_function; 298 } 299 else { 300 return; 301 } 295 302 } 296 303 … … 456 463 457 464 if (tag_of(n) == tag_tra) { 458 n -= ((int *)n)[-1]; 459 tag_n = fulltag_function; 465 if ((*((unsigned short *)n) == RECOVER_FN_FROM_RIP_WORD0) && 466 (*((unsigned char *)(n+2)) == RECOVER_FN_FROM_RIP_BYTE2)) { 467 int sdisp = (*(int *) (n+3)); 468 n = RECOVER_FN_FROM_RIP_LENGTH+n+sdisp; 469 tag_n = fulltag_function; 470 } else { 471 return; 472 } 460 473 } 461 474 … … 710 723 if ((tag_n == fulltag_tra_0) || 711 724 (tag_n == fulltag_tra_1)) { 712 int disp = ( (int *)n)[-1];725 int disp = (*(int *) (n+3)) + RECOVER_FN_FROM_RIP_LENGTH; 713 726 714 727 base = (LispObj *) (untag(n-disp)); -
branches/x8664-call/ccl/lisp-kernel/x86_print.c
r5323 r6306 317 317 sprint_tra(LispObj o, int depth) 318 318 { 319 unsigned disp = *(((unsigned *)o)-1); 320 LispObj f = o-disp; 319 signed sdisp; 320 unsigned disp; 321 LispObj f = 0; 322 323 if ((*((unsigned short *)o) == RECOVER_FN_FROM_RIP_WORD0) && 324 (*((unsigned char *)(o+2)) == RECOVER_FN_FROM_RIP_BYTE2)) { 325 sdisp = (*(int *) (o+3)); 326 f = RECOVER_FN_FROM_RIP_LENGTH+o+sdisp; 327 disp = o-f; 328 } 321 329 322 330 if (fulltag_of(f) == fulltag_function) { -
branches/x8664-call/ccl/lisp-kernel/xlbt.c
r4581 r6306 27 27 print_lisp_frame(lisp_frame *frame) 28 28 { 29 LispObj pc = frame->tra, fun ;29 LispObj pc = frame->tra, fun=0; 30 30 int delta = 0; 31 31 … … 34 34 } 35 35 if (tag_of(pc) == tag_tra) { 36 fun = pc - (((unsigned *)pc)[-1]); 36 if ((*((unsigned short *)pc) == RECOVER_FN_FROM_RIP_WORD0) && 37 (*((unsigned char *)(pc+2)) == RECOVER_FN_FROM_RIP_BYTE2)) { 38 int sdisp = (*(int *) (pc+3)); 39 fun = RECOVER_FN_FROM_RIP_LENGTH+pc+sdisp; 40 } 37 41 if (fulltag_of(fun) == fulltag_function) { 38 42 delta = pc - fun; … … 53 57 LispObj fun, ra; 54 58 unsigned offset; 59 int sdisp; 55 60 56 61 if (f) { … … 59 64 ra = f->xtra; 60 65 } 66 61 67 if (tag_of(ra) == tag_tra) { 62 offset = (((unsigned *)ra)[-1]); 63 if (offset == 0) { 64 return true; 65 } else { 66 fun = ra - (((unsigned *)ra)[-1]); 67 if (fulltag_of(fun) == fulltag_function) { 68 return true; 69 } 68 if ((*((unsigned short *)ra) == RECOVER_FN_FROM_RIP_WORD0) && 69 (*((unsigned char *)(ra+2)) == RECOVER_FN_FROM_RIP_BYTE2)) { 70 sdisp = (*(int *) (ra+3)); 71 fun = RECOVER_FN_FROM_RIP_LENGTH+ra+sdisp; 72 } 73 if (fulltag_of(fun) == fulltag_function) { 74 return true; 70 75 } 71 76 } else if ((ra == lisp_global(LEXPR_RETURN)) ||
Note:
See TracChangeset
for help on using the changeset viewer.
