* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
static char sccsid
[] = "@(#)resume.c 5.1 (Berkeley) %G%";
* Resume execution, first setting appropriate registers.
#include "runtime/frame.rep"
#include "machine/pxerrors.h"
* Resume execution, set (get) pcode location counter before (after) resuming.
printf("execution resumes at pc 0x%x, lc %d\n", process
->pc
, pc
);
dread(&pcaddr
, PCADDRP
, sizeof(pcaddr
));
dread(&pc
, pcaddr
, sizeof(pc
));
if (p
->status
== STOPPED
) {
dread(&pcframe
, PCADDRP
, sizeof(pcframe
));
pc
-= (sizeof(char) + ENDOFF
);
printf("execution stops at pc 0x%x, lc %d on sig %d\n",
process
->pc
, pc
, p
->signo
);
if (p
->status
== STOPPED
) {
} while (p
->signo
== SIGCONT
);
if (option('r') && p
->signo
!= 0) {
* If px implements a breakpoint by executing a halt instruction
* the real pc must be incremented to skip over it.
* Currently, px sends itself a signal so no incrementing is needed.
* Find the location in the Pascal object where execution was suspended.
* We basically walk back through the frames looking for saved
* register 11's. Each time we find one, we remember it. When we reach
* the frame associated with the interpreter procedure, the most recently
* saved register 11 is the one we want.
unsigned int fr_psw
: 16; /* saved psw */
unsigned int fr_mask
: 12; /* register save mask */
unsigned int fr_unused
: 1;
unsigned int fr_s
: 1; /* call was a calls, not callg */
unsigned int fr_spa
: 2; /* stack pointer alignment */
unsigned int fr_savap
; /* saved arg pointer */
unsigned int fr_savfp
; /* saved frame pointer */
int fr_savpc
; /* saved program counter */
#define regsaved(frame, n) ((frame.fr_mask&(1 << n)) != 0)
LOCAL ADDRESS
fetchpc(framep
)
if (p
->fp
== (ADDRESS
) framep
) {
savfp
= (ADDRESS
*) p
->fp
;
dread(&vframe
, savfp
, sizeof(vframe
));
while (vframe
.fr_savfp
!= (int) framep
&& vframe
.fr_savfp
!= 0) {
if (regsaved(vframe
, 11)) {
dread(&r
, savfp
+ 5, sizeof(r
));
savfp
= (ADDRESS
*) vframe
.fr_savfp
;
dread(&vframe
, savfp
, sizeof(vframe
));
if (vframe
.fr_savfp
== 0) {
panic("resume: can't find interpreter frame 0x%x", framep
);
if (regsaved(vframe
, 11)) {
dread(&r
, savfp
+ 5, sizeof(r
));
* Under the -r option, we offer the opportunity to just get
* the px traceback and not actually enter the debugger.
* If the standard input is not a tty but standard error is,
* change standard input to be /dev/tty.
if (!isterm(stderr
) || freopen("/dev/tty", "r", stdin
) == NIL
) {
fprintf(stderr
, "\nProgram error");
fprintf(stderr
, " -- %s", pxerrmsg
[errnum
]);
fprintf(stderr
, "\nDo you wish to enter the debugger? ");
while (c
!= '\n' && c
!= EOF
) {
fprintf(stderr
, "\nEntering debugger ...");
fprintf(stderr
, " type 'help' for help.\n");