-/*
- * Copyright (c) 1980 Regents of the University of California.
- * All rights reserved. The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+/*-
+ * Copyright (c) 1980 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
*/
#ifndef lint
-static char sccsid[] = "@(#)resume.c 5.1 (Berkeley) %G%";
-#endif not lint
+static char sccsid[] = "@(#)resume.c 5.4 (Berkeley) 4/16/91";
+#endif /* not lint */
+
/*
* Resume execution, first setting appropriate registers.
*/
#include "machine/pxerrors.h"
#include "pxinfo.h"
-#ifdef vax
- LOCAL ADDRESS fetchpc();
-#endif
-
-LOCAL ADDRESS *pcaddr;
-
/*
* Resume execution, set (get) pcode location counter before (after) resuming.
*/
resume()
{
register PROCESS *p;
- int oldsigno;
p = process;
do {
fflush(stdout);
}
pcont(p);
-# ifdef sun
- if (pcaddr == 0) {
- dread(&pcaddr, PCADDRP, sizeof(pcaddr));
- }
- dread(&pc, pcaddr, sizeof(pc));
-# else ifdef vax
- if (p->status == STOPPED) {
- if (isbperr()) {
- pc = p->reg[11];
- } else {
- dread(&pcframe, PCADDRP, sizeof(pcframe));
- pcframe++;
- pc = fetchpc(pcframe);
- }
- pc -= (sizeof(char) + ENDOFF);
- }
-# endif
+ dread(&pc, PCADDR, sizeof(pc)); /* Get pcode pc */
if (option('e')) {
printf("execution stops at pc 0x%x, lc %d on sig %d\n",
process->pc, pc, p->signo);
fflush(stdout);
}
- if (p->status == STOPPED) {
- errnum = 0;
- }
} while (p->signo == SIGCONT);
if (option('r') && p->signo != 0) {
choose();
*/
}
-#ifdef vax
-
-/*
- * 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.
- */
-
-typedef struct {
- int fr_handler;
- 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 */
-} Vaxframe;
-
-#define regsaved(frame, n) ((frame.fr_mask&(1 << n)) != 0)
-
-LOCAL ADDRESS fetchpc(framep)
-ADDRESS *framep;
-{
- register PROCESS *p;
- Vaxframe vframe;
- ADDRESS *savfp;
- ADDRESS r;
-
- p = process;
- r = p->reg[11];
- if (p->fp == (ADDRESS) framep) {
- return r;
- }
- 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));
- r -= sizeof(char);
- }
- 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));
- r -= sizeof(char);
- }
- return(r);
-}
-
-#endif
-
/*
* Under the -r option, we offer the opportunity to just get
* the px traceback and not actually enter the debugger.
}
}
fprintf(stderr, "\nProgram error");
- if (errnum != 0) {
- fprintf(stderr, " -- %s", pxerrmsg[errnum]);
- }
fprintf(stderr, "\nDo you wish to enter the debugger? ");
c = getchar();
if (c == 'n') {