Move from facts render to facts validation.

This allows fact information to be validated in the underlying source files,
but requires us to explicitly maintain this in appropriate version-tagged, and
architecture-tagged files. This is more explicit and safer.

This mechanism uses a special regular expression for matching a +checkconst
stanza to validate constant values, sizes and offsets. This applies to both Go
source files and assembly files.

PiperOrigin-RevId: 511867507
This commit is contained in:
Adin Scannell
2023-02-23 13:17:49 -08:00
committed by gVisor bot
parent 5817f4cc64
commit bd561fd3f9
33 changed files with 646 additions and 952 deletions
+7 -8
View File
@@ -88,14 +88,7 @@ global:
- pkg/shim/runtimeoptions/v14/runtimeoptions_cri.go
analyzers:
asmdecl:
generated:
suppress:
# Non-conventional functions.
- "\\[amd64\\].*sysret: RET without writing to 8-byte"
- "\\[amd64\\].*iret: RET without writing to 8-byte"
- "\\[amd64\\].*exception: use of .* points beyond argument frame"
- "\\[arm64\\].*HaltEl1ExceptionAndResume: unknown variable"
- "\\[arm64\\].*HaltEl1ExceptionAndResume: use of .* points beyond argument frame"
generated: # Enabled.
external:
exclude: [".*"] # Disabled.
internal:
@@ -109,6 +102,12 @@ analyzers:
- "wrmsr: invalid offset value"
- "rdmsr: invalid MOVL of ret"
- "rdmsr: invalid offset ret"
# Non-conventional functions.
- "\\[amd64\\].*sysret: RET without writing to 8-byte"
- "\\[amd64\\].*iret: RET without writing to 8-byte"
- "\\[amd64\\].*exception: use of .* points beyond argument frame"
- "\\[arm64\\].*HaltEl1ExceptionAndResume: unknown variable"
- "\\[arm64\\].*HaltEl1ExceptionAndResume: use of .* points beyond argument frame"
assign:
external:
exclude:
-16
View File
@@ -1,6 +1,4 @@
load("//tools:arch.bzl", "arch_genrule")
load("//tools:defs.bzl", "go_library", "go_test")
load("//tools/nogo:defs.bzl", "nogo_facts")
# Package linux contains the constants and types needed to interface with a
# Linux kernel. It should be used instead of syscall or golang.org/x/sys/unix
@@ -8,19 +6,6 @@ load("//tools/nogo:defs.bzl", "nogo_facts")
package(licenses = ["notice"])
nogo_facts(
name = "iouring_offsets",
srcs = ["iouring.go"],
output = "iouring_offsets_impl.go",
template = "iouring_offsets.tmpl",
)
arch_genrule(
name = "iouring_offsets_arch",
src = ":iouring_offsets",
template = "iouring_offsets_%s.go",
)
go_library(
name = "linux",
srcs = [
@@ -91,7 +76,6 @@ go_library(
"utsname.go",
"wait.go",
"xattr.go",
":iouring_offsets_arch",
],
marshal = True,
visibility = ["//visibility:public"],
+44
View File
@@ -192,3 +192,47 @@ type IOUringSqe struct {
addr3 uint64
_ uint64
}
const (
_IOSqRingOffset = 0 // +checkoffset . IORings.Sq
_IOSqRingOffsetHead = 0 // +checkoffset . IOUring.Head
_IOSqRingOffsetTail = 64 // +checkoffset . IOUring.Tail
_IOSqRingOffsetMask = 256 // +checkoffset . IORings.SqRingMask
_IOSqRingOffsetEntries = 264 // +checkoffset . IORings.SqRingEntries
_IOSqRingOffsetFlags = 276 // +checkoffset . IORings.sqFlags
_IOSqRingOffsetDropped = 272 // +checkoffset . IORings.sqDropped
)
// PreComputedIOSqRingOffsets returns precomputed values for IOSqRingOffsets.
func PreComputedIOSqRingOffsets() IOSqRingOffsets {
return IOSqRingOffsets{
Head: _IOSqRingOffset + _IOSqRingOffsetHead,
Tail: _IOSqRingOffset + _IOSqRingOffsetTail,
RingMask: _IOSqRingOffsetMask,
RingEntries: _IOSqRingOffsetEntries,
Flags: _IOSqRingOffsetFlags,
Dropped: _IOSqRingOffsetDropped,
}
}
const (
_IOCqRingOffset = 128 // +checkoffset . IORings.Cq
_IOCqRingOffsetHead = 0 // +checkoffset . IOUring.Head
_IOCqRingOffsetTail = 64 // +checkoffset . IOUring.Tail
_IOCqRingOffsetMask = 260 // +checkoffset . IORings.CqRingMask
_IOCqRingOffsetEntries = 268 // +checkoffset . IORings.CqRingEntries
_IOCqRingOffsetFlags = 280 // +checkoffset . IORings.cqFlags
_IOCqRingOffsetOverflow = 284 // +checkoffset . IORings.CqOverflow
)
// PreComputedIOCqRingOffsets returns precomputed values for IOCqRingOffsets.
func PreComputedIOCqRingOffsets() IOCqRingOffsets {
return IOCqRingOffsets{
Head: _IOCqRingOffset + _IOCqRingOffsetHead,
Tail: _IOCqRingOffset + _IOCqRingOffsetTail,
RingMask: _IOCqRingOffsetMask,
RingEntries: _IOCqRingOffsetEntries,
Overflow: _IOCqRingOffsetOverflow,
Flags: _IOCqRingOffsetFlags,
}
}
-39
View File
@@ -1,39 +0,0 @@
// Copyright 2022 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
// PreComputedIOSqRingOffsets returns precomputed values for IOSqRingOffsets.
func PreComputedIOSqRingOffsets() IOSqRingOffsets {
return IOSqRingOffsets{
Head: {{ .IORings.Sq.Offset }} + {{ .IOUring.Head.Offset }},
Tail: {{ .IORings.Sq.Offset }} + {{ .IOUring.Tail.Offset }},
RingMask: {{ .IORings.SqRingMask.Offset }},
RingEntries: {{ .IORings.SqRingEntries.Offset }},
Flags: {{ .IORings.sqFlags.Offset }},
Dropped: {{ .IORings.sqDropped.Offset }},
}
}
// PreComputedIOCqRingOffsets returns precomputed values for IOCqRingOffsets.
func PreComputedIOCqRingOffsets() IOCqRingOffsets {
return IOCqRingOffsets {
Head: {{ .IORings.Cq.Offset }} + {{ .IOUring.Head.Offset }},
Tail: {{ .IORings.Cq.Offset }} + {{ .IOUring.Tail.Offset }},
RingMask: {{ .IORings.CqRingMask.Offset }},
RingEntries: {{ .IORings.CqRingEntries.Offset }},
Overflow: {{ .IORings.CqOverflow.Offset }},
Flags: {{ .IORings.cqFlags.Offset }},
}
}
+2 -19
View File
@@ -1,30 +1,13 @@
load("//tools:arch.bzl", "arch_genrule", "select_arch")
load("//tools:defs.bzl", "go_library", "go_test")
load("//tools/nogo:defs.bzl", "nogo_facts")
package(licenses = ["notice"])
nogo_facts(
name = "goid_impl",
srcs = ["goid.go"],
output = "goid_impl.s",
template = select_arch(
amd64 = "goid_amd64.s",
arm64 = "goid_arm64.s",
),
)
arch_genrule(
name = "goid_impl_arch",
src = ":goid_impl",
template = "goid_impl_%s.s",
)
go_library(
name = "goid",
srcs = [
"goid.go",
":goid_impl_arch",
"goid_amd64.s",
"goid_arm64.s",
],
stateify = False,
visibility = ["//visibility:public"],
+1 -4
View File
@@ -16,12 +16,9 @@
package goid
import (
"runtime"
_ "runtime" // For facts in assembly files.
)
// Dummy references for facts.
const _ = runtime.Compiler
// goid returns the current goid, it is defined in assembly.
func goid() int64
+1 -1
View File
@@ -14,7 +14,7 @@
#include "textflag.h"
#define GOID_OFFSET {{ .import.runtime.g.goid.Offset }}
#define GOID_OFFSET 152 // +checkoffset runtime g.goid
// func goid() int64
TEXT ·goid(SB),NOSPLIT,$0-8
+1 -1
View File
@@ -14,7 +14,7 @@
#include "textflag.h"
#define GOID_OFFSET {{ .import.runtime.g.goid.Offset }}
#define GOID_OFFSET 152 // +checkoffset runtime g.goid
// func goid() int64
TEXT ·goid(SB),NOSPLIT,$0-8
+2 -19
View File
@@ -1,30 +1,13 @@
load("//tools:arch.bzl", "arch_genrule", "select_arch")
load("//tools:defs.bzl", "go_library", "go_test")
load("//tools/nogo:defs.bzl", "nogo_facts")
package(licenses = ["notice"])
nogo_facts(
name = "hosttid_impl",
srcs = ["hosttid.go"],
output = "hosttid_impl.s",
template = select_arch(
amd64 = "hosttid_amd64.s",
arm64 = "hosttid_arm64.s",
),
)
arch_genrule(
name = "hosttid_impl_arch",
src = ":hosttid_impl",
template = "hosttid_impl_%s.s",
)
go_library(
name = "hosttid",
srcs = [
"hosttid.go",
":hosttid_impl_arch",
"hosttid_amd64.s",
"hosttid_arm64.s",
],
visibility = ["//visibility:public"],
)
+2 -2
View File
@@ -17,8 +17,8 @@
#include "textflag.h"
#define M_OFFSET {{ .import.runtime.g.m.Offset }}
#define PROCID_OFFSET {{ .import.runtime.m.procid.Offset }}
#define M_OFFSET 48 // +checkoffset runtime g.m
#define PROCID_OFFSET 72 // +checkoffset runtime m.procid
TEXT ·Current(SB),NOSPLIT,$0-8
// procid is in getg().m.procid.
+2 -2
View File
@@ -17,8 +17,8 @@
#include "textflag.h"
#define M_OFFSET {{ .import.runtime.g.m.Offset }}
#define PROCID_OFFSET {{ .import.runtime.m.procid.Offset }}
#define M_OFFSET 48 // +checkoffset runtime g.m
#define PROCID_OFFSET 72 // +checkoffset runtime m.procid
TEXT ·Current(SB),NOSPLIT,$0-8
// procid is in getg().m.procid.
+3 -36
View File
@@ -1,42 +1,7 @@
load("//tools:arch.bzl", "arch_genrule", "select_arch")
load("//tools:defs.bzl", "go_library")
load("//tools/nogo:defs.bzl", "nogo_facts")
package(licenses = ["notice"])
exports_files(glob(["*.go"]))
nogo_facts(
name = "entry_impl",
srcs = [
"aarch64.go",
"defs.go",
"defs_amd64.go",
"defs_arm64.go",
"entry_template.go",
"x86.go",
],
output = "entry_impl.s",
template = select_arch(
amd64 = "entry_amd64.s",
arm64 = "entry_arm64.s",
),
deps = [
"//pkg/abi/linux",
"//pkg/cpuid",
"//pkg/hostarch",
"//pkg/ring0/pagetables",
"//pkg/sentry/arch",
"//pkg/sentry/arch/fpu",
],
)
arch_genrule(
name = "entry_impl_arch",
src = ":entry_impl",
template = "entry_impl_%s.s",
)
go_library(
name = "ring0",
srcs = [
@@ -45,7 +10,9 @@ go_library(
"defs_amd64.go",
"defs_arm64.go",
"entry_amd64.go",
"entry_amd64.s",
"entry_arm64.go",
"entry_arm64.s",
"kernel.go",
"kernel_amd64.go",
"kernel_arm64.go",
@@ -56,10 +23,10 @@ go_library(
"lib_arm64.s",
"ring0.go",
"x86.go",
":entry_impl_arch",
],
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
"//pkg/cpuid",
"//pkg/hostarch",
"//pkg/ring0/pagetables",
+63 -66
View File
@@ -16,78 +16,75 @@
#include "textflag.h"
// CPU offsets.
#define CPU_REGISTERS {{ .CPU.registers.Offset }}
#define CPU_FPU_STATE {{ .CPU.floatingPointState.Offset }}
#define CPU_ERROR_CODE ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.errorCode.Offset }})
#define CPU_ERROR_TYPE ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.errorType.Offset }})
#define CPU_VECTOR ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.vector.Offset }})
#define CPU_FAULT_ADDR ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.faultAddr.Offset }})
#define CPU_ENTRY ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.kernelEntry.Offset }})
#define CPU_HAS_XSAVE ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.hasXSAVE.Offset }})
#define CPU_HAS_XSAVEOPT ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.hasXSAVEOPT.Offset }})
#define CPU_REGISTERS 64 // +checkoffset . CPU.registers
#define CPU_FPU_STATE 280 // +checkoffset . CPU.floatingPointState
#define CPU_ARCH_STATE 16 // +checkoffset . CPU.CPUArchState
#define CPU_ERROR_CODE CPU_ARCH_STATE+0 // +checkoffset . CPUArchState.errorCode
#define CPU_ERROR_TYPE CPU_ARCH_STATE+8 // +checkoffset . CPUArchState.errorType
#define CPU_VECTOR CPU_ARCH_STATE+16 // +checkoffset . CPUArchState.vector
#define CPU_FAULT_ADDR CPU_ARCH_STATE+24 // +checkoffset . CPUArchState.faultAddr
#define CPU_ENTRY CPU_ARCH_STATE+32 // +checkoffset . CPUArchState.kernelEntry
#define CPU_HAS_XSAVE CPU_ARCH_STATE+40 // +checkoffset . CPUArchState.hasXSAVE
#define CPU_HAS_XSAVEOPT CPU_ARCH_STATE+41 // +checkoffset . CPUArchState.hasXSAVEOPT
{{ with .kernelEntry }}
#define ENTRY_SCRATCH0 {{ .scratch0.Offset }}
#define ENTRY_STACK_TOP {{ .stackTop.Offset }}
#define ENTRY_CPU_SELF {{ .cpuSelf.Offset }}
#define ENTRY_KERNEL_CR3 {{ .kernelCR3.Offset }}
{{ end }}
#define ENTRY_SCRATCH0 256 // +checkoffset . kernelEntry.scratch0
#define ENTRY_STACK_TOP 264 // +checkoffset . kernelEntry.stackTop
#define ENTRY_CPU_SELF 272 // +checkoffset . kernelEntry.cpuSelf
#define ENTRY_KERNEL_CR3 280 // +checkoffset . kernelEntry.kernelCR3
// Bits.
#define _RFLAGS_IF {{ .Constants._RFLAGS_IF }}
#define _RFLAGS_IOPL0 {{ .Constants._RFLAGS_IOPL0 }}
#define _KERNEL_FLAGS {{ .Constants.KernelFlagsSet }}
#define _RFLAGS_IF 512 // +checkconst . _RFLAGS_IF
#define _RFLAGS_IOPL0 4096 // +checkconst . _RFLAGS_IOPL0
#define _KERNEL_FLAGS 2 // +checkconst . KernelFlagsSet
// Vectors.
#define DivideByZero {{ .Constants.DivideByZero }}
#define Debug {{ .Constants.Debug }}
#define NMI {{ .Constants.NMI }}
#define Breakpoint {{ .Constants.Breakpoint }}
#define Overflow {{ .Constants.Overflow }}
#define BoundRangeExceeded {{ .Constants.BoundRangeExceeded }}
#define InvalidOpcode {{ .Constants.InvalidOpcode }}
#define DeviceNotAvailable {{ .Constants.DeviceNotAvailable }}
#define DoubleFault {{ .Constants.DoubleFault }}
#define CoprocessorSegmentOverrun {{ .Constants.CoprocessorSegmentOverrun }}
#define InvalidTSS {{ .Constants.InvalidTSS }}
#define SegmentNotPresent {{ .Constants.SegmentNotPresent }}
#define StackSegmentFault {{ .Constants.StackSegmentFault }}
#define GeneralProtectionFault {{ .Constants.GeneralProtectionFault }}
#define PageFault {{ .Constants.PageFault }}
#define X87FloatingPointException {{ .Constants.X87FloatingPointException }}
#define AlignmentCheck {{ .Constants.AlignmentCheck }}
#define MachineCheck {{ .Constants.MachineCheck }}
#define SIMDFloatingPointException {{ .Constants.SIMDFloatingPointException }}
#define VirtualizationException {{ .Constants.VirtualizationException }}
#define SecurityException {{ .Constants.SecurityException }}
#define SyscallInt80 {{ .Constants.SyscallInt80 }}
#define Syscall {{ .Constants.Syscall }}
#define DivideByZero 0 // +checkconst . DivideByZero
#define Debug 1 // +checkconst . Debug
#define NMI 2 // +checkconst . NMI
#define Breakpoint 3 // +checkconst . Breakpoint
#define Overflow 4 // +checkconst . Overflow
#define BoundRangeExceeded 5 // +checkconst . BoundRangeExceeded
#define InvalidOpcode 6 // +checkconst . InvalidOpcode
#define DeviceNotAvailable 7 // +checkconst . DeviceNotAvailable
#define DoubleFault 8 // +checkconst . DoubleFault
#define CoprocessorSegmentOverrun 9 // +checkconst . CoprocessorSegmentOverrun
#define InvalidTSS 10 // +checkconst . InvalidTSS
#define SegmentNotPresent 11 // +checkconst . SegmentNotPresent
#define StackSegmentFault 12 // +checkconst . StackSegmentFault
#define GeneralProtectionFault 13 // +checkconst . GeneralProtectionFault
#define PageFault 14 // +checkconst . PageFault
#define X87FloatingPointException 16 // +checkconst . X87FloatingPointException
#define AlignmentCheck 17 // +checkconst . AlignmentCheck
#define MachineCheck 18 // +checkconst . MachineCheck
#define SIMDFloatingPointException 19 // +checkconst . SIMDFloatingPointException
#define VirtualizationException 20 // +checkconst . VirtualizationException
#define SecurityException 30 // +checkconst . SecurityException
#define SyscallInt80 128 // +checkconst . SyscallInt80
#define Syscall 256 // +checkconst . Syscall
{{ with .import.linux.PtraceRegs }}
#define PTRACE_R15 {{ .R15.Offset }}
#define PTRACE_R14 {{ .R14.Offset }}
#define PTRACE_R13 {{ .R13.Offset }}
#define PTRACE_R12 {{ .R12.Offset }}
#define PTRACE_RBP {{ .Rbp.Offset }}
#define PTRACE_RBX {{ .Rbx.Offset }}
#define PTRACE_R11 {{ .R11.Offset }}
#define PTRACE_R10 {{ .R10.Offset }}
#define PTRACE_R9 {{ .R9.Offset }}
#define PTRACE_R8 {{ .R8.Offset }}
#define PTRACE_RAX {{ .Rax.Offset }}
#define PTRACE_RCX {{ .Rcx.Offset }}
#define PTRACE_RDX {{ .Rdx.Offset }}
#define PTRACE_RSI {{ .Rsi.Offset }}
#define PTRACE_RDI {{ .Rdi.Offset }}
#define PTRACE_ORIGRAX {{ .Orig_rax.Offset }}
#define PTRACE_RIP {{ .Rip.Offset }}
#define PTRACE_CS {{ .Cs.Offset }}
#define PTRACE_FLAGS {{ .Eflags.Offset }}
#define PTRACE_RSP {{ .Rsp.Offset }}
#define PTRACE_SS {{ .Ss.Offset }}
#define PTRACE_FS_BASE {{ .Fs_base.Offset }}
#define PTRACE_GS_BASE {{ .Gs_base.Offset }}
{{ end }}
#define PTRACE_R15 0 // +checkoffset linux PtraceRegs.R15
#define PTRACE_R14 8 // +checkoffset linux PtraceRegs.R14
#define PTRACE_R13 16 // +checkoffset linux PtraceRegs.R13
#define PTRACE_R12 24 // +checkoffset linux PtraceRegs.R12
#define PTRACE_RBP 32 // +checkoffset linux PtraceRegs.Rbp
#define PTRACE_RBX 40 // +checkoffset linux PtraceRegs.Rbx
#define PTRACE_R11 48 // +checkoffset linux PtraceRegs.R11
#define PTRACE_R10 56 // +checkoffset linux PtraceRegs.R10
#define PTRACE_R9 64 // +checkoffset linux PtraceRegs.R9
#define PTRACE_R8 72 // +checkoffset linux PtraceRegs.R8
#define PTRACE_RAX 80 // +checkoffset linux PtraceRegs.Rax
#define PTRACE_RCX 88 // +checkoffset linux PtraceRegs.Rcx
#define PTRACE_RDX 96 // +checkoffset linux PtraceRegs.Rdx
#define PTRACE_RSI 104 // +checkoffset linux PtraceRegs.Rsi
#define PTRACE_RDI 112 // +checkoffset linux PtraceRegs.Rdi
#define PTRACE_ORIGRAX 120 // +checkoffset linux PtraceRegs.Orig_rax
#define PTRACE_RIP 128 // +checkoffset linux PtraceRegs.Rip
#define PTRACE_CS 136 // +checkoffset linux PtraceRegs.Cs
#define PTRACE_FLAGS 144 // +checkoffset linux PtraceRegs.Eflags
#define PTRACE_RSP 152 // +checkoffset linux PtraceRegs.Rsp
#define PTRACE_SS 160 // +checkoffset linux PtraceRegs.Ss
#define PTRACE_FS_BASE 168 // +checkoffset linux PtraceRegs.Fs_base
#define PTRACE_GS_BASE 176 // +checkoffset linux PtraceRegs.Gs_base
// Saves a register set.
//
+82 -83
View File
@@ -15,94 +15,93 @@
#include "funcdata.h"
#include "textflag.h"
#define CPU_SELF {{ .CPU.self.Offset }}
#define CPU_REGISTERS {{ .CPU.registers.Offset }}
#define CPU_STACK_TOP ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.stack.Offset }} + {{ .CPUArchState.stack.Size }})
#define CPU_ERROR_CODE ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.errorCode.Offset }})
#define CPU_ERROR_TYPE ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.errorType.Offset }})
#define CPU_FAULT_ADDR ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.faultAddr.Offset }})
#define CPU_FPSTATE_EL0 ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.el0Fp.Offset }})
#define CPU_TTBR0_KVM ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.ttbr0Kvm.Offset }})
#define CPU_TTBR0_APP ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.ttbr0App.Offset }})
#define CPU_VECTOR_CODE ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.vecCode.Offset }})
#define CPU_APP_ADDR ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.appAddr.Offset }})
#define CPU_LAZY_VFP ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.lazyVFP.Offset }})
#define CPU_APP_ASID ({{ .CPU.CPUArchState.Offset }}+{{ .CPUArchState.appASID.Offset }})
#define CPU_SELF 0 // +checkoffset . CPU.self
#define CPU_REGISTERS 224 // +checkoffset . CPU.registers
#define CPU_ARCH_STATE 16 // +checkoffset . CPU.CPUArchState
#define CPU_STACK_BOTTOM CPU_ARCH_STATE+0 // +checkoffset . CPUArchState.stack
#define CPU_STACK_TOP CPU_STACK_BOTTOM+128 // +checksize . CPUArchState.stack
#define CPU_ERROR_CODE CPU_ARCH_STATE+128 // +checkoffset . CPUArchState.errorCode
#define CPU_ERROR_TYPE CPU_ARCH_STATE+136 // +checkoffset . CPUArchState.errorType
#define CPU_FAULT_ADDR CPU_ARCH_STATE+144 // +checkoffset . CPUArchState.faultAddr
#define CPU_FPSTATE_EL0 CPU_ARCH_STATE+152 // +checkoffset . CPUArchState.el0Fp
#define CPU_TTBR0_KVM CPU_ARCH_STATE+160 // +checkoffset . CPUArchState.ttbr0Kvm
#define CPU_TTBR0_APP CPU_ARCH_STATE+168 // +checkoffset . CPUArchState.ttbr0App
#define CPU_VECTOR_CODE CPU_ARCH_STATE+176 // +checkoffset . CPUArchState.vecCode
#define CPU_APP_ADDR CPU_ARCH_STATE+184 // +checkoffset . CPUArchState.appAddr
#define CPU_LAZY_VFP CPU_ARCH_STATE+192 // +checkoffset . CPUArchState.lazyVFP
#define CPU_APP_ASID CPU_ARCH_STATE+200 // +checkoffset . CPUArchState.appASID
// Bits.
#define _KERNEL_FLAGS {{ .Constants.KernelFlagsSet }}
#define _KERNEL_FLAGS 965 // +checkconst . KernelFlagsSet
// Vectors.
#define El1Sync {{ .Constants.El1Sync }}
#define El1Irq {{ .Constants.El1Irq }}
#define El1Fiq {{ .Constants.El1Fiq }}
#define El1Err {{ .Constants.El1Err }}
#define El0Sync {{ .Constants.El0Sync }}
#define El0Irq {{ .Constants.El0Irq }}
#define El0Fiq {{ .Constants.El0Fiq }}
#define El0Err {{ .Constants.El0Err }}
#define El1SyncDa {{ .Constants.El1SyncDa }}
#define El1SyncIa {{ .Constants.El1SyncIa }}
#define El1SyncSpPc {{ .Constants.El1SyncSpPc }}
#define El1SyncUndef {{ .Constants.El1SyncUndef }}
#define El1SyncDbg {{ .Constants.El1SyncDbg }}
#define El1SyncInv {{ .Constants.El1SyncInv }}
#define El0SyncSVC {{ .Constants.El0SyncSVC }}
#define El0SyncDa {{ .Constants.El0SyncDa }}
#define El0SyncIa {{ .Constants.El0SyncIa }}
#define El0SyncFpsimdAcc {{ .Constants.El0SyncFpsimdAcc }}
#define El0SyncSveAcc {{ .Constants.El0SyncSveAcc }}
#define El0SyncFpsimdExc {{ .Constants.El0SyncFpsimdExc }}
#define El0SyncSys {{ .Constants.El0SyncSys }}
#define El0SyncSpPc {{ .Constants.El0SyncSpPc }}
#define El0SyncUndef {{ .Constants.El0SyncUndef }}
#define El0SyncDbg {{ .Constants.El0SyncDbg }}
#define El0SyncWfx {{ .Constants.El0SyncWfx }}
#define El0SyncInv {{ .Constants.El0SyncInv }}
#define El0ErrNMI {{ .Constants.El0ErrNMI }}
#define PageFault {{ .Constants.PageFault }}
#define Syscall {{ .Constants.Syscall }}
#define VirtualizationException {{ .Constants.VirtualizationException }}
#define El1Sync 4 // +checkconst . El1Sync
#define El1Irq 5 // +checkconst . El1Irq
#define El1Fiq 6 // +checkconst . El1Fiq
#define El1Err 7 // +checkconst . El1Err
#define El0Sync 8 // +checkconst . El0Sync
#define El0Irq 9 // +checkconst . El0Irq
#define El0Fiq 10 // +checkconst . El0Fiq
#define El0Err 11 // +checkconst . El0Err
#define El1SyncDa 16 // +checkconst . El1SyncDa
#define El1SyncIa 17 // +checkconst . El1SyncIa
#define El1SyncSpPc 18 // +checkconst . El1SyncSpPc
#define El1SyncUndef 19 // +checkconst . El1SyncUndef
#define El1SyncDbg 20 // +checkconst . El1SyncDbg
#define El1SyncInv 21 // +checkconst . El1SyncInv
#define El0SyncSVC 22 // +checkconst . El0SyncSVC
#define El0SyncDa 23 // +checkconst . El0SyncDa
#define El0SyncIa 24 // +checkconst . El0SyncIa
#define El0SyncFpsimdAcc 25 // +checkconst . El0SyncFpsimdAcc
#define El0SyncSveAcc 26 // +checkconst . El0SyncSveAcc
#define El0SyncFpsimdExc 27 // +checkconst . El0SyncFpsimdExc
#define El0SyncSys 28 // +checkconst . El0SyncSys
#define El0SyncSpPc 29 // +checkconst . El0SyncSpPc
#define El0SyncUndef 30 // +checkconst . El0SyncUndef
#define El0SyncDbg 31 // +checkconst . El0SyncDbg
#define El0SyncWfx 32 // +checkconst . El0SyncWfx
#define El0SyncInv 33 // +checkconst . El0SyncInv
#define El0ErrNMI 34 // +checkconst . El0ErrNMI
#define PageFault 23 // +checkconst . PageFault
#define Syscall 22 // +checkconst . Syscall
#define VirtualizationException 35 // +checkconst . VirtualizationException
{{ with .import.linux.PtraceRegs }}
#define PTRACE_R0 ({{ .Regs.Offset }} + 0*8)
#define PTRACE_R1 ({{ .Regs.Offset }} + 1*8)
#define PTRACE_R2 ({{ .Regs.Offset }} + 2*8)
#define PTRACE_R3 ({{ .Regs.Offset }} + 3*8)
#define PTRACE_R4 ({{ .Regs.Offset }} + 4*8)
#define PTRACE_R5 ({{ .Regs.Offset }} + 5*8)
#define PTRACE_R6 ({{ .Regs.Offset }} + 6*8)
#define PTRACE_R7 ({{ .Regs.Offset }} + 7*8)
#define PTRACE_R8 ({{ .Regs.Offset }} + 8*8)
#define PTRACE_R9 ({{ .Regs.Offset }} + 9*8)
#define PTRACE_R10 ({{ .Regs.Offset }} + 10*8)
#define PTRACE_R11 ({{ .Regs.Offset }} + 11*8)
#define PTRACE_R12 ({{ .Regs.Offset }} + 12*8)
#define PTRACE_R13 ({{ .Regs.Offset }} + 13*8)
#define PTRACE_R14 ({{ .Regs.Offset }} + 14*8)
#define PTRACE_R15 ({{ .Regs.Offset }} + 15*8)
#define PTRACE_R16 ({{ .Regs.Offset }} + 16*8)
#define PTRACE_R17 ({{ .Regs.Offset }} + 17*8)
#define PTRACE_R18 ({{ .Regs.Offset }} + 18*8)
#define PTRACE_R19 ({{ .Regs.Offset }} + 19*8)
#define PTRACE_R20 ({{ .Regs.Offset }} + 20*8)
#define PTRACE_R21 ({{ .Regs.Offset }} + 21*8)
#define PTRACE_R22 ({{ .Regs.Offset }} + 22*8)
#define PTRACE_R23 ({{ .Regs.Offset }} + 23*8)
#define PTRACE_R24 ({{ .Regs.Offset }} + 24*8)
#define PTRACE_R25 ({{ .Regs.Offset }} + 25*8)
#define PTRACE_R26 ({{ .Regs.Offset }} + 26*8)
#define PTRACE_R27 ({{ .Regs.Offset }} + 27*8)
#define PTRACE_R28 ({{ .Regs.Offset }} + 28*8)
#define PTRACE_R29 ({{ .Regs.Offset }} + 29*8)
#define PTRACE_R30 ({{ .Regs.Offset }} + 30*8)
#define PTRACE_SP {{ .Sp.Offset }}
#define PTRACE_PC {{ .Pc.Offset }}
#define PTRACE_PSTATE {{ .Pstate.Offset }}
{{ end }}
{{ with .import.arch.Registers }}
#define PTRACE_TLS {{ .TPIDR_EL0.Offset }}
{{ end }}
#define PTRACE_REGS 0 // +checkoffset linux PtraceRegs.Regs
#define PTRACE_R0 (PTRACE_REGS + 0*8)
#define PTRACE_R1 (PTRACE_REGS + 1*8)
#define PTRACE_R2 (PTRACE_REGS + 2*8)
#define PTRACE_R3 (PTRACE_REGS + 3*8)
#define PTRACE_R4 (PTRACE_REGS + 4*8)
#define PTRACE_R5 (PTRACE_REGS + 5*8)
#define PTRACE_R6 (PTRACE_REGS + 6*8)
#define PTRACE_R7 (PTRACE_REGS + 7*8)
#define PTRACE_R8 (PTRACE_REGS + 8*8)
#define PTRACE_R9 (PTRACE_REGS + 9*8)
#define PTRACE_R10 (PTRACE_REGS + 10*8)
#define PTRACE_R11 (PTRACE_REGS + 11*8)
#define PTRACE_R12 (PTRACE_REGS + 12*8)
#define PTRACE_R13 (PTRACE_REGS + 13*8)
#define PTRACE_R14 (PTRACE_REGS + 14*8)
#define PTRACE_R15 (PTRACE_REGS + 15*8)
#define PTRACE_R16 (PTRACE_REGS + 16*8)
#define PTRACE_R17 (PTRACE_REGS + 17*8)
#define PTRACE_R18 (PTRACE_REGS + 18*8)
#define PTRACE_R19 (PTRACE_REGS + 19*8)
#define PTRACE_R20 (PTRACE_REGS + 20*8)
#define PTRACE_R21 (PTRACE_REGS + 21*8)
#define PTRACE_R22 (PTRACE_REGS + 22*8)
#define PTRACE_R23 (PTRACE_REGS + 23*8)
#define PTRACE_R24 (PTRACE_REGS + 24*8)
#define PTRACE_R25 (PTRACE_REGS + 25*8)
#define PTRACE_R26 (PTRACE_REGS + 26*8)
#define PTRACE_R27 (PTRACE_REGS + 27*8)
#define PTRACE_R28 (PTRACE_REGS + 28*8)
#define PTRACE_R29 (PTRACE_REGS + 29*8)
#define PTRACE_R30 (PTRACE_REGS + 30*8)
#define PTRACE_SP 248 // +checkoffset linux PtraceRegs.Sp
#define PTRACE_PC 256 // +checkoffset linux PtraceRegs.Pc
#define PTRACE_PSTATE 264 // +checkoffset linux PtraceRegs.Pstate
#define PTRACE_TLS 272 // +checkoffset arch Registers.TPIDR_EL0
// Saves a register set.
//
-20
View File
@@ -1,20 +0,0 @@
// Copyright 2018 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 ring0
import (
// Used for template generation.
_ "gvisor.dev/gvisor/pkg/abi/linux"
)
+5
View File
@@ -14,3 +14,8 @@
// Package ring0 provides basic operating system-level stubs.
package ring0
import (
// Required for facts checks.
_ "gvisor.dev/gvisor/pkg/abi/linux"
)
+2 -34
View File
@@ -1,7 +1,5 @@
load("//tools:arch.bzl", "arch_genrule", "select_arch")
load("//tools:defs.bzl", "go_library", "go_test")
load("//tools/go_generics:defs.bzl", "go_template_instance")
load("//tools/nogo:defs.bzl", "nogo_facts")
package(licenses = ["notice"])
@@ -16,37 +14,6 @@ go_template_instance(
},
)
nogo_facts(
name = "bluepill_impl",
srcs = [
"//pkg/ring0:aarch64.go",
"//pkg/ring0:defs.go",
"//pkg/ring0:defs_amd64.go",
"//pkg/ring0:defs_arm64.go",
"//pkg/ring0:entry_template.go",
"//pkg/ring0:x86.go",
],
output = "bluepill_impl.s",
template = select_arch(
amd64 = "bluepill_amd64.s",
arm64 = "bluepill_arm64.s",
),
deps = [
"//pkg/abi/linux",
"//pkg/cpuid",
"//pkg/hostarch",
"//pkg/ring0/pagetables",
"//pkg/sentry/arch",
"//pkg/sentry/arch/fpu",
],
)
arch_genrule(
name = "bluepill_impl_arch",
src = ":bluepill_impl",
template = "bluepill_impl_%s.s",
)
go_library(
name = "kvm",
srcs = [
@@ -57,8 +24,10 @@ go_library(
"bluepill.go",
"bluepill_allocator.go",
"bluepill_amd64.go",
"bluepill_amd64.s",
"bluepill_amd64_unsafe.go",
"bluepill_arm64.go",
"bluepill_arm64.s",
"bluepill_arm64_unsafe.go",
"bluepill_fault.go",
"bluepill_unsafe.go",
@@ -84,7 +53,6 @@ go_library(
"physical_map_amd64.go",
"physical_map_arm64.go",
"virtual_map.go",
":bluepill_impl_arch",
],
visibility = ["//pkg/sentry:internal"],
deps = [
+1 -1
View File
@@ -22,7 +22,7 @@
// ENTRY_CPU_SELF is the location of the CPU in the entry struct.
//
// This is sourced from ring0.
#define ENTRY_CPU_SELF {{ .kernelEntry.cpuSelf.Offset }}
#define ENTRY_CPU_SELF 272 // +checkoffset ring0 kernelEntry.cpuSelf
// Context offsets.
//
+2 -28
View File
@@ -1,35 +1,8 @@
load("//tools:arch.bzl", "arch_genrule", "select_arch")
load("//tools:defs.bzl", "go_library")
load("//tools/nogo:defs.bzl", "nogo_facts")
load("//tools/go_generics:defs.bzl", "go_template_instance")
package(licenses = ["notice"])
nogo_facts(
name = "stub_impl",
srcs = [
"stub_defs.go",
"syscall_thread_defs.go",
],
output = "stub_impl.s",
template = select_arch(
amd64 = "stub_amd64.s",
arm64 = "stub_arm64.s",
),
deps = [
"//pkg/abi/linux",
"//pkg/atomicbitops",
"//pkg/hostarch",
"@org_golang_x_sys//unix:go_default_library",
],
)
arch_genrule(
name = "stub_impl_arch",
src = ":stub_impl",
template = "stub_impl_%s.s",
)
go_template_instance(
name = "subprocess_list",
out = "subprocess_list.go",
@@ -50,6 +23,8 @@ go_library(
"filters_arm64.go",
"lib_amd64.s",
"lib_arm64.s",
"stub_amd64.s",
"stub_arm64.s",
"stub_defs.go",
"stub_unsafe.go",
"subprocess.go",
@@ -76,7 +51,6 @@ go_library(
"systrap_arm64.go",
"systrap_arm64_unsafe.go",
"systrap_unsafe.go",
":stub_impl_arch",
],
visibility = ["//:sandbox"],
deps = [
+24 -23
View File
@@ -15,35 +15,36 @@
#include "funcdata.h"
#include "textflag.h"
#define SYS_GETPID {{ .import.unix.Constants.SYS_GETPID }}
#define SYS_EXIT {{ .import.unix.Constants.SYS_EXIT }}
#define SYS_KILL {{ .import.unix.Constants.SYS_KILL }}
#define SYS_GETPPID {{ .import.unix.Constants.SYS_GETPPID }}
#define SIGKILL {{ .import.unix.Constants.SIGKILL }}
#define SIGSTOP {{ .import.unix.Constants.SIGSTOP }}
#define SYS_PRCTL {{ .import.unix.Constants.SYS_PRCTL }}
#define PR_SET_PDEATHSIG {{ .import.unix.Constants.PR_SET_PDEATHSIG }}
#define SYS_GETPID 39 // +checkconst unix SYS_GETPID
#define SYS_EXIT 60 // +checkconst unix SYS_EXIT
#define SYS_KILL 62 // +checkconst unix SYS_KILL
#define SYS_GETPPID 110 // +checkconst unix SYS_GETPPID
#define SIGKILL 9 // +checkconst unix SIGKILL
#define SIGSTOP 19 // +checkconst unix SIGSTOP
#define SYS_PRCTL 157 // +checkconst unix SYS_PRCTL
#define PR_SET_PDEATHSIG 1 // +checkconst unix PR_SET_PDEATHSIG
#define SYS_FUTEX {{ .import.unix.Constants.SYS_FUTEX }}
#define FUTEX_WAKE {{ .import.linux.Constants.FUTEX_WAKE }}
#define FUTEX_WAIT {{ .import.linux.Constants.FUTEX_WAIT }}
#define SYS_FUTEX 202 // +checkconst unix SYS_FUTEX
#define FUTEX_WAKE 1 // +checkconst linux FUTEX_WAKE
#define FUTEX_WAIT 0 // +checkconst linux FUTEX_WAIT
#define NEW_STUB {{ .Constants._NEW_STUB }}
#define RUN_SYSCALL_LOOP {{ .Constants._RUN_SYSCALL_LOOP }}
#define NEW_STUB 1 // +checkconst . _NEW_STUB
#define RUN_SYSCALL_LOOP 5 // +checkconst . _RUN_SYSCALL_LOOP
// syscallSentryMessage offsets.
#define SENTRY_MESSAGE_STATE {{ .syscallSentryMessage.state.Offset }}
#define SENTRY_MESSAGE_SYSNO {{ .syscallSentryMessage.sysno.Offset }}
#define SENTRY_MESSAGE_ARG0 ({{ .syscallSentryMessage.args.Offset }} + 0*8)
#define SENTRY_MESSAGE_ARG1 ({{ .syscallSentryMessage.args.Offset }} + 1*8)
#define SENTRY_MESSAGE_ARG2 ({{ .syscallSentryMessage.args.Offset }} + 2*8)
#define SENTRY_MESSAGE_ARG3 ({{ .syscallSentryMessage.args.Offset }} + 3*8)
#define SENTRY_MESSAGE_ARG4 ({{ .syscallSentryMessage.args.Offset }} + 4*8)
#define SENTRY_MESSAGE_ARG5 ({{ .syscallSentryMessage.args.Offset }} + 5*8)
#define SENTRY_MESSAGE_STATE 0 // +checkoffset . syscallSentryMessage.state
#define SENTRY_MESSAGE_SYSNO 8 // +checkoffset . syscallSentryMessage.sysno
#define SENTRY_MESSAGE_ARGS 16 // +checkoffset . syscallSentryMessage.args
#define SENTRY_MESSAGE_ARG0 (SENTRY_MESSAGE_ARGS + 0*8)
#define SENTRY_MESSAGE_ARG1 (SENTRY_MESSAGE_ARGS + 1*8)
#define SENTRY_MESSAGE_ARG2 (SENTRY_MESSAGE_ARGS + 2*8)
#define SENTRY_MESSAGE_ARG3 (SENTRY_MESSAGE_ARGS + 3*8)
#define SENTRY_MESSAGE_ARG4 (SENTRY_MESSAGE_ARGS + 4*8)
#define SENTRY_MESSAGE_ARG5 (SENTRY_MESSAGE_ARGS + 5*8)
// syscallStubMessage offsets.
#define STUB_MESSAGE_OFFSET {{ .Constants.syscallStubMessageOffset }}
#define STUB_MESSAGE_RET {{ .syscallStubMessage.ret.Offset }}
#define STUB_MESSAGE_OFFSET 4096 // +checkconst . syscallStubMessageOffset
#define STUB_MESSAGE_RET 0 // +checkoffset . syscallStubMessage.ret
// initStubProcess bootstraps the child and sends itself SIGSTOP to wait for attach.
//

Some files were not shown because too many files have changed in this diff Show More