| // 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.Xcs) |
| case 11: |
| return Word(r.Xss) |
| case 12: |
| return Word(r.Xds) |
| case 13: |
| return Word(r.Xes) |
| case 14: |
| return Word(r.Xfs) |
| case 15: |
| return Word(r.Xgs) |
| } |
| 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.Xcs = int32(val) |
| case 11: |
| r.Xss = int32(val) |
| case 12: |
| r.Xds = int32(val) |
| case 13: |
| r.Xes = int32(val) |
| case 14: |
| r.Xfs = int32(val) |
| case 15: |
| r.Xgs = int32(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 |
| } |