rename sbf to sbpf

This commit is contained in:
Richard Patel 2023-03-05 17:41:33 +00:00
parent 4770d3aca0
commit 34c3a854a3
45 changed files with 68 additions and 66 deletions

View File

@ -1,4 +1,4 @@
package sbf package sbpf
import "fmt" import "fmt"

View File

@ -1,4 +1,4 @@
package sbf package sbpf
import ( import (
"fmt" "fmt"

View File

@ -5,7 +5,7 @@ import (
"fmt" "fmt"
"io" "io"
"go.firedancer.io/radiance/pkg/sbf" "go.firedancer.io/radiance/pkg/sbpf"
) )
// The following ELF loading rules seem mostly arbitrary. // The following ELF loading rules seem mostly arbitrary.
@ -90,9 +90,9 @@ func (l *Loader) checkSectionAddrs(sh *elf.Section64) error {
} }
// Ensure section within VM program range // Ensure section within VM program range
vaddr := clampAddUint64(sbf.VaddrProgram, sh.Addr) vaddr := clampAddUint64(sbpf.VaddrProgram, sh.Addr)
vaddrEnd := vaddr + sh.Size vaddrEnd := vaddr + sh.Size
if vaddrEnd < vaddr || vaddrEnd > sbf.VaddrStack { if vaddrEnd < vaddr || vaddrEnd > sbpf.VaddrStack {
return fmt.Errorf("section virtual address out-of-bounds") return fmt.Errorf("section virtual address out-of-bounds")
} }

View File

@ -9,7 +9,7 @@ import (
"fmt" "fmt"
"io" "io"
"go.firedancer.io/radiance/pkg/sbf" "go.firedancer.io/radiance/pkg/sbpf"
) )
// TODO Fuzz // TODO Fuzz
@ -81,7 +81,7 @@ func NewLoaderFromBytes(buf []byte) (*Loader, error) {
// //
// This loader differs from rbpf in a few ways: // This loader differs from rbpf in a few ways:
// We don't support spec bugs, we relocate after loading. // We don't support spec bugs, we relocate after loading.
func (l *Loader) Load() (*sbf.Program, error) { func (l *Loader) Load() (*sbpf.Program, error) {
if err := l.parse(); err != nil { if err := l.parse(); err != nil {
return nil, err return nil, err
} }
@ -94,11 +94,11 @@ func (l *Loader) Load() (*sbf.Program, error) {
return l.getProgram(), nil return l.getProgram(), nil
} }
func (l *Loader) getProgram() *sbf.Program { func (l *Loader) getProgram() *sbpf.Program {
return &sbf.Program{ return &sbpf.Program{
RO: l.program, RO: l.program,
Text: l.text, Text: l.text,
TextVA: sbf.VaddrProgram + l.textRange.min, TextVA: sbpf.VaddrProgram + l.textRange.min,
Entrypoint: l.entrypoint, Entrypoint: l.entrypoint,
Funcs: l.funcs, Funcs: l.funcs,
} }

View File

@ -11,7 +11,7 @@ import (
) )
func TestLoader_Noop(t *testing.T) { func TestLoader_Noop(t *testing.T) {
soNoop := fixtures.Load(t, "sbf", "noop.so") soNoop := fixtures.Load(t, "sbpf", "noop.so")
loader, err := NewLoaderFromBytes(soNoop) loader, err := NewLoaderFromBytes(soNoop)
require.NoError(t, err) require.NoError(t, err)
@ -201,7 +201,7 @@ func isZeroBytes(b []byte) bool {
} }
func TestVerifier(t *testing.T) { func TestVerifier(t *testing.T) {
loader, err := NewLoaderFromBytes(fixtures.Load(t, "sbf", "noop.so")) loader, err := NewLoaderFromBytes(fixtures.Load(t, "sbpf", "noop.so"))
require.NoError(t, err) require.NoError(t, err)
program, err := loader.Load() program, err := loader.Load()

View File

@ -5,7 +5,7 @@ import (
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"go.firedancer.io/radiance/pkg/sbf" "go.firedancer.io/radiance/pkg/sbpf"
) )
// relocate applies ELF relocations (for syscalls and position-independent code). // relocate applies ELF relocations (for syscalls and position-independent code).
@ -25,13 +25,13 @@ func (l *Loader) relocate() error {
func (l *Loader) fixupRelativeCalls() error { func (l *Loader) fixupRelativeCalls() error {
// TODO does invariant text.size%8 == 0 hold? // TODO does invariant text.size%8 == 0 hold?
insCount := l.textRange.len() / sbf.SlotSize insCount := l.textRange.len() / sbpf.SlotSize
buf := l.getRange(l.textRange) buf := l.getRange(l.textRange)
for i := uint64(0); i < insCount; i++ { for i := uint64(0); i < insCount; i++ {
off := i * sbf.SlotSize off := i * sbpf.SlotSize
slot := sbf.GetSlot(buf[off : off+sbf.SlotSize]) slot := sbpf.GetSlot(buf[off : off+sbpf.SlotSize])
isCall := slot.Op() == sbf.OpCall && slot.Imm() != -1 isCall := slot.Op() == sbpf.OpCall && slot.Imm() != -1
if !isCall { if !isCall {
continue continue
} }
@ -54,7 +54,7 @@ func (l *Loader) fixupRelativeCalls() error {
} }
func (l *Loader) registerFunc(target uint64) (uint32, error) { func (l *Loader) registerFunc(target uint64) (uint32, error) {
hash := sbf.PCHash(target) hash := sbpf.PCHash(target)
// TODO check for collision with syscalls // TODO check for collision with syscalls
//if _, ok := l.funcs[hash]; ok { //if _, ok := l.funcs[hash]; ok {
// return 0, fmt.Errorf("symbol hash collision for func at=%d hash=%#08x", target, hash) // return 0, fmt.Errorf("symbol hash collision for func at=%d hash=%#08x", target, hash)
@ -95,8 +95,8 @@ func (l *Loader) applyReloc(reloc *elf.Rel64) error {
relAddr := binary.LittleEndian.Uint32(l.program[rOff+4 : rOff+8]) relAddr := binary.LittleEndian.Uint32(l.program[rOff+4 : rOff+8])
addr := clampAddUint64(sym.Value, uint64(relAddr)) addr := clampAddUint64(sym.Value, uint64(relAddr))
if addr < sbf.VaddrProgram { if addr < sbpf.VaddrProgram {
addr += sbf.VaddrProgram addr += sbpf.VaddrProgram
} }
// Write to imm field of two slots // Write to imm field of two slots
@ -111,8 +111,8 @@ func (l *Loader) applyReloc(reloc *elf.Rel64) error {
if addr == 0 { if addr == 0 {
return fmt.Errorf("invalid R_BPF_64_RELATIVE") return fmt.Errorf("invalid R_BPF_64_RELATIVE")
} }
if addr < sbf.VaddrProgram { if addr < sbpf.VaddrProgram {
addr += sbf.VaddrProgram addr += sbpf.VaddrProgram
} }
// Write to imm field of two slots // Write to imm field of two slots
@ -122,13 +122,13 @@ func (l *Loader) applyReloc(reloc *elf.Rel64) error {
var addr uint64 var addr uint64
if l.eh.Flags == EF_SBF_V2 { if l.eh.Flags == EF_SBF_V2 {
addr = binary.LittleEndian.Uint64(l.program[rOff : rOff+8]) addr = binary.LittleEndian.Uint64(l.program[rOff : rOff+8])
if addr < sbf.VaddrProgram { if addr < sbpf.VaddrProgram {
addr += sbf.VaddrProgram addr += sbpf.VaddrProgram
} }
} else { } else {
// lol // lol
addr = uint64(binary.LittleEndian.Uint32(l.program[rOff+4 : rOff+8])) addr = uint64(binary.LittleEndian.Uint32(l.program[rOff+4 : rOff+8]))
addr = clampAddUint64(addr, sbf.VaddrProgram) addr = clampAddUint64(addr, sbpf.VaddrProgram)
} }
binary.LittleEndian.PutUint64(l.program[rOff:rOff+8], addr) binary.LittleEndian.PutUint64(l.program[rOff:rOff+8], addr)
} }
@ -155,7 +155,7 @@ func (l *Loader) applyReloc(reloc *elf.Rel64) error {
} }
} else { } else {
// Syscall // Syscall
hash = sbf.SymbolHash(name) hash = sbpf.SymbolHash(name)
// TODO check whether syscall is known // TODO check whether syscall is known
} }
@ -168,10 +168,10 @@ func (l *Loader) applyReloc(reloc *elf.Rel64) error {
func (l *Loader) getEntrypoint() error { func (l *Loader) getEntrypoint() error {
offset := l.eh.Entry - l.shText.Addr offset := l.eh.Entry - l.shText.Addr
if offset%sbf.SlotSize != 0 { if offset%sbpf.SlotSize != 0 {
return fmt.Errorf("invalid entrypoint") return fmt.Errorf("invalid entrypoint")
} }
l.entrypoint = offset / sbf.SlotSize l.entrypoint = offset / sbpf.SlotSize
return nil return nil
} }

View File

@ -4,9 +4,9 @@ import (
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"go.firedancer.io/radiance/pkg/sbf" "go.firedancer.io/radiance/pkg/sbpf"
) )
func TestSymbolHash_Entrypoint(t *testing.T) { func TestSymbolHash_Entrypoint(t *testing.T) {
assert.Equal(t, sbf.EntrypointHash, sbf.SymbolHash("entrypoint")) assert.Equal(t, sbpf.EntrypointHash, sbpf.SymbolHash("entrypoint"))
} }

View File

@ -1,4 +1,4 @@
package sbf package sbpf
// Op classes // Op classes
const ( const (

View File

@ -1,4 +1,4 @@
package sbf package sbpf
import ( import (
"fmt" "fmt"

View File

@ -1,4 +1,4 @@
package sbf package sbpf
// Program is a loaded SBF program. // Program is a loaded SBF program.
type Program struct { type Program struct {

View File

@ -1,5 +1,5 @@
// Package sbf implements the Solana Bytecode Format. // Package sbpf implements the Solana Bytecode Format.
package sbf package sbpf
import "encoding/binary" import "encoding/binary"

View File

@ -1,4 +1,4 @@
package sbf package sbpf
// Stack is the VM's call frame stack. // Stack is the VM's call frame stack.
// //

View File

@ -1,4 +1,4 @@
package sbf package sbpf
import ( import (
"encoding/binary" "encoding/binary"

View File

@ -1,4 +1,4 @@
package sbf package sbpf
import "fmt" import "fmt"

View File

@ -1,4 +1,4 @@
package sbf package sbpf
import ( import (
"errors" "errors"

View File

@ -3,7 +3,7 @@ package sealevel
import ( import (
"bytes" "bytes"
"go.firedancer.io/radiance/pkg/sbf" "go.firedancer.io/radiance/pkg/sbpf"
) )
type TxContext struct{} type TxContext struct{}
@ -12,13 +12,13 @@ type Execution struct {
Log Logger Log Logger
} }
func (t *TxContext) newVMOpts(params *Params) *sbf.VMOpts { func (t *TxContext) newVMOpts(params *Params) *sbpf.VMOpts {
execution := &Execution{ execution := &Execution{
Log: new(LogRecorder), Log: new(LogRecorder),
} }
var buf bytes.Buffer var buf bytes.Buffer
params.Serialize(&buf) params.Serialize(&buf)
return &sbf.VMOpts{ return &sbpf.VMOpts{
HeapSize: 32 * 1024, HeapSize: 32 * 1024,
Syscalls: registry, Syscalls: registry,
Context: execution, Context: execution,

View File

@ -12,8 +12,8 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"go.firedancer.io/radiance/fixtures" "go.firedancer.io/radiance/fixtures"
"go.firedancer.io/radiance/pkg/sbf" "go.firedancer.io/radiance/pkg/sbpf"
"go.firedancer.io/radiance/pkg/sbf/loader" "go.firedancer.io/radiance/pkg/sbpf/loader"
) )
func TestExecute_Memo(t *testing.T) { func TestExecute_Memo(t *testing.T) {
@ -34,7 +34,7 @@ func TestExecute_Memo(t *testing.T) {
require.NoError(t, program.Verify()) require.NoError(t, program.Verify())
interpreter := sbf.NewInterpreter(program, opts) interpreter := sbpf.NewInterpreter(program, opts)
require.NotNil(t, interpreter) require.NotNil(t, interpreter)
err = interpreter.Run() err = interpreter.Run()
@ -48,7 +48,7 @@ func TestExecute_Memo(t *testing.T) {
func TestInterpreter_Noop(t *testing.T) { func TestInterpreter_Noop(t *testing.T) {
// TODO simplify API? // TODO simplify API?
loader, err := loader.NewLoaderFromBytes(fixtures.Load(t, "sbf", "noop.so")) loader, err := loader.NewLoaderFromBytes(fixtures.Load(t, "sbpf", "noop.so"))
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, loader) require.NotNil(t, loader)
@ -58,13 +58,13 @@ func TestInterpreter_Noop(t *testing.T) {
require.NoError(t, program.Verify()) require.NoError(t, program.Verify())
syscalls := sbf.NewSyscallRegistry() syscalls := sbpf.NewSyscallRegistry()
syscalls.Register("log", SyscallLog) syscalls.Register("log", SyscallLog)
syscalls.Register("log_64", SyscallLog64) syscalls.Register("log_64", SyscallLog64)
var log LogRecorder var log LogRecorder
interpreter := sbf.NewInterpreter(program, &sbf.VMOpts{ interpreter := sbpf.NewInterpreter(program, &sbpf.VMOpts{
HeapSize: 32 * 1024, HeapSize: 32 * 1024,
Input: nil, Input: nil,
MaxCU: 10000, MaxCU: 10000,
@ -104,7 +104,7 @@ func (e *executeCase) run(t *testing.T) {
opts := tx.newVMOpts(&e.Params) opts := tx.newVMOpts(&e.Params)
opts.Tracer = testLogger{t} opts.Tracer = testLogger{t}
interpreter := sbf.NewInterpreter(program, opts) interpreter := sbpf.NewInterpreter(program, opts)
require.NotNil(t, interpreter) require.NotNil(t, interpreter)
err = interpreter.Run() err = interpreter.Run()

View File

@ -1,12 +1,14 @@
package sealevel package sealevel
import "go.firedancer.io/radiance/pkg/sbf" import (
"go.firedancer.io/radiance/pkg/sbpf"
)
var registry = Syscalls() var registry = Syscalls()
// Syscalls creates a registry of all Sealevel syscalls. // Syscalls creates a registry of all Sealevel syscalls.
func Syscalls() sbf.SyscallRegistry { func Syscalls() sbpf.SyscallRegistry {
reg := sbf.NewSyscallRegistry() reg := sbpf.NewSyscallRegistry()
reg.Register("abort", SyscallAbort) reg.Register("abort", SyscallAbort)
reg.Register("sol_log_", SyscallLog) reg.Register("sol_log_", SyscallLog)
reg.Register("sol_log_64_", SyscallLog64) reg.Register("sol_log_64_", SyscallLog64)
@ -15,6 +17,6 @@ func Syscalls() sbf.SyscallRegistry {
return reg return reg
} }
func syscallCtx(vm sbf.VM) *Execution { func syscallCtx(vm sbpf.VM) *Execution {
return vm.VMContext().(*Execution) return vm.VMContext().(*Execution)
} }

View File

@ -4,11 +4,11 @@ import (
"fmt" "fmt"
"github.com/gagliardetto/solana-go" "github.com/gagliardetto/solana-go"
"go.firedancer.io/radiance/pkg/sbf" "go.firedancer.io/radiance/pkg/sbpf"
"go.firedancer.io/radiance/pkg/sbf/cu" "go.firedancer.io/radiance/pkg/sbpf/cu"
) )
func SyscallLogImpl(vm sbf.VM, ptr, strlen uint64, cuIn int) (r0 uint64, cuOut int, err error) { func SyscallLogImpl(vm sbpf.VM, ptr, strlen uint64, cuIn int) (r0 uint64, cuOut int, err error) {
if strlen > (1 << 30) { if strlen > (1 << 30) {
cuOut = -1 cuOut = -1
return return
@ -26,9 +26,9 @@ func SyscallLogImpl(vm sbf.VM, ptr, strlen uint64, cuIn int) (r0 uint64, cuOut i
return return
} }
var SyscallLog = sbf.SyscallFunc2(SyscallLogImpl) var SyscallLog = sbpf.SyscallFunc2(SyscallLogImpl)
func SyscallLog64Impl(vm sbf.VM, r1, r2, r3, r4, r5 uint64, cuIn int) (r0 uint64, cuOut int, err error) { func SyscallLog64Impl(vm sbpf.VM, r1, r2, r3, r4, r5 uint64, cuIn int) (r0 uint64, cuOut int, err error) {
cuOut = cuIn - CUSyscallBaseCost cuOut = cuIn - CUSyscallBaseCost
if cuOut < 0 { if cuOut < 0 {
return return
@ -39,9 +39,9 @@ func SyscallLog64Impl(vm sbf.VM, r1, r2, r3, r4, r5 uint64, cuIn int) (r0 uint64
return return
} }
var SyscallLog64 = sbf.SyscallFunc5(SyscallLog64Impl) var SyscallLog64 = sbpf.SyscallFunc5(SyscallLog64Impl)
func SyscallLogCUsImpl(vm sbf.VM, cuIn int) (r0 uint64, cuOut int, err error) { func SyscallLogCUsImpl(vm sbpf.VM, cuIn int) (r0 uint64, cuOut int, err error) {
cuOut = cuIn - CUSyscallBaseCost cuOut = cuIn - CUSyscallBaseCost
if cuOut < 0 { if cuOut < 0 {
return return
@ -52,9 +52,9 @@ func SyscallLogCUsImpl(vm sbf.VM, cuIn int) (r0 uint64, cuOut int, err error) {
return return
} }
var SyscallLogCUs = sbf.SyscallFunc0(SyscallLogCUsImpl) var SyscallLogCUs = sbpf.SyscallFunc0(SyscallLogCUsImpl)
func SyscallLogPubkeyImpl(vm sbf.VM, pubkeyAddr uint64, cuIn int) (r0 uint64, cuOut int, err error) { func SyscallLogPubkeyImpl(vm sbpf.VM, pubkeyAddr uint64, cuIn int) (r0 uint64, cuOut int, err error) {
cuOut = cuIn - CUSyscallBaseCost cuOut = cuIn - CUSyscallBaseCost
if cuOut < 0 { if cuOut < 0 {
return return
@ -70,4 +70,4 @@ func SyscallLogPubkeyImpl(vm sbf.VM, pubkeyAddr uint64, cuIn int) (r0 uint64, cu
return return
} }
var SyscallLogPubkey = sbf.SyscallFunc1(SyscallLogPubkeyImpl) var SyscallLogPubkey = sbpf.SyscallFunc1(SyscallLogPubkeyImpl)

View File

@ -3,12 +3,12 @@ package sealevel
import ( import (
"errors" "errors"
"go.firedancer.io/radiance/pkg/sbf" "go.firedancer.io/radiance/pkg/sbpf"
) )
func SyscallAbortImpl(_ sbf.VM, _ int) (r0 uint64, cuOut int, err error) { func SyscallAbortImpl(_ sbpf.VM, _ int) (r0 uint64, cuOut int, err error) {
err = errors.New("aborted") err = errors.New("aborted")
return return
} }
var SyscallAbort = sbf.SyscallFunc0(SyscallAbortImpl) var SyscallAbort = sbpf.SyscallFunc0(SyscallAbortImpl)