Commit Diff


commit - ce2a378d46c0bcd00ec08b9bc4ad861c8aa28a2f
commit + 281c90a5be6b1ab2280ffa23885fe41e7af80bce
blob - 7fbffc4596f5cd78e163972c92a23db62ab1be1f
blob + a91468a2e27275a7446473fdc2891637a6a438bc
--- include/mach.h
+++ include/mach.h
@@ -540,6 +540,13 @@ struct ps_prochandle
 	int pid;
 };
 
+int		sys_ps_lgetregs(struct ps_prochandle*, uint, void*);
+int		sys_ps_lgetfpregs(struct ps_prochandle*, uint, void*);
+int		sys_ps_lsetregs(struct ps_prochandle*, uint, void*);
+int		sys_ps_lsetfpregs(struct ps_prochandle*, uint, void*);
+Regs*	threadregs(uint);
+int		pthreaddbinit(void);
+
 extern int machdebug;
 #if defined(__cplusplus)
 }
blob - 866816e8985498829cdf845b3567d18ab33314d0
blob + 95f768e824d22e254d4afa9182d6750480ddb5ec
--- src/cmd/acid/acid.h
+++ src/cmd/acid/acid.h
@@ -132,7 +132,10 @@ struct Store
 		String*	string;
 		List*	l;
 		Node*	cc;
-		char*	reg;
+		struct {
+			char *name;
+			uint	thread;
+		} reg;
 		Node*	con;
 	} u;
 };
@@ -258,6 +261,7 @@ String*	strnode(char*);
 String*	strnodlen(char*, int);
 #define system acidsystem
 char*	system(void);
+Regs*	threadregs(uint);
 int	trlist(Map*, Regs*, ulong, ulong, Symbol*, int);
 void	unwind(void);
 void	userinit(void);
blob - 316c49211f429a337243154fdbe8a03e3a5f2aff
blob + 8dbc1765dd506f488443d90b07fe4509493a24cd
--- src/cmd/acid/builtin.c
+++ src/cmd/acid/builtin.c
@@ -325,22 +325,33 @@ xkill(Node *r, Node *args)
 void
 xregister(Node *r, Node *args)
 {
+	int tid;
 	Regdesc *rp;
-	Node res;
+	Node res, resid;
+	Node *av[Maxarg];
 
-	if(args == 0)
-		error("register(string): arg count");
-	expr(args, &res);
-	if(res.type != TSTRING)
-		error("register(string): arg type");
+	na = 0;
+	flatten(av, args);
+	if(na != 1 && na != 2)
+		error("register(name[, threadid]): arg count");
 
+	expr(av[0], &res);
+	if(res.type != TSTRING)
+		error("register(name[, threadid]): arg type: name should be string");
+	tid = 0;
+	if(na == 2){
+		expr(av[1], &resid);
+		if(resid.type != TINT)
+			error("register(name[, threadid]): arg type: threadid should be int");
+		tid = resid.store.u.ival;
+	}
 	if((rp = regdesc(res.store.u.string->string)) == nil)
 		error("no such register");
-
 	r->op = OCONST;
 	r->type = TREG;
 	r->store.fmt = rp->format;
-	r->store.u.reg = rp->name;
+	r->store.u.reg.name = rp->name;
+	r->store.u.reg.thread = tid;
 }
 
 void
@@ -1127,7 +1138,10 @@ patom(char type, Store *res)
 
 	switch(type){
 	case TREG:
-		Bprint(bout, "register(\"%s\")", res->u.reg);
+		if(res->u.reg.thread)
+			Bprint(bout, "register(\"%s\", 0x%ux)", res->u.reg.name, res->u.reg.thread);
+		else
+			Bprint(bout, "register(\"%s\")", res->u.reg.name);
 		return;
 	case TCON:
 		Bprint(bout, "refconst(");
blob - 6a0430dc0b520239cbdee1eec96f8cd40b845cdb
blob + 822d7bb8b05842f219bba9eaf97fff51ca6f28a1
--- src/cmd/acid/expr.c
+++ src/cmd/acid/expr.c
@@ -135,7 +135,7 @@ oindm(Node *n, Node *res)
 		res->store.comt = l.store.comt;
 		break;
 	case TREG:
-		indirreg(correg, l.store.u.reg, l.store.fmt, res);
+		indirreg(threadregs(l.store.u.reg.thread), l.store.u.reg.name, l.store.fmt, res);
 		res->store.comt = l.store.comt;
 		break;
 	case TCON:
@@ -334,7 +334,7 @@ oasgn(Node *n, Node *res)
 	case OINDM:
 		expr(lp->left, &aes);
 		if(aes.type == TREG)
-			windirreg(correg, aes.store.u.reg, n->right, res);
+			windirreg(threadregs(aes.store.u.reg.thread), aes.store.u.reg.name, n->right, res);
 		else
 			windir(cormap, aes, n->right, res);
 		break;
@@ -1097,7 +1097,7 @@ acidregsrw(Regs *r, char *name, ulong *u, int isr)
 			werrstr("*%s: register %s not mapped", name, v->store.u.reg);
 			return -1;
 		}
-		return rget(correg, v->store.u.reg, u);
+		return rget(threadregs(v->store.u.reg.thread), v->store.u.reg.name, u);
 	case TCON:
 		n = v->store.u.con;
 		if(n->op != OCONST || n->type != TINT){
blob - 3ea3c4c0265b780b006203750cd51537d46f0098
blob + 3e6a313dd7fc0fa076c91ea71d10dcd6dd98f05a
--- src/cmd/acid/util.c
+++ src/cmd/acid/util.c
@@ -216,7 +216,8 @@ varreg(void)
 		l = mkvar(r->name);
 		v = l->v;
 		v->set = 1;
-		v->store.u.reg = r->name;
+		v->store.u.reg.name = r->name;
+		v->store.u.reg.thread = 0;
 		v->store.fmt = r->format;
 		v->type = TREG;
 
blob - ff727409faa4cbaaa4e846f320d3a9a7bb9ddaba
blob + 893ef6b481e54f81e45c08f8b6784c22027b4e3b
--- src/libmach/Linux.c
+++ src/libmach/Linux.c
@@ -447,7 +447,48 @@ proctextfile(int pid)
 	return nil;
 }
 
+int
+sys_ps_lgetregs(struct ps_prochandle *ph, uint tid, void *regs)
+{
+	int i, oldpid;
+	uint u, *uregs;
+	
+	oldpid = corpid;
+	ptraceattach(tid);
+	uregs = (uint*)regs;
+	for(i=0; i<sizeof(UregLinux386)/sizeof(uint); i++){
+		errno = 0;
+		u = ptrace(PTRACE_PEEKUSER, tid, 4*i, 0);
+		if(errno)
+			return 1;
+		uregs[i] = u;
+	}
+	ptraceattach(oldpid);
+	return 0;
+}
 
+int
+sys_ps_lsetregs(struct ps_prochandle *ph, uint tid, void *regs)
+{
+	return 1;
+}
+
+int
+sys_ps_lgetfpregs(struct ps_prochandle *ph, uint tid, void *regs)
+{
+	return 1;
+}
+
+
+int
+sys_ps_lsetfpregs(struct ps_prochandle *ph, uint tid, void *regs)
+{
+	return 1;
+}
+
+
+
+
 #if 0
 	snprint(buf, sizeof buf, "/proc/%d/maps", pid);
 	if((b = Bopen(buf, OREAD)) == nil){
blob - a6d6507e2ca4c6e73e26ebecbd6141558485793e
blob + 470f7454f5f6f096403d5e9d44f520490226bbf0
--- src/libmach/mkfile
+++ src/libmach/mkfile
@@ -33,6 +33,7 @@ OFILES=\
 	machocorepower.$O\
 	machpower.$O\
 	map.$O\
+	pthread.$O\
 	regs.$O\
 	stabs.$O\
 	swap.$O\
blob - 8a2b60a989069685e0cb23c48469981d24e44973
blob + 010887d3442ef52fb2ff273f23958edd54e6296d
--- src/libmach/pthread.c
+++ src/libmach/pthread.c
@@ -5,104 +5,11 @@
 #include <sys/procfs.h>	/* psaddr_t */
 #include <libc.h>
 #include <mach.h>
-
-typedef struct Ptprog Ptprog;
-struct Pprog
-{
-	Pthread *t;
-	uint nt;
-};
-
-typedef struct Pthread Pthread;
-struct Pthread
-{
-	td_thrhandle_t handle;
-};
-
-void
-pthreadattach(int pid)
-{
-	
-}
-
-void pthreadattach()
-	set up mapping
-
-Regs *pthreadregs()
-int npthread();
-
-
-
-static int td_get_allthreads(td_thragent_t*, td_thrhandle_t**);
-static int terr(int);
-
-
-Regs*
-threadregs()
-{
-
-}
-
-
-
-typedef struct AllThread AllThread;
-struct AllThread
-{
-	td_thrhandle_t *a;
-	int n;
-	int err;
-};
-
-static int
-thritercb(const td_thrhandle_t *th, void *cb)
-{
-	td_thrhandle_t **p;
-	AllThread *a;
-	int n;
-
-	a = cb;
-	if((a->n&(a->n-1)) == 0){
-		if(a->n == 0)
-			n = 1;
-		else
-			n = a->n<<1;
-		if((p = realloc(a->a, n*sizeof a->a[0])) == 0){
-			a->err = -1;
-			return -1;	/* stop iteration */
-		}
-		a->a = p;
-	}
-	a->a[a->n++] = *th;
-	return 0;
-}
-
-int
-td_get_allthreads(td_thragent_t *ta, td_thrhandle_t **pall)
-{
-	int e;
-	AllThread a;
+#include "ureg386.h"
+#include "elf.h"
 
-	a.a = nil;
-	a.n = 0;
-	a.err = 0;
-	if((e = td_ta_thr_iter(ta, thritercb, &a, 
-		TD_THR_ANY_STATE,
-		TD_THR_LOWEST_PRIORITY,
-		TD_SIGNO_MASK,
-		TD_THR_ANY_USER_FLAGS)) != TD_OK){
-		werrstr("%s", terr(e));
-		return -1;
-	}
+static char *terr(int);
 
-	if(a.err){
-		free(a.a);
-		return -1;
-	}
-
-	*pall = a.a;
-	return a.n;
-}
-
 static char *tderrstr[] =
 {
 [TD_OK]			"no error",
@@ -132,6 +39,8 @@ static char *tderrstr[] =
 [TD_NOTLS]		"there is no TLS segment in the given module",
 };
 
+static td_thragent_t *ta;
+
 static char*
 terr(int e)
 {
@@ -144,6 +53,45 @@ terr(int e)
 	return tderrstr[e];
 }
 
+int
+pthreaddbinit(void)
+{
+	int e;
+	struct ps_prochandle p;
+	
+	p.pid = 0;
+	if((e = td_ta_new(&p, &ta)) != TD_OK){
+		werrstr("%s", terr(e));
+		return -1;
+	}
+	return 0;
+}
+
+Regs*
+threadregs(uint tid)
+{
+	int e;
+	static UregRegs r;
+	static Ureg u;
+	td_thrhandle_t th;
+	prgregset_t regs;
+
+	if(tid == 0)
+		return correg;
+	if(!ta)
+		pthreaddbinit();
+	if((e = td_ta_map_id2thr(ta, tid, &th)) != TD_OK
+	|| (e = td_thr_getgregs(&th, regs)) != TD_OK){
+		werrstr("reading thread registers: %s", terr(e));
+		return nil;
+	}
+	linux2ureg386((UregLinux386*)regs, &u);
+	r.r.rw = _uregrw;
+	r.ureg = (uchar*)&u;
+	return &r.r;
+}
+
+
 /*
  * bottom-end functions for libthread_db to call
  */
@@ -192,7 +140,7 @@ ps_lcontinue(const struct ps_prochandle *ph)
 int
 ps_pdread(struct ps_prochandle *ph, psaddr_t addr, void *v, size_t sz)
 {
-	if(get1(ph->map, addr, v, sz) < 0)
+	if(get1(cormap, (ulong)addr, v, sz) < 0)
 		return PS_ERR;
 	return PS_OK;
 }
@@ -200,7 +148,7 @@ ps_pdread(struct ps_prochandle *ph, psaddr_t addr, voi
 int
 ps_pdwrite(struct ps_prochandle *ph, psaddr_t addr, void *v, size_t sz)
 {
-	if(put1(ph->map, addr, v, sz) < 0)
+	if(put1(cormap, (ulong)addr, v, sz) < 0)
 		return PS_ERR;
 	return PS_OK;
 }
@@ -227,7 +175,7 @@ ps_lgetregs(struct ps_prochandle *ph, lwpid_t lwp, prg
 		return sys_ps_lgetregs(ph, lwp, regs);
 	for(i=0; i<corhdr->nthread; i++){
 		if(corhdr->thread[i].id == lwp){
-			ureg2prgregset(corhdr->thread[i].ureg, regs);
+			ureg2linux386(corhdr->thread[i].ureg, (UregLinux386*)regs);
 			return PS_OK;
 		}
 	}
@@ -248,7 +196,7 @@ ps_lgetfpregs(struct ps_prochandle *ph, lwpid_t lwp, p
 	if(corhdr == nil)
 		return sys_ps_lgetfpregs(ph, lwp, fpregs);
 	/* BUG - Look in core dump. */
-	return PS_ERR:
+	return PS_ERR;
 }
 
 int
@@ -265,7 +213,8 @@ ps_lsetfpregs(struct ps_prochandle *ph, lwpid_t lwp, p
 int
 ps_get_thread_area(struct ps_prochandle *ph, lwpid_t lwp, int xxx, psaddr_t *addr)
 {
-	return sys_ps_get_thread_area(ph, lwp, xxx, addr);
+	return PS_ERR;
+//	return sys_ps_get_thread_area(ph, lwp, xxx, addr);
 }
 
 int