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
226
pkg/marshal/marshal.go
Normal file
226
pkg/marshal/marshal.go
Normal file
|
|
@ -0,0 +1,226 @@
|
|||
// 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 marshal defines the Marshallable interface for
|
||||
// serialize/deserializing go data structures to/from memory, according to the
|
||||
// Linux ABI.
|
||||
//
|
||||
// Implementations of this interface are typically automatically generated by
|
||||
// tools/go_marshal. See the go_marshal README for details.
|
||||
package marshal
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/sagernet/gvisor/pkg/hostarch"
|
||||
)
|
||||
|
||||
// CopyContext defines the memory operations required to marshal to and from
|
||||
// user memory. Typically, kernel.Task is used to provide implementations for
|
||||
// these operations.
|
||||
type CopyContext interface {
|
||||
// CopyScratchBuffer provides a task goroutine-local scratch buffer. See
|
||||
// kernel.CopyScratchBuffer.
|
||||
CopyScratchBuffer(size int) []byte
|
||||
|
||||
// CopyOutBytes writes the contents of b to the task's memory. See
|
||||
// kernel.CopyOutBytes.
|
||||
CopyOutBytes(addr hostarch.Addr, b []byte) (int, error)
|
||||
|
||||
// CopyInBytes reads the contents of the task's memory to b. See
|
||||
// kernel.CopyInBytes.
|
||||
CopyInBytes(addr hostarch.Addr, b []byte) (int, error)
|
||||
}
|
||||
|
||||
// Marshallable represents operations on a type that can be marshalled to and
|
||||
// from memory.
|
||||
//
|
||||
// go-marshal automatically generates implementations for this interface for
|
||||
// types marked as '+marshal'.
|
||||
type Marshallable interface {
|
||||
io.WriterTo
|
||||
|
||||
// SizeBytes is the size of the memory representation of a type in
|
||||
// marshalled form.
|
||||
//
|
||||
// SizeBytes must handle a nil receiver. Practically, this means SizeBytes
|
||||
// cannot deference any fields on the object implementing it (but will
|
||||
// likely make use of the type of these fields).
|
||||
SizeBytes() int
|
||||
|
||||
// MarshalBytes serializes a copy of a type to dst and returns the remaining
|
||||
// buffer.
|
||||
// Precondition: dst must be at least SizeBytes() in length.
|
||||
MarshalBytes(dst []byte) []byte
|
||||
|
||||
// UnmarshalBytes deserializes a type from src and returns the remaining
|
||||
// buffer.
|
||||
// Precondition: src must be at least SizeBytes() in length.
|
||||
UnmarshalBytes(src []byte) []byte
|
||||
|
||||
// Packed returns true if the marshalled size of the type is the same as the
|
||||
// size it occupies in memory. This happens when the type has no fields
|
||||
// starting at unaligned addresses (should always be true by default for ABI
|
||||
// structs, verified by automatically generated tests when using
|
||||
// go_marshal), and has no fields marked `marshal:"unaligned"`.
|
||||
//
|
||||
// Packed must return the same result for all possible values of the type
|
||||
// implementing it. Violating this constraint implies the type doesn't have
|
||||
// a static memory layout, and will lead to memory corruption.
|
||||
// Go-marshal-generated code reuses the result of Packed for multiple values
|
||||
// of the same type.
|
||||
Packed() bool
|
||||
|
||||
// MarshalUnsafe serializes a type by bulk copying its in-memory
|
||||
// representation to the dst buffer. This is only safe to do when the type
|
||||
// has no implicit padding, see Marshallable.Packed. When Packed would
|
||||
// return false, MarshalUnsafe should fall back to the safer but slower
|
||||
// MarshalBytes.
|
||||
// Precondition: dst must be at least SizeBytes() in length.
|
||||
MarshalUnsafe(dst []byte) []byte
|
||||
|
||||
// UnmarshalUnsafe deserializes a type by directly copying to the underlying
|
||||
// memory allocated for the object by the runtime.
|
||||
//
|
||||
// This allows much faster unmarshalling of types which have no implicit
|
||||
// padding, see Marshallable.Packed. When Packed would return false,
|
||||
// UnmarshalUnsafe should fall back to the safer but slower unmarshal
|
||||
// mechanism implemented in UnmarshalBytes.
|
||||
// Precondition: src must be at least SizeBytes() in length.
|
||||
UnmarshalUnsafe(src []byte) []byte
|
||||
|
||||
// CopyIn deserializes a Marshallable type from a task's memory. This may
|
||||
// only be called from a task goroutine. This is more efficient than calling
|
||||
// UnmarshalUnsafe on Marshallable.Packed types, as the type being
|
||||
// marshalled does not escape. The implementation should avoid creating
|
||||
// extra copies in memory by directly deserializing to the object's
|
||||
// underlying memory.
|
||||
//
|
||||
// If the copy-in from the task memory is only partially successful, CopyIn
|
||||
// should still attempt to deserialize as much data as possible. See comment
|
||||
// for UnmarshalBytes.
|
||||
CopyIn(cc CopyContext, addr hostarch.Addr) (int, error)
|
||||
|
||||
// CopyInN is like CopyIn, but explicitly requests a partial
|
||||
// copy-in. Note that this may yield unexpected results for non-packed
|
||||
// types and the caller may only want to allow this for packed types. See
|
||||
// comment on UnmarshalBytes.
|
||||
//
|
||||
// The limit must be less than or equal to SizeBytes().
|
||||
CopyInN(cc CopyContext, addr hostarch.Addr, limit int) (int, error)
|
||||
|
||||
// CopyOut serializes a Marshallable type to a task's memory. This may only
|
||||
// be called from a task goroutine. This is more efficient than calling
|
||||
// MarshalUnsafe on Marshallable.Packed types, as the type being serialized
|
||||
// does not escape. The implementation should avoid creating extra copies in
|
||||
// memory by directly serializing from the object's underlying memory.
|
||||
//
|
||||
// The copy-out to the task memory may be partially successful, in which
|
||||
// case CopyOut returns how much data was serialized. See comment for
|
||||
// MarshalBytes for implications.
|
||||
CopyOut(cc CopyContext, addr hostarch.Addr) (int, error)
|
||||
|
||||
// CopyOutN is like CopyOut, but explicitly requests a partial
|
||||
// copy-out. Note that this may yield unexpected results for non-packed
|
||||
// types and the caller may only want to allow this for packed types. See
|
||||
// comment on MarshalBytes.
|
||||
//
|
||||
// The limit must be less than or equal to SizeBytes().
|
||||
CopyOutN(cc CopyContext, addr hostarch.Addr, limit int) (int, error)
|
||||
}
|
||||
|
||||
// CheckedMarshallable represents operations on a type that can be marshalled
|
||||
// to and from memory and additionally does bound checking.
|
||||
type CheckedMarshallable interface {
|
||||
// CheckedMarshal is the same as Marshallable.MarshalUnsafe but without the
|
||||
// precondition that dst must at least have some appropriate length. Similar
|
||||
// to Marshallable.MarshalBytes, it returns a shifted slice according to how
|
||||
// much data is consumed. Additionally it returns a bool indicating whether
|
||||
// marshalling was successful. Unsuccessful marshalling doesn't consume any
|
||||
// data.
|
||||
CheckedMarshal(dst []byte) ([]byte, bool)
|
||||
|
||||
// CheckedUnmarshal is the same as Marshallable.UmarshalUnsafe but without
|
||||
// the precondition that src must at least have some appropriate length.
|
||||
// Similar to Marshallable.UnmarshalBytes, it returns a shifted slice
|
||||
// according to how much data is consumed. Additionally it returns a bool
|
||||
// indicating whether marshalling was successful. Unsuccessful marshalling
|
||||
// doesn't consume any data.
|
||||
CheckedUnmarshal(src []byte) ([]byte, bool)
|
||||
}
|
||||
|
||||
// go-marshal generates additional functions for a type based on additional
|
||||
// clauses to the +marshal directive. They are documented below.
|
||||
//
|
||||
// Slice API
|
||||
// =========
|
||||
//
|
||||
// Adding a "slice" clause to the +marshal directive for structs or newtypes on
|
||||
// primitives like this:
|
||||
//
|
||||
// // +marshal slice:FooSlice
|
||||
// type Foo struct { ... }
|
||||
//
|
||||
// Generates four additional functions for marshalling slices of Foos like this:
|
||||
//
|
||||
// // MarshalUnsafeFooSlice is like Foo.MarshalUnsafe, buf for a []Foo. It
|
||||
// // might be more efficient that repeatedly calling Foo.MarshalUnsafe
|
||||
// // over a []Foo in a loop if the type is Packed.
|
||||
// // Preconditions: dst must be at least len(src)*Foo.SizeBytes() in length.
|
||||
// func MarshalUnsafeFooSlice(src []Foo, dst []byte) []byte { ... }
|
||||
//
|
||||
// // UnmarshalUnsafeFooSlice is like Foo.UnmarshalUnsafe, buf for a []Foo. It
|
||||
// // might be more efficient that repeatedly calling Foo.UnmarshalUnsafe
|
||||
// // over a []Foo in a loop if the type is Packed.
|
||||
// // Preconditions: src must be at least len(dst)*Foo.SizeBytes() in length.
|
||||
// func UnmarshalUnsafeFooSlice(dst []Foo, src []byte) []byte { ... }
|
||||
//
|
||||
// // CopyFooSliceIn copies in a slice of Foo objects from the task's memory.
|
||||
// func CopyFooSliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst []Foo) (int, error) { ... }
|
||||
//
|
||||
// // CopyFooSliceIn copies out a slice of Foo objects to the task's memory.
|
||||
// func CopyFooSliceOut(cc marshal.CopyContext, addr hostarch.Addr, src []Foo) (int, error) { ... }
|
||||
//
|
||||
// The name of the functions are of the format "Copy%sIn" and "Copy%sOut", where
|
||||
// %s is the first argument to the slice clause. This directive is not supported
|
||||
// for newtypes on arrays.
|
||||
//
|
||||
// Note: Partial copies are not supported for Slice API UnmarshalUnsafe and
|
||||
// MarshalUnsafe.
|
||||
//
|
||||
// The slice clause also takes an optional second argument, which must be the
|
||||
// value "inner":
|
||||
//
|
||||
// // +marshal slice:Int32Slice:inner
|
||||
// type Int32 int32
|
||||
//
|
||||
// This is only valid on newtypes on primitives, and causes the generated
|
||||
// functions to accept slices of the inner type instead:
|
||||
//
|
||||
// func CopyInt32SliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst []int32) (int, error) { ... }
|
||||
//
|
||||
// Without "inner", they would instead be:
|
||||
//
|
||||
// func CopyInt32SliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst []Int32) (int, error) { ... }
|
||||
//
|
||||
// This may help avoid a cast depending on how the generated functions are used.
|
||||
//
|
||||
// Bound Checking
|
||||
// ==============
|
||||
//
|
||||
// Some users might want to do bound checking on marshal and unmarshal. This is
|
||||
// is useful when the user does not control the buffer size. To prevent
|
||||
// repeated bound checking code around Marshallable, users can add a
|
||||
// "boundCheck" clause to the +marshal directive. go_marshal will generate the
|
||||
// CheckedMarshallable interface methods on the type.
|
||||
3
pkg/marshal/marshal_state_autogen.go
Normal file
3
pkg/marshal/marshal_state_autogen.go
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
// automatically generated by stateify.
|
||||
|
||||
package marshal
|
||||
405
pkg/marshal/primitive/primitive.go
Normal file
405
pkg/marshal/primitive/primitive.go
Normal file
|
|
@ -0,0 +1,405 @@
|
|||
// Copyright 2020 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 primitive defines marshal.Marshallable implementations for primitive
|
||||
// types.
|
||||
package primitive
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/sagernet/gvisor/pkg/hostarch"
|
||||
"github.com/sagernet/gvisor/pkg/marshal"
|
||||
)
|
||||
|
||||
// Int8 is a marshal.Marshallable implementation for int8.
|
||||
//
|
||||
// +marshal boundCheck slice:Int8Slice:inner
|
||||
type Int8 int8
|
||||
|
||||
// Uint8 is a marshal.Marshallable implementation for uint8.
|
||||
//
|
||||
// +marshal boundCheck slice:Uint8Slice:inner
|
||||
type Uint8 uint8
|
||||
|
||||
// Int16 is a marshal.Marshallable implementation for int16.
|
||||
//
|
||||
// +marshal boundCheck slice:Int16Slice:inner
|
||||
type Int16 int16
|
||||
|
||||
// Uint16 is a marshal.Marshallable implementation for uint16.
|
||||
//
|
||||
// +marshal boundCheck slice:Uint16Slice:inner
|
||||
type Uint16 uint16
|
||||
|
||||
// Int32 is a marshal.Marshallable implementation for int32.
|
||||
//
|
||||
// +marshal boundCheck slice:Int32Slice:inner
|
||||
type Int32 int32
|
||||
|
||||
// Uint32 is a marshal.Marshallable implementation for uint32.
|
||||
//
|
||||
// +marshal boundCheck slice:Uint32Slice:inner
|
||||
type Uint32 uint32
|
||||
|
||||
// Int64 is a marshal.Marshallable implementation for int64.
|
||||
//
|
||||
// +marshal boundCheck slice:Int64Slice:inner
|
||||
type Int64 int64
|
||||
|
||||
// Uint64 is a marshal.Marshallable implementation for uint64.
|
||||
//
|
||||
// +marshal boundCheck slice:Uint64Slice:inner
|
||||
type Uint64 uint64
|
||||
|
||||
// ByteSlice is a marshal.Marshallable implementation for []byte.
|
||||
// This is a convenience wrapper around a dynamically sized type, and can't be
|
||||
// embedded in other marshallable types because it breaks assumptions made by
|
||||
// go-marshal internals. It violates the "no dynamically-sized types"
|
||||
// constraint of the go-marshal library.
|
||||
type ByteSlice []byte
|
||||
|
||||
// SizeBytes implements marshal.Marshallable.SizeBytes.
|
||||
func (b *ByteSlice) SizeBytes() int {
|
||||
return len(*b)
|
||||
}
|
||||
|
||||
// MarshalBytes implements marshal.Marshallable.MarshalBytes.
|
||||
func (b *ByteSlice) MarshalBytes(dst []byte) []byte {
|
||||
return dst[copy(dst, *b):]
|
||||
}
|
||||
|
||||
// UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes.
|
||||
func (b *ByteSlice) UnmarshalBytes(src []byte) []byte {
|
||||
return src[copy(*b, src):]
|
||||
}
|
||||
|
||||
// Packed implements marshal.Marshallable.Packed.
|
||||
func (b *ByteSlice) Packed() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe.
|
||||
func (b *ByteSlice) MarshalUnsafe(dst []byte) []byte {
|
||||
return b.MarshalBytes(dst)
|
||||
}
|
||||
|
||||
// UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe.
|
||||
func (b *ByteSlice) UnmarshalUnsafe(src []byte) []byte {
|
||||
return b.UnmarshalBytes(src)
|
||||
}
|
||||
|
||||
// CopyIn implements marshal.Marshallable.CopyIn.
|
||||
func (b *ByteSlice) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) {
|
||||
return cc.CopyInBytes(addr, *b)
|
||||
}
|
||||
|
||||
// CopyInN implements marshal.Marshallable.CopyInN.
|
||||
func (b *ByteSlice) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) {
|
||||
return cc.CopyInBytes(addr, (*b)[:limit])
|
||||
}
|
||||
|
||||
// CopyOut implements marshal.Marshallable.CopyOut.
|
||||
func (b *ByteSlice) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) {
|
||||
return cc.CopyOutBytes(addr, *b)
|
||||
}
|
||||
|
||||
// CopyOutN implements marshal.Marshallable.CopyOutN.
|
||||
func (b *ByteSlice) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) {
|
||||
return cc.CopyOutBytes(addr, (*b)[:limit])
|
||||
}
|
||||
|
||||
// WriteTo implements io.WriterTo.WriteTo.
|
||||
func (b *ByteSlice) WriteTo(w io.Writer) (int64, error) {
|
||||
n, err := w.Write(*b)
|
||||
return int64(n), err
|
||||
}
|
||||
|
||||
var _ marshal.Marshallable = (*ByteSlice)(nil)
|
||||
|
||||
// The following set of functions are convenient shorthands for wrapping a
|
||||
// built-in type in a marshallable primitive type. For example:
|
||||
//
|
||||
// func useMarshallable(m marshal.Marshallable) { ... }
|
||||
//
|
||||
// // Compare:
|
||||
//
|
||||
// buf = []byte{...}
|
||||
// // useMarshallable(&primitive.ByteSlice(buf)) // Not allowed, can't address temp value.
|
||||
// bufP := primitive.ByteSlice(buf)
|
||||
// useMarshallable(&bufP)
|
||||
//
|
||||
// // Vs:
|
||||
//
|
||||
// useMarshallable(AsByteSlice(buf))
|
||||
//
|
||||
// Note that the argument to these function escapes, so avoid using them on very
|
||||
// hot code paths. But generally if a function accepts an interface as an
|
||||
// argument, the argument escapes anyways.
|
||||
|
||||
// AllocateInt8 returns x as a marshallable.
|
||||
func AllocateInt8(x int8) marshal.Marshallable {
|
||||
p := Int8(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateUint8 returns x as a marshallable.
|
||||
func AllocateUint8(x uint8) marshal.Marshallable {
|
||||
p := Uint8(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateInt16 returns x as a marshallable.
|
||||
func AllocateInt16(x int16) marshal.Marshallable {
|
||||
p := Int16(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateUint16 returns x as a marshallable.
|
||||
func AllocateUint16(x uint16) marshal.Marshallable {
|
||||
p := Uint16(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateInt32 returns x as a marshallable.
|
||||
func AllocateInt32(x int32) marshal.Marshallable {
|
||||
p := Int32(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateUint32 returns x as a marshallable.
|
||||
func AllocateUint32(x uint32) marshal.Marshallable {
|
||||
p := Uint32(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateInt64 returns x as a marshallable.
|
||||
func AllocateInt64(x int64) marshal.Marshallable {
|
||||
p := Int64(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateUint64 returns x as a marshallable.
|
||||
func AllocateUint64(x uint64) marshal.Marshallable {
|
||||
p := Uint64(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AsByteSlice returns b as a marshallable. Note that this allocates a new slice
|
||||
// header, but does not copy the slice contents.
|
||||
func AsByteSlice(b []byte) marshal.Marshallable {
|
||||
bs := ByteSlice(b)
|
||||
return &bs
|
||||
}
|
||||
|
||||
// Below, we define some convenience functions for marshalling primitive types
|
||||
// using the newtypes above, without requiring superfluous casts.
|
||||
|
||||
// 8-bit integers
|
||||
|
||||
// CopyInt8In is a convenient wrapper for copying in an int8 from the task's
|
||||
// memory.
|
||||
func CopyInt8In(cc marshal.CopyContext, addr hostarch.Addr, dst *int8) (int, error) {
|
||||
var buf Int8
|
||||
n, err := buf.CopyIn(cc, addr)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
*dst = int8(buf)
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// CopyInt8Out is a convenient wrapper for copying out an int8 to the task's
|
||||
// memory.
|
||||
func CopyInt8Out(cc marshal.CopyContext, addr hostarch.Addr, src int8) (int, error) {
|
||||
srcP := Int8(src)
|
||||
return srcP.CopyOut(cc, addr)
|
||||
}
|
||||
|
||||
// CopyUint8In is a convenient wrapper for copying in a uint8 from the task's
|
||||
// memory.
|
||||
func CopyUint8In(cc marshal.CopyContext, addr hostarch.Addr, dst *uint8) (int, error) {
|
||||
var buf Uint8
|
||||
n, err := buf.CopyIn(cc, addr)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
*dst = uint8(buf)
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// CopyUint8Out is a convenient wrapper for copying out a uint8 to the task's
|
||||
// memory.
|
||||
func CopyUint8Out(cc marshal.CopyContext, addr hostarch.Addr, src uint8) (int, error) {
|
||||
srcP := Uint8(src)
|
||||
return srcP.CopyOut(cc, addr)
|
||||
}
|
||||
|
||||
// 16-bit integers
|
||||
|
||||
// CopyInt16In is a convenient wrapper for copying in an int16 from the task's
|
||||
// memory.
|
||||
func CopyInt16In(cc marshal.CopyContext, addr hostarch.Addr, dst *int16) (int, error) {
|
||||
var buf Int16
|
||||
n, err := buf.CopyIn(cc, addr)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
*dst = int16(buf)
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// CopyInt16Out is a convenient wrapper for copying out an int16 to the task's
|
||||
// memory.
|
||||
func CopyInt16Out(cc marshal.CopyContext, addr hostarch.Addr, src int16) (int, error) {
|
||||
srcP := Int16(src)
|
||||
return srcP.CopyOut(cc, addr)
|
||||
}
|
||||
|
||||
// CopyUint16In is a convenient wrapper for copying in a uint16 from the task's
|
||||
// memory.
|
||||
func CopyUint16In(cc marshal.CopyContext, addr hostarch.Addr, dst *uint16) (int, error) {
|
||||
var buf Uint16
|
||||
n, err := buf.CopyIn(cc, addr)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
*dst = uint16(buf)
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// CopyUint16Out is a convenient wrapper for copying out a uint16 to the task's
|
||||
// memory.
|
||||
func CopyUint16Out(cc marshal.CopyContext, addr hostarch.Addr, src uint16) (int, error) {
|
||||
srcP := Uint16(src)
|
||||
return srcP.CopyOut(cc, addr)
|
||||
}
|
||||
|
||||
// 32-bit integers
|
||||
|
||||
// CopyInt32In is a convenient wrapper for copying in an int32 from the task's
|
||||
// memory.
|
||||
func CopyInt32In(cc marshal.CopyContext, addr hostarch.Addr, dst *int32) (int, error) {
|
||||
var buf Int32
|
||||
n, err := buf.CopyIn(cc, addr)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
*dst = int32(buf)
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// CopyInt32Out is a convenient wrapper for copying out an int32 to the task's
|
||||
// memory.
|
||||
func CopyInt32Out(cc marshal.CopyContext, addr hostarch.Addr, src int32) (int, error) {
|
||||
srcP := Int32(src)
|
||||
return srcP.CopyOut(cc, addr)
|
||||
}
|
||||
|
||||
// CopyUint32In is a convenient wrapper for copying in a uint32 from the task's
|
||||
// memory.
|
||||
func CopyUint32In(cc marshal.CopyContext, addr hostarch.Addr, dst *uint32) (int, error) {
|
||||
var buf Uint32
|
||||
n, err := buf.CopyIn(cc, addr)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
*dst = uint32(buf)
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// CopyUint32Out is a convenient wrapper for copying out a uint32 to the task's
|
||||
// memory.
|
||||
func CopyUint32Out(cc marshal.CopyContext, addr hostarch.Addr, src uint32) (int, error) {
|
||||
srcP := Uint32(src)
|
||||
return srcP.CopyOut(cc, addr)
|
||||
}
|
||||
|
||||
// 64-bit integers
|
||||
|
||||
// CopyInt64In is a convenient wrapper for copying in an int64 from the task's
|
||||
// memory.
|
||||
func CopyInt64In(cc marshal.CopyContext, addr hostarch.Addr, dst *int64) (int, error) {
|
||||
var buf Int64
|
||||
n, err := buf.CopyIn(cc, addr)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
*dst = int64(buf)
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// CopyInt64Out is a convenient wrapper for copying out an int64 to the task's
|
||||
// memory.
|
||||
func CopyInt64Out(cc marshal.CopyContext, addr hostarch.Addr, src int64) (int, error) {
|
||||
srcP := Int64(src)
|
||||
return srcP.CopyOut(cc, addr)
|
||||
}
|
||||
|
||||
// CopyUint64In is a convenient wrapper for copying in a uint64 from the task's
|
||||
// memory.
|
||||
func CopyUint64In(cc marshal.CopyContext, addr hostarch.Addr, dst *uint64) (int, error) {
|
||||
var buf Uint64
|
||||
n, err := buf.CopyIn(cc, addr)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
*dst = uint64(buf)
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// CopyUint64Out is a convenient wrapper for copying out a uint64 to the task's
|
||||
// memory.
|
||||
func CopyUint64Out(cc marshal.CopyContext, addr hostarch.Addr, src uint64) (int, error) {
|
||||
srcP := Uint64(src)
|
||||
return srcP.CopyOut(cc, addr)
|
||||
}
|
||||
|
||||
// CopyByteSliceIn is a convenient wrapper for copying in a []byte from the
|
||||
// task's memory.
|
||||
func CopyByteSliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst *[]byte) (int, error) {
|
||||
var buf ByteSlice
|
||||
n, err := buf.CopyIn(cc, addr)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
*dst = []byte(buf)
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// CopyByteSliceOut is a convenient wrapper for copying out a []byte to the
|
||||
// task's memory.
|
||||
func CopyByteSliceOut(cc marshal.CopyContext, addr hostarch.Addr, src []byte) (int, error) {
|
||||
srcP := ByteSlice(src)
|
||||
return srcP.CopyOut(cc, addr)
|
||||
}
|
||||
|
||||
// CopyStringIn is a convenient wrapper for copying in a string from the
|
||||
// task's memory.
|
||||
func CopyStringIn(cc marshal.CopyContext, addr hostarch.Addr, dst *string) (int, error) {
|
||||
var buf ByteSlice
|
||||
n, err := buf.CopyIn(cc, addr)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
*dst = string(buf)
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// CopyStringOut is a convenient wrapper for copying out a string to the task's
|
||||
// memory.
|
||||
func CopyStringOut(cc marshal.CopyContext, addr hostarch.Addr, src string) (int, error) {
|
||||
srcP := ByteSlice(src)
|
||||
return srcP.CopyOut(cc, addr)
|
||||
}
|
||||
1586
pkg/marshal/primitive/primitive_abi_autogen_unsafe.go
Normal file
1586
pkg/marshal/primitive/primitive_abi_autogen_unsafe.go
Normal file
File diff suppressed because it is too large
Load diff
3
pkg/marshal/primitive/primitive_state_autogen.go
Normal file
3
pkg/marshal/primitive/primitive_state_autogen.go
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
// automatically generated by stateify.
|
||||
|
||||
package primitive
|
||||
44
pkg/marshal/util.go
Normal file
44
pkg/marshal/util.go
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
// Copyright 2020 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 marshal
|
||||
|
||||
// Marshal returns the serialized contents of m in a newly allocated
|
||||
// byte slice.
|
||||
func Marshal(m Marshallable) []byte {
|
||||
buf := make([]byte, m.SizeBytes())
|
||||
m.MarshalUnsafe(buf)
|
||||
return buf
|
||||
}
|
||||
|
||||
// MarshalAll returns the serialized contents of all ms in a newly allocated
|
||||
// byte slice.
|
||||
func MarshalAll(ms []Marshallable) []byte {
|
||||
buf := make([]byte, TotalSize(ms))
|
||||
var written int
|
||||
for _, m := range ms {
|
||||
m.MarshalUnsafe(buf[written:])
|
||||
written += m.SizeBytes()
|
||||
}
|
||||
return buf
|
||||
}
|
||||
|
||||
// TotalSize returns the total size of all ms.
|
||||
func TotalSize(ms []Marshallable) int {
|
||||
var size int
|
||||
for _, m := range ms {
|
||||
size += m.SizeBytes()
|
||||
}
|
||||
return size
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue