1
0
mirror of https://github.com/golang/go synced 2024-09-30 19:28:32 -06:00

runtime: introduce CPU access functions on windows

This CL introduces new methods for 'context' type, so we can
manipulate its values in an architecture independent way.

Use new methods to replace both 386 and amd64 versions of
dosigprof with single piece of code.

There is more similar code to be converted in the following CLs.

Also remove os_windows_386.go and os_windows_amd64.go. These
contain unused functions.

Change-Id: I28f76aeb97f6e4249843d30d3d0c33fb233d3f7f
Reviewed-on: https://go-review.googlesource.com/2790
Reviewed-by: Minux Ma <minux@golang.org>
This commit is contained in:
Alex Brainman 2015-01-14 12:25:55 +11:00
parent 1e5d8bb544
commit 5c4a86d0d0
7 changed files with 13 additions and 31 deletions

View File

@ -101,6 +101,12 @@ type context struct {
extendedregisters [512]uint8
}
func (c *context) ip() uintptr { return uintptr(c.eip) }
func (c *context) sp() uintptr { return uintptr(c.esp) }
func (c *context) setip(x uintptr) { c.eip = uint32(x) }
func (c *context) setsp(x uintptr) { c.esp = uint32(x) }
type overlapped struct {
internal uint32
internalhigh uint32

View File

@ -116,6 +116,12 @@ type context struct {
lastexceptionfromrip uint64
}
func (c *context) ip() uintptr { return uintptr(c.rip) }
func (c *context) sp() uintptr { return uintptr(c.rsp) }
func (c *context) setip(x uintptr) { c.rip = uint64(x) }
func (c *context) setsp(x uintptr) { c.rsp = uint64(x) }
type overlapped struct {
internal uint64
internalhigh uint64

View File

@ -506,7 +506,7 @@ func profilem(mp *m) {
r = (*context)(unsafe.Pointer((uintptr(unsafe.Pointer(&rbuf[15]))) &^ 15))
r.contextflags = _CONTEXT_CONTROL
stdcall2(_GetThreadContext, mp.thread, uintptr(unsafe.Pointer(r)))
dosigprof(r, gp, mp)
sigprof((*byte)(unsafe.Pointer(r.ip())), (*byte)(unsafe.Pointer(r.sp())), nil, gp, mp)
}
func profileloop1() {

View File

@ -118,7 +118,3 @@ func sigenable(sig uint32) {
func sigdisable(sig uint32) {
}
func dosigprof(r *context, gp *g, mp *m) {
sigprof((*byte)(unsafe.Pointer(uintptr(r.eip))), (*byte)(unsafe.Pointer(uintptr(r.esp))), nil, gp, mp)
}

View File

@ -137,7 +137,3 @@ func sigenable(sig uint32) {
func sigdisable(sig uint32) {
}
func dosigprof(r *context, gp *g, mp *m) {
sigprof((*byte)(unsafe.Pointer(uintptr(r.rip))), (*byte)(unsafe.Pointer(uintptr(r.rsp))), nil, gp, mp)
}

View File

@ -1,11 +0,0 @@
// Copyright 2014 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 runtime
// contextPC returns the EIP (program counter) register from the context.
func contextPC(r *context) uintptr { return uintptr(r.eip) }
// contextSP returns the ESP (stack pointer) register from the context.
func contextSP(r *context) uintptr { return uintptr(r.esp) }

View File

@ -1,11 +0,0 @@
// Copyright 2014 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 runtime
// contextPC returns the RIP (program counter) register from the context.
func contextPC(r *context) uintptr { return uintptr(r.rip) }
// contextSP returns the RSP (stack pointer) register from the context.
func contextSP(r *context) uintptr { return uintptr(r.rsp) }