blob: 725223ccda8b210976e00fd89b5de1d27c205e8a [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package proc
import (
"os";
"strconv";
"syscall";
)
type _386Regs struct {
syscall.PtraceRegs;
setter func (*syscall.PtraceRegs) os.Error;
}
var names = [...]string {
"eax",
"ebx",
"ecx",
"edx",
"esi",
"edi",
"ebp",
"esp",
"eip",
"eflags",
"cs",
"ss",
"ds",
"es",
"fs",
"gs",
}
func (r *_386Regs) PC() Word {
return Word(r.Eip);
}
func (r *_386Regs) SetPC(val Word) os.Error {
r.Eip = int32(val);
return r.setter(&r.PtraceRegs);
}
func (r *_386Regs) Link() Word {
// TODO(austin)
panic("No link register");
}
func (r *_386Regs) SetLink(val Word) os.Error {
panic("No link register");
}
func (r *_386Regs) SP() Word {
return Word(r.Esp);
}
func (r *_386Regs) SetSP(val Word) os.Error {
r.Esp = int32(val);
return r.setter(&r.PtraceRegs);
}
func (r *_386Regs) Names() []string {
return &names;
}
func (r *_386Regs) Get(i int) Word {
switch i {
case 0: return Word(uint32(r.Eax));
case 1: return Word(uint32(r.Ebx));
case 2: return Word(uint32(r.Ecx));
case 3: return Word(uint32(r.Edx));
case 4: return Word(uint32(r.Esi));
case 5: return Word(uint32(r.Edi));
case 6: return Word(uint32(r.Ebp));
case 7: return Word(uint32(r.Esp));
case 8: return Word(uint32(r.Eip));
case 9: return Word(uint32(r.Eflags));
case 10: return Word(r.Cs);
case 11: return Word(r.Ss);
case 12: return Word(r.Ds);
case 13: return Word(r.Es);
case 14: return Word(r.Fs);
case 15: return Word(r.Gs);
}
panic("invalid register index ", strconv.Itoa(i));
}
func (r *_386Regs) Set(i int, val Word) os.Error {
switch i {
case 0: r.Eax = int32(val);
case 1: r.Ebx = int32(val);
case 2: r.Ecx = int32(val);
case 3: r.Edx = int32(val);
case 4: r.Esi = int32(val);
case 5: r.Edi = int32(val);
case 6: r.Ebp = int32(val);
case 7: r.Esp = int32(val);
case 8: r.Eip = int32(val);
case 9: r.Eflags = int32(val);
case 10: r.Cs = uint16(val);
case 11: r.Ss = uint16(val);
case 12: r.Ds = uint16(val);
case 13: r.Es = uint16(val);
case 14: r.Fs = uint16(val);
case 15: r.Gs = uint16(val);
default:
panic("invalid register index ", strconv.Itoa(i));
}
return r.setter(&r.PtraceRegs);
}
func newRegs(regs *syscall.PtraceRegs, setter func (*syscall.PtraceRegs) os.Error) Regs {
res := _386Regs{};
res.PtraceRegs = *regs;
res.setter = setter;
return &res;
}