summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2014-11-19 14:56:49 -0500
committerAustin Clements <austin@google.com>2014-11-19 14:56:49 -0500
commit235dd4c7f2e1c75498e6ff5c81ba0d6269464993 (patch)
tree80a985045922cb181a71c805fe4a034551a49d37
parent9a7a6cdead943e05114d54daf86b075397a32029 (diff)
downloadgo-235dd4c7f2e1c75498e6ff5c81ba0d6269464993.tar.gz
[dev.cc] runtime: add explicit siginfo.si_addr field
struct siginfo_t's si_addr field is part of a union. Previously, we represented this union in Go using an opaque byte array and accessed the si_addr field using unsafe (and wrong on 386 and arm!) pointer arithmetic. Since si_addr is the only field we use from this union, this replaces the opaque byte array with an explicit declaration of the si_addr field and accesses it directly. LGTM=minux, rsc R=rsc, minux CC=golang-codereviews https://codereview.appspot.com/179970044
-rw-r--r--src/runtime/defs_linux_386.go9
-rw-r--r--src/runtime/defs_linux_amd64.go10
-rw-r--r--src/runtime/defs_linux_arm.go9
-rw-r--r--src/runtime/defs_linux_power64.go10
-rw-r--r--src/runtime/defs_linux_power64le.go10
-rw-r--r--src/runtime/signal_linux_386.go2
-rw-r--r--src/runtime/signal_linux_amd64.go2
-rw-r--r--src/runtime/signal_linux_arm.go2
-rw-r--r--src/runtime/signal_linux_power64x.go2
9 files changed, 29 insertions, 27 deletions
diff --git a/src/runtime/defs_linux_386.go b/src/runtime/defs_linux_386.go
index ddf592c91..f55924b61 100644
--- a/src/runtime/defs_linux_386.go
+++ b/src/runtime/defs_linux_386.go
@@ -155,10 +155,11 @@ type sigactiont struct {
}
type siginfo struct {
- si_signo int32
- si_errno int32
- si_code int32
- _sifields [116]byte
+ si_signo int32
+ si_errno int32
+ si_code int32
+ // below here is a union; si_addr is the only field we use
+ si_addr uint32
}
type sigaltstackt struct {
diff --git a/src/runtime/defs_linux_amd64.go b/src/runtime/defs_linux_amd64.go
index 7f8f5816c..a73f47514 100644
--- a/src/runtime/defs_linux_amd64.go
+++ b/src/runtime/defs_linux_amd64.go
@@ -117,11 +117,11 @@ type sigactiont struct {
}
type siginfo struct {
- si_signo int32
- si_errno int32
- si_code int32
- pad_cgo_0 [4]byte
- _sifields [112]byte
+ si_signo int32
+ si_errno int32
+ si_code int32
+ // below here is a union; si_addr is the only field we use
+ si_addr uint64
}
type itimerval struct {
diff --git a/src/runtime/defs_linux_arm.go b/src/runtime/defs_linux_arm.go
index a874b1594..c3a6e2f01 100644
--- a/src/runtime/defs_linux_arm.go
+++ b/src/runtime/defs_linux_arm.go
@@ -147,10 +147,11 @@ type itimerval struct {
}
type siginfo struct {
- si_signo int32
- si_errno int32
- si_code int32
- _sifields [4]uint8
+ si_signo int32
+ si_errno int32
+ si_code int32
+ // below here is a union; si_addr is the only field we use
+ si_addr uint32
}
type sigactiont struct {
diff --git a/src/runtime/defs_linux_power64.go b/src/runtime/defs_linux_power64.go
index 0dfc09caa..f90b84874 100644
--- a/src/runtime/defs_linux_power64.go
+++ b/src/runtime/defs_linux_power64.go
@@ -121,11 +121,11 @@ type sigactiont struct {
}
type siginfo struct {
- si_signo int32
- si_errno int32
- si_code int32
- pad_cgo_0 [4]byte
- _sifields [112]byte
+ si_signo int32
+ si_errno int32
+ si_code int32
+ // below here is a union; si_addr is the only field we use
+ si_addr uint64
}
type itimerval struct {
diff --git a/src/runtime/defs_linux_power64le.go b/src/runtime/defs_linux_power64le.go
index 0dfc09caa..f90b84874 100644
--- a/src/runtime/defs_linux_power64le.go
+++ b/src/runtime/defs_linux_power64le.go
@@ -121,11 +121,11 @@ type sigactiont struct {
}
type siginfo struct {
- si_signo int32
- si_errno int32
- si_code int32
- pad_cgo_0 [4]byte
- _sifields [112]byte
+ si_signo int32
+ si_errno int32
+ si_code int32
+ // below here is a union; si_addr is the only field we use
+ si_addr uint64
}
type itimerval struct {
diff --git a/src/runtime/signal_linux_386.go b/src/runtime/signal_linux_386.go
index 41eae80ea..085f66e89 100644
--- a/src/runtime/signal_linux_386.go
+++ b/src/runtime/signal_linux_386.go
@@ -26,7 +26,7 @@ func (c *sigctxt) cs() uint32 { return uint32(c.regs().cs) }
func (c *sigctxt) fs() uint32 { return uint32(c.regs().fs) }
func (c *sigctxt) gs() uint32 { return uint32(c.regs().gs) }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
-func (c *sigctxt) sigaddr() uint32 { return uint32(*(*uintptr)(add(unsafe.Pointer(c.info), 2*ptrSize))) }
+func (c *sigctxt) sigaddr() uint32 { return c.info.si_addr }
func (c *sigctxt) set_eip(x uint32) { c.regs().eip = x }
func (c *sigctxt) set_esp(x uint32) { c.regs().esp = x }
diff --git a/src/runtime/signal_linux_amd64.go b/src/runtime/signal_linux_amd64.go
index d94b19102..5e339b8a4 100644
--- a/src/runtime/signal_linux_amd64.go
+++ b/src/runtime/signal_linux_amd64.go
@@ -36,7 +36,7 @@ func (c *sigctxt) cs() uint64 { return uint64(c.regs().cs) }
func (c *sigctxt) fs() uint64 { return uint64(c.regs().fs) }
func (c *sigctxt) gs() uint64 { return uint64(c.regs().gs) }
func (c *sigctxt) sigcode() uint64 { return uint64(c.info.si_code) }
-func (c *sigctxt) sigaddr() uint64 { return uint64(*(*uintptr)(add(unsafe.Pointer(c.info), 2*ptrSize))) }
+func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr }
func (c *sigctxt) set_rip(x uint64) { c.regs().rip = x }
func (c *sigctxt) set_rsp(x uint64) { c.regs().rsp = x }
diff --git a/src/runtime/signal_linux_arm.go b/src/runtime/signal_linux_arm.go
index 4a5670e74..bdb4314fa 100644
--- a/src/runtime/signal_linux_arm.go
+++ b/src/runtime/signal_linux_arm.go
@@ -35,7 +35,7 @@ func (c *sigctxt) error() uint32 { return c.regs().error_code }
func (c *sigctxt) oldmask() uint32 { return c.regs().oldmask }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
-func (c *sigctxt) sigaddr() uint32 { return uint32(*(*uintptr)(add(unsafe.Pointer(c.info), 2*ptrSize))) }
+func (c *sigctxt) sigaddr() uint32 { return c.info.si_addr }
func (c *sigctxt) set_pc(x uint32) { c.regs().pc = x }
func (c *sigctxt) set_sp(x uint32) { c.regs().sp = x }
diff --git a/src/runtime/signal_linux_power64x.go b/src/runtime/signal_linux_power64x.go
index 8f357033b..0a406b31f 100644
--- a/src/runtime/signal_linux_power64x.go
+++ b/src/runtime/signal_linux_power64x.go
@@ -56,7 +56,7 @@ func (c *sigctxt) xer() uint64 { return c.regs().xer }
func (c *sigctxt) ccr() uint64 { return c.regs().ccr }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
-func (c *sigctxt) sigaddr() uint64 { return uint64(*(*uintptr)(add(unsafe.Pointer(c.info), 2*ptrSize))) }
+func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr }
func (c *sigctxt) fault() uint64 { return c.regs().dar }
func (c *sigctxt) set_r0(x uint64) { c.regs().gpr[0] = x }