tpuproxy/pkg/sbf/syscalls.go

87 lines
2.5 KiB
Go
Raw Normal View History

2022-09-04 09:39:45 -07:00
package sbf
import (
"encoding/binary"
"github.com/spaolacci/murmur3"
)
const (
// EntrypointHash equals SymbolHash("entrypoint")
EntrypointHash = uint32(0x71e3cf81)
)
// SymbolHash returns the murmur3 32-bit hash of a symbol name.
func SymbolHash(s string) uint32 {
return murmur3.Sum32([]byte(s))
}
// PCHash returns the murmur3 32-bit hash of a program counter.
//
// Used by VM for non-syscall functions
func PCHash(addr uint64) uint32 {
// TODO this is kinda pointless …
var key [8]byte
binary.LittleEndian.PutUint64(key[:], addr)
return murmur3.Sum32(key[:])
}
2022-09-04 12:49:44 -07:00
// Syscall are callback handles from VM to Go. (work in progress)
type Syscall interface {
2022-09-04 15:28:39 -07:00
Invoke(vm VM, r1, r2, r3, r4, r5 uint64, cuIn int) (r0 uint64, cuOut int, err error)
2022-09-04 12:49:44 -07:00
}
2022-09-04 09:39:45 -07:00
type SyscallRegistry map[uint32]Syscall
func NewSyscallRegistry() SyscallRegistry {
return make(SyscallRegistry)
}
func (s SyscallRegistry) Register(name string, syscall Syscall) (hash uint32, ok bool) {
hash = SymbolHash(name)
if _, exist := s[hash]; exist {
return 0, false // collision or duplicate
}
s[hash] = syscall
ok = true
return
}
2022-09-04 12:49:44 -07:00
// Convenience Methods
2022-09-04 15:28:39 -07:00
type SyscallFunc0 func(vm VM, cuIn int) (r0 uint64, cuOut int, err error)
2022-09-04 12:49:44 -07:00
2022-09-04 15:28:39 -07:00
func (f SyscallFunc0) Invoke(vm VM, _, _, _, _, _ uint64, cuIn int) (r0 uint64, cuOut int, err error) {
2022-09-04 12:49:44 -07:00
return f(vm, cuIn)
}
2022-09-04 15:28:39 -07:00
type SyscallFunc1 func(vm VM, r1 uint64, cuIn int) (r0 uint64, cuOut int, err error)
2022-09-04 12:49:44 -07:00
2022-09-04 15:28:39 -07:00
func (f SyscallFunc1) Invoke(vm VM, r1, _, _, _, _ uint64, cuIn int) (r0 uint64, cuOut int, err error) {
2022-09-04 12:49:44 -07:00
return f(vm, r1, cuIn)
}
2022-09-04 15:28:39 -07:00
type SyscallFunc2 func(vm VM, r1, r2 uint64, cuIn int) (r0 uint64, cuOut int, err error)
2022-09-04 12:49:44 -07:00
2022-09-04 15:28:39 -07:00
func (f SyscallFunc2) Invoke(vm VM, r1, r2, _, _, _ uint64, cuIn int) (r0 uint64, cuOut int, err error) {
2022-09-04 12:49:44 -07:00
return f(vm, r1, r2, cuIn)
}
2022-09-04 15:28:39 -07:00
type SyscallFunc3 func(vm VM, r1, r2, r3 uint64, cuIn int) (r0 uint64, cuOut int, err error)
2022-09-04 12:49:44 -07:00
2022-09-04 15:28:39 -07:00
func (f SyscallFunc3) Invoke(vm VM, r1, r2, r3, _, _ uint64, cuIn int) (r0 uint64, cuOut int, err error) {
2022-09-04 12:49:44 -07:00
return f(vm, r1, r2, r3, cuIn)
}
2022-09-04 15:28:39 -07:00
type SyscallFunc4 func(vm VM, r1, r2, r3, r4 uint64, cuIn int) (r0 uint64, cuOut int, err error)
2022-09-04 12:49:44 -07:00
2022-09-04 15:28:39 -07:00
func (f SyscallFunc4) Invoke(vm VM, r1, r2, r3, r4, _ uint64, cuIn int) (r0 uint64, cuOut int, err error) {
2022-09-04 12:49:44 -07:00
return f(vm, r1, r2, r3, r4, cuIn)
}
2022-09-04 15:28:39 -07:00
type SyscallFunc5 func(vm VM, r1, r2, r3, r4, r5 uint64, cuIn int) (r0 uint64, cuOut int, err error)
2022-09-04 12:49:44 -07:00
2022-09-04 15:28:39 -07:00
func (f SyscallFunc5) Invoke(vm VM, r1, r2, r3, r4, r5 uint64, cuIn int) (r0 uint64, cuOut int, err error) {
2022-09-04 12:49:44 -07:00
return f(vm, r1, r2, r3, r4, r5, cuIn)
}