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(®s); 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 }