1
0
mirror of https://github.com/golang/go synced 2024-09-25 01:30:13 -06:00

libmach: implement register fetch for 32-bit x86 kernel

Also use memmove to silence some gcc warnings.

Fixes #1036.

R=r, EtherealMachine
CC=golang-dev
https://golang.org/cl/1943049
This commit is contained in:
Russ Cox 2010-08-20 20:49:47 -04:00
parent dbbe32ee53
commit c560c8a9c3

View File

@ -759,9 +759,9 @@ ptracerw(int type, int xtype, int isr, int pid, uvlong addr, void *v, uint n)
if(errno)
goto ptraceerr;
if(n-i >= sizeof(uintptr))
*(uintptr*)((char*)v+i) = u;
memmove((char*)v+i, &u, sizeof(uintptr));
else{
*(uintptr*)buf = u;
memmove(buf, &u, sizeof u);
memmove((char*)v+i, buf, n-i);
}
}else{
@ -772,9 +772,9 @@ ptracerw(int type, int xtype, int isr, int pid, uvlong addr, void *v, uint n)
u = ptrace(xtype, pid, addr+i, 0);
if(errno)
return -1;
*(uintptr*)buf = u;
memmove(buf, &u, sizeof u);
memmove(buf, (char*)v+i, n-i);
u = *(uintptr*)buf;
memmove(&u, buf, sizeof u);
}
if(ptrace(type, pid, addr+i, u) < 0)
goto ptraceerr;
@ -810,9 +810,22 @@ ptracesegrw(Map *map, Seg *seg, uvlong addr, void *v, uint n, int isr)
// Go 32-bit is
// DI SI BP NSP BX DX CX AX GS FS ES DS TRAP ECODE PC CS EFLAGS SP SS
// uint go32tolinux32tab[] = {
// 4, 3, 5, 15, 0, 2, 1, 6, 10, 9, 8, 7, -1, -1, 12, 13, 14, 15, 16
// };
uint go32tolinux32tab[] = {
4, 3, 5, 15, 0, 2, 1, 6, 10, 9, 8, 7, -1, -1, 12, 13, 14, 15, 16
};
static int
go32tolinux32(uvlong addr)
{
int r;
if(addr%4 || addr/4 >= nelem(go32tolinux32tab))
return -1;
r = go32tolinux32tab[addr/4];
if(r < 0)
return -1;
return r*4;
}
uint go32tolinux64tab[] = {
14, 13, 4, 19, 5, 12, 11, 10, 26, 25, 24, 23, -1, -1, 16, 17, 18, 19, 20
};
@ -830,15 +843,24 @@ go32tolinux64(uvlong addr)
}
extern Mach mi386;
extern Mach mamd64;
static int
go2linux(uvlong addr)
{
// TODO(rsc): If this file is being compiled in 32-bit mode,
// need to use the go32tolinux32 table instead.
if(sizeof(void*) == 4) {
if(mach == &mi386)
return go32tolinux32(addr);
werrstr("unsupported architecture");
return -1;
}
if(mach == &mi386)
return go32tolinux64(addr);
if(mach != &mamd64) {
werrstr("unsupported architecture");
return -1;
}
switch(addr){
case offsetof(Ureg64, ax):