]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.cc] runtime: add explicit siginfo.si_addr field
authorAustin Clements <austin@google.com>
Wed, 19 Nov 2014 19:56:49 +0000 (14:56 -0500)
committerAustin Clements <austin@google.com>
Wed, 19 Nov 2014 19:56:49 +0000 (14:56 -0500)
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://golang.org/cl/179970044

src/runtime/defs_linux_386.go
src/runtime/defs_linux_amd64.go
src/runtime/defs_linux_arm.go
src/runtime/defs_linux_power64.go
src/runtime/defs_linux_power64le.go
src/runtime/signal_linux_386.go
src/runtime/signal_linux_amd64.go
src/runtime/signal_linux_arm.go
src/runtime/signal_linux_power64x.go

index ddf592c91bd350193f56a3d7ffbd80d73b150400..f55924b61cbb75657590df47c8b53812fcc00fa6 100644 (file)
@@ -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 {
index 7f8f5816c62b566656e2800f470a527e724d53d3..a73f475148201ec3899ca4f852be1bdac3400c51 100644 (file)
@@ -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 {
index a874b15941310e99d6785711b6f35a5317423dfd..c3a6e2f01962cdde0ac9bcafa4846805ee416065 100644 (file)
@@ -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 {
index 0dfc09caa45e89f194e14680a67952080e18ad22..f90b84874bd758a6901b78bdb009f5c4775f47d6 100644 (file)
@@ -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 {
index 0dfc09caa45e89f194e14680a67952080e18ad22..f90b84874bd758a6901b78bdb009f5c4775f47d6 100644 (file)
@@ -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 {
index 41eae80ea2bacf5c8b17229a7426e3dfdb939921..085f66e8984cfe12a4d844bcde734c39c9f9898f 100644 (file)
@@ -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 }
index d94b191024a2672b59523f7fc1979b9606dc66ed..5e339b8a46fe1718c2c8d6d7a02a3e1dc89e50e2 100644 (file)
@@ -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 }
index 4a5670e740a11bc08918e5825fe223a5f9f3a4ad..bdb4314fa8dd27e0aea5ce73359416bd9ab73a0c 100644 (file)
@@ -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 }
index 8f357033bf9820e04a35ca401e4001c65a6ceba1..0a406b31fc09da198ca39100328419766b8edbf7 100644 (file)
@@ -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 }