github.com/nicocha30/gvisor-ligolo@v0.0.0-20230726075806-989fa2c0a413/pkg/sentry/platform/systrap/syscall_thread_amd64.go (about)

     1  // Copyright 2021 The gVisor Authors.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  //go:build amd64
    16  // +build amd64
    17  
    18  package systrap
    19  
    20  import (
    21  	"fmt"
    22  	"runtime"
    23  
    24  	"golang.org/x/sys/unix"
    25  	"github.com/nicocha30/gvisor-ligolo/pkg/sentry/arch"
    26  )
    27  
    28  func (t *syscallThread) detach() {
    29  	p := t.thread
    30  
    31  	// The syscall thread can't handle any signals and doesn't expect to
    32  	// receive anything.
    33  	t.maskAllSignalsAttached()
    34  
    35  	regs := p.initRegs
    36  	regs.Rsp = 0
    37  	regs.R12 = uint64(t.stubAddr)
    38  	regs.R13 = uint64(t.sentryMessage.state + 1)
    39  	regs.Rbx = _RUN_SYSCALL_LOOP
    40  	// Skip the syscall instruction.
    41  	regs.Rip += arch.SyscallWidth
    42  	if err := p.setRegs(&regs); err != nil {
    43  		panic(fmt.Sprintf("ptrace set regs failed: %v", err))
    44  	}
    45  	p.detach()
    46  	if _, _, e := unix.RawSyscall(unix.SYS_TGKILL, uintptr(p.tgid), uintptr(p.tid), uintptr(unix.SIGCONT)); e != 0 {
    47  		panic(fmt.Sprintf("tkill failed: %v", e))
    48  	}
    49  	runtime.UnlockOSThread()
    50  }