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