| // 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 | |
| } |