snapshot: sagernet/gvisor v0.0.0-20250811.0-sing-box-mod.1
Содержимое пина, зафиксированного в go.mod sing-box-lx, одним коммитом без истории. Полная история SagerNet/gvisor — 1.45 ГБ и клонируется в каждой CI-джобе; наша дельта — одна вставка в одну функцию, история для неё не нужна. Module path github.com/sagernet/gvisor сохранён намеренно: на него опирается replace-директива суперпроекта. Патч поверх — отдельным коммитом, чтобы дельта читалась одним git show и переносилась на новый пин копированием. SPECS/TASKS/048-GVISOR_HANDSHAKE_NIL_CRASH
This commit is contained in:
commit
2c4ae3b0a4
712 changed files with 185689 additions and 0 deletions
130
pkg/abi/linux/rseq.go
Normal file
130
pkg/abi/linux/rseq.go
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
// Copyright 2019 The gVisor Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package linux
|
||||
|
||||
// Flags passed to rseq(2).
|
||||
//
|
||||
// Defined in include/uapi/linux/rseq.h.
|
||||
const (
|
||||
// RSEQ_FLAG_UNREGISTER unregisters the current thread.
|
||||
RSEQ_FLAG_UNREGISTER = 1 << 0
|
||||
)
|
||||
|
||||
// Critical section flags used in RSeqCriticalSection.Flags and RSeq.Flags.
|
||||
//
|
||||
// Defined in include/uapi/linux/rseq.h.
|
||||
const (
|
||||
// RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT inhibits restart on preemption.
|
||||
RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT = 1 << 0
|
||||
|
||||
// RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL inhibits restart on signal
|
||||
// delivery.
|
||||
RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL = 1 << 1
|
||||
|
||||
// RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE inhibits restart on CPU
|
||||
// migration.
|
||||
RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE = 1 << 2
|
||||
)
|
||||
|
||||
// RSeqCriticalSection describes a restartable sequences critical section. It
|
||||
// is equivalent to struct rseq_cs, defined in include/uapi/linux/rseq.h.
|
||||
//
|
||||
// In userspace, this structure is always aligned to 32 bytes.
|
||||
//
|
||||
// +marshal
|
||||
type RSeqCriticalSection struct {
|
||||
// Version is the version of this structure. Version 0 is defined here.
|
||||
Version uint32
|
||||
|
||||
// Flags are the critical section flags, defined above.
|
||||
Flags uint32
|
||||
|
||||
// Start is the start address of the critical section.
|
||||
Start uint64
|
||||
|
||||
// PostCommitOffset is the offset from Start of the first instruction
|
||||
// outside of the critical section.
|
||||
PostCommitOffset uint64
|
||||
|
||||
// Abort is the abort address. It must be outside the critical section,
|
||||
// and the 4 bytes prior must match the abort signature.
|
||||
Abort uint64
|
||||
}
|
||||
|
||||
const (
|
||||
// SizeOfRSeqCriticalSection is the size of RSeqCriticalSection.
|
||||
SizeOfRSeqCriticalSection = 32
|
||||
|
||||
// SizeOfRSeqSignature is the size of the signature immediately
|
||||
// preceding RSeqCriticalSection.Abort.
|
||||
SizeOfRSeqSignature = 4
|
||||
)
|
||||
|
||||
// Special values for RSeq.CPUID, defined in include/uapi/linux/rseq.h.
|
||||
const (
|
||||
// RSEQ_CPU_ID_UNINITIALIZED indicates that this thread has not
|
||||
// performed rseq initialization.
|
||||
RSEQ_CPU_ID_UNINITIALIZED = ^uint32(0) // -1
|
||||
|
||||
// RSEQ_CPU_ID_REGISTRATION_FAILED indicates that rseq initialization
|
||||
// failed.
|
||||
RSEQ_CPU_ID_REGISTRATION_FAILED = ^uint32(1) // -2
|
||||
)
|
||||
|
||||
// RSeq is the thread-local restartable sequences config/status. It
|
||||
// is equivalent to struct rseq, defined in include/uapi/linux/rseq.h.
|
||||
//
|
||||
// In userspace, this structure is always aligned to 32 bytes.
|
||||
type RSeq struct {
|
||||
// CPUIDStart contains the current CPU ID if rseq is initialized.
|
||||
//
|
||||
// This field should only be read by the thread which registered this
|
||||
// structure, and must be read atomically.
|
||||
CPUIDStart uint32
|
||||
|
||||
// CPUID contains the current CPU ID or one of the CPU ID special
|
||||
// values defined above.
|
||||
//
|
||||
// This field should only be read by the thread which registered this
|
||||
// structure, and must be read atomically.
|
||||
CPUID uint32
|
||||
|
||||
// RSeqCriticalSection is a pointer to the current RSeqCriticalSection
|
||||
// block, or NULL. It is reset to NULL by the kernel on restart or
|
||||
// non-restarting preempt/signal.
|
||||
//
|
||||
// This field should only be written by the thread which registered
|
||||
// this structure, and must be written atomically.
|
||||
RSeqCriticalSection uint64
|
||||
|
||||
// Flags are the critical section flags that apply to all critical
|
||||
// sections on this thread, defined above.
|
||||
Flags uint32
|
||||
}
|
||||
|
||||
const (
|
||||
// SizeOfRSeq is the size of RSeq.
|
||||
//
|
||||
// Note that RSeq is naively 24 bytes. However, it has 32-byte
|
||||
// alignment, which in C increases sizeof to 32. That is the size that
|
||||
// the Linux kernel uses.
|
||||
SizeOfRSeq = 32
|
||||
|
||||
// AlignOfRSeq is the standard alignment of RSeq.
|
||||
AlignOfRSeq = 32
|
||||
|
||||
// OffsetOfRSeqCriticalSection is the offset of RSeqCriticalSection in RSeq.
|
||||
OffsetOfRSeqCriticalSection = 8
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue