V10/cmd/adb/cray/trace.c

Compare this file to the similar file:
Show the results in this format:

/*
 * ptrace goo for reading and writing
 * cray version: io is addressed by words.  careful.
 */

#include "defs.h"
#include "space.h"
#include "ptrace.h"
#include "machine.h"

#define	min(a, b)	(((a) < (b)) ? (a) : (b))
extern int errno;

ptri(addr, space, buf, size)
ADDR addr;
int space;
register char *buf;
int size;
{
	PTWORD w;
	register char *p, *q;
	register int n;
	register int off;
	int rf;

	switch (space & SPTYPE) {
	default:
	case INSTSP:
		rf = P_RDI;
		break;

	case DATASP:
		rf = P_RDD;
		break;

	case UBLKSP:
		rf = P_RDU;
		break;
	}
	for (p = buf, n = size; n > 0; n--)
		*p++ = 0;
	off = waoff(addr);
	while (size) {
		errno = 0;
		w = ptrace(rf, pid, batowa(addr), 0);
		if (errno) {
			errflg = "process address not found";
			return (0);
		}
		p = (char *)&w + off;
		for (n = min(size, sizeof(w) - off); n > 0; size--, n--)
			*buf++ = *p++;
		addr += sizeof(w);
		off = 0;
	}
	return (1);
}

ptro(addr, space, buf, size)
ADDR addr;
int space;
register char *buf;
int size;
{
	PTWORD w;
	register char *p;
	register int n;
	register int off;
	int rf, wf;

	switch (space & SPTYPE) {
	default:
	case INSTSP:
		rf = P_RDI;
		wf = P_WRI;
		break;

	case DATASP:
		rf = P_RDD;
		wf = P_WRD;
		break;

	case UBLKSP:
		rf = P_RDU;
		wf = P_WRU;
		break;
	}
	off = waoff(addr);
	while (size) {
		errno = 0;
		w = ptrace(rf, pid, batowa(addr), 0);
		if (errno) {
			errflg = "process address not found";
			return (0);
		}
		p = (char *)&w + off;
		for (n = min(size, sizeof(w) - off); n > 0; size--, n--)
			*p++ = *buf++;
		errno = 0;
		ptrace(wf, pid, batowa(addr), w);
		if (errno) {
			errflg = "process address not found";
			return (0);
		}
		addr += sizeof(w);
	}
	return (1);
}