Source file 
src/runtime/signal_linux_s390x.go
     1  
     2  
     3  
     4  
     5  package runtime
     6  
     7  import (
     8  	"internal/abi"
     9  	"internal/goarch"
    10  	"internal/runtime/sys"
    11  	"unsafe"
    12  )
    13  
    14  type sigctxt struct {
    15  	info *siginfo
    16  	ctxt unsafe.Pointer
    17  }
    18  
    19  
    20  
    21  func (c *sigctxt) regs() *sigcontext {
    22  	return (*sigcontext)(unsafe.Pointer(&(*ucontext)(c.ctxt).uc_mcontext))
    23  }
    24  
    25  func (c *sigctxt) r0() uint64   { return c.regs().gregs[0] }
    26  func (c *sigctxt) r1() uint64   { return c.regs().gregs[1] }
    27  func (c *sigctxt) r2() uint64   { return c.regs().gregs[2] }
    28  func (c *sigctxt) r3() uint64   { return c.regs().gregs[3] }
    29  func (c *sigctxt) r4() uint64   { return c.regs().gregs[4] }
    30  func (c *sigctxt) r5() uint64   { return c.regs().gregs[5] }
    31  func (c *sigctxt) r6() uint64   { return c.regs().gregs[6] }
    32  func (c *sigctxt) r7() uint64   { return c.regs().gregs[7] }
    33  func (c *sigctxt) r8() uint64   { return c.regs().gregs[8] }
    34  func (c *sigctxt) r9() uint64   { return c.regs().gregs[9] }
    35  func (c *sigctxt) r10() uint64  { return c.regs().gregs[10] }
    36  func (c *sigctxt) r11() uint64  { return c.regs().gregs[11] }
    37  func (c *sigctxt) r12() uint64  { return c.regs().gregs[12] }
    38  func (c *sigctxt) r13() uint64  { return c.regs().gregs[13] }
    39  func (c *sigctxt) r14() uint64  { return c.regs().gregs[14] }
    40  func (c *sigctxt) r15() uint64  { return c.regs().gregs[15] }
    41  func (c *sigctxt) link() uint64 { return c.regs().gregs[14] }
    42  func (c *sigctxt) sp() uint64   { return c.regs().gregs[15] }
    43  
    44  
    45  
    46  func (c *sigctxt) pc() uint64 { return c.regs().psw_addr }
    47  
    48  func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
    49  func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr }
    50  
    51  func (c *sigctxt) set_r0(x uint64)      { c.regs().gregs[0] = x }
    52  func (c *sigctxt) set_r13(x uint64)     { c.regs().gregs[13] = x }
    53  func (c *sigctxt) set_link(x uint64)    { c.regs().gregs[14] = x }
    54  func (c *sigctxt) set_sp(x uint64)      { c.regs().gregs[15] = x }
    55  func (c *sigctxt) set_pc(x uint64)      { c.regs().psw_addr = x }
    56  func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
    57  func (c *sigctxt) set_sigaddr(x uint64) {
    58  	*(*uintptr)(add(unsafe.Pointer(c.info), 2*goarch.PtrSize)) = uintptr(x)
    59  }
    60  
    61  func dumpregs(c *sigctxt) {
    62  	print("r0   ", hex(c.r0()), "\t")
    63  	print("r1   ", hex(c.r1()), "\n")
    64  	print("r2   ", hex(c.r2()), "\t")
    65  	print("r3   ", hex(c.r3()), "\n")
    66  	print("r4   ", hex(c.r4()), "\t")
    67  	print("r5   ", hex(c.r5()), "\n")
    68  	print("r6   ", hex(c.r6()), "\t")
    69  	print("r7   ", hex(c.r7()), "\n")
    70  	print("r8   ", hex(c.r8()), "\t")
    71  	print("r9   ", hex(c.r9()), "\n")
    72  	print("r10  ", hex(c.r10()), "\t")
    73  	print("r11  ", hex(c.r11()), "\n")
    74  	print("r12  ", hex(c.r12()), "\t")
    75  	print("r13  ", hex(c.r13()), "\n")
    76  	print("r14  ", hex(c.r14()), "\t")
    77  	print("r15  ", hex(c.r15()), "\n")
    78  	print("pc   ", hex(c.pc()), "\t")
    79  	print("link ", hex(c.link()), "\n")
    80  }
    81  
    82  
    83  
    84  func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) }
    85  
    86  func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) }
    87  func (c *sigctxt) siglr() uintptr { return uintptr(c.link()) }
    88  func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) }
    89  
    90  
    91  func (c *sigctxt) preparePanic(sig uint32, gp *g) {
    92  	
    93  	
    94  	
    95  	
    96  	
    97  	
    98  	sp := c.sp() - sys.MinFrameSize
    99  	c.set_sp(sp)
   100  	*(*uint64)(unsafe.Pointer(uintptr(sp))) = c.link()
   101  
   102  	pc := uintptr(gp.sigpc)
   103  
   104  	if shouldPushSigpanic(gp, pc, uintptr(c.link())) {
   105  		
   106  		c.set_link(uint64(pc))
   107  	}
   108  
   109  	
   110  	c.set_r0(0)
   111  	c.set_r13(uint64(uintptr(unsafe.Pointer(gp))))
   112  	c.set_pc(uint64(abi.FuncPCABIInternal(sigpanic)))
   113  }
   114  
   115  func (c *sigctxt) pushCall(targetPC, resumePC uintptr) {
   116  	
   117  	
   118  	
   119  	
   120  	sp := c.sp() - 8
   121  	c.set_sp(sp)
   122  	*(*uint64)(unsafe.Pointer(uintptr(sp))) = c.link()
   123  	
   124  	
   125  	c.set_link(uint64(resumePC))
   126  	c.set_pc(uint64(targetPC))
   127  }
   128  
View as plain text