Go Home Page
The Go Programming Language

Source file src/pkg/debug/proc/regs_linux_386.go

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