Commit 2c7de99f authored by Inphi's avatar Inphi Committed by GitHub

cannon: Define 64-bit syscalls (#12256)

* cannon: Define 64-bit syscalls

Also add SYS_FSTAT to the list of no-op syscalls emulated by MT-Cannon

* update semver-lock
parent d1f6501b
...@@ -31,6 +31,61 @@ const ( ...@@ -31,6 +31,61 @@ const (
HighMemoryStart = 0x7f_ff_d0_00 HighMemoryStart = 0x7f_ff_d0_00
) )
// 32-bit Syscall codes
const (
SysMmap = 4090
SysBrk = 4045
SysClone = 4120
SysExitGroup = 4246
SysRead = 4003
SysWrite = 4004
SysFcntl = 4055
SysExit = 4001
SysSchedYield = 4162
SysGetTID = 4222
SysFutex = 4238
SysOpen = 4005
SysNanosleep = 4166
SysClockGetTime = 4263
SysGetpid = 4020
)
// Noop Syscall codes
const (
SysMunmap = 4091
SysGetAffinity = 4240
SysMadvise = 4218
SysRtSigprocmask = 4195
SysSigaltstack = 4206
SysRtSigaction = 4194
SysPrlimit64 = 4338
SysClose = 4006
SysPread64 = 4200
SysFstat = 4108
SysFstat64 = 4215
SysOpenAt = 4288
SysReadlink = 4085
SysReadlinkAt = 4298
SysIoctl = 4054
SysEpollCreate1 = 4326
SysPipe2 = 4328
SysEpollCtl = 4249
SysEpollPwait = 4313
SysGetRandom = 4353
SysUname = 4122
SysStat64 = 4213
SysGetuid = 4024
SysGetgid = 4047
SysLlseek = 4140
SysMinCore = 4217
SysTgkill = 4266
// Profiling-related syscalls
SysSetITimer = 4104
SysTimerCreate = 4257
SysTimerSetTime = 4258
SysTimerDelete = 4261
)
var ByteOrderWord = byteOrder32{} var ByteOrderWord = byteOrder32{}
type byteOrder32 struct{} type byteOrder32 struct{}
......
...@@ -31,6 +31,67 @@ const ( ...@@ -31,6 +31,67 @@ const (
HighMemoryStart = 0x7F_FF_FF_FF_D0_00_00_00 HighMemoryStart = 0x7F_FF_FF_FF_D0_00_00_00
) )
// MIPS64 syscall table - https://github.com/torvalds/linux/blob/3efc57369a0ce8f76bf0804f7e673982384e4ac9/arch/mips/kernel/syscalls/syscall_n64.tbl. Generate the syscall numbers using the Makefile in that directory.
// See https://gpages.juszkiewicz.com.pl/syscalls-table/syscalls.html for the generated syscalls
// 64-bit Syscall numbers - new
const (
SysMmap = 5009
SysBrk = 5012
SysClone = 5055
SysExitGroup = 5205
SysRead = 5000
SysWrite = 5001
SysFcntl = 5070
SysExit = 5058
SysSchedYield = 5023
SysGetTID = 5178
SysFutex = 5194
SysOpen = 5002
SysNanosleep = 5034
SysClockGetTime = 5222
SysGetpid = 5038
)
// Noop Syscall numbers
const (
// UndefinedSysNr is the value used for 32-bit syscall numbers that aren't supported for 64-bits
UndefinedSysNr = ^Word(0)
SysMunmap = 5011
SysGetAffinity = 5196
SysMadvise = 5027
SysRtSigprocmask = 5014
SysSigaltstack = 5129
SysRtSigaction = 5013
SysPrlimit64 = 5297
SysClose = 5003
SysPread64 = 5016
SysFstat = 5005
SysFstat64 = UndefinedSysNr
SysOpenAt = 5247
SysReadlink = 5087
SysReadlinkAt = 5257
SysIoctl = 5015
SysEpollCreate1 = 5285
SysPipe2 = 5287
SysEpollCtl = 5208
SysEpollPwait = 5272
SysGetRandom = 5313
SysUname = 5061
SysStat64 = UndefinedSysNr
SysGetuid = 5100
SysGetgid = 5102
SysLlseek = UndefinedSysNr
SysMinCore = 5026
SysTgkill = 5225
// Profiling-related syscalls
SysSetITimer = 5036
SysTimerCreate = 5216
SysTimerSetTime = 5217
SysTimerDelete = 5220
)
var ByteOrderWord = byteOrder64{} var ByteOrderWord = byteOrder64{}
type byteOrder64 struct{} type byteOrder64 struct{}
......
...@@ -19,61 +19,6 @@ const ( ...@@ -19,61 +19,6 @@ const (
AddressMask = arch.AddressMask AddressMask = arch.AddressMask
) )
// TODO(#12205): redefine syscalls for MIPS64
// Syscall codes
const (
SysMmap = 4090
SysBrk = 4045
SysClone = 4120
SysExitGroup = 4246
SysRead = 4003
SysWrite = 4004
SysFcntl = 4055
SysExit = 4001
SysSchedYield = 4162
SysGetTID = 4222
SysFutex = 4238
SysOpen = 4005
SysNanosleep = 4166
SysClockGetTime = 4263
SysGetpid = 4020
)
// Noop Syscall codes
const (
SysMunmap = 4091
SysGetAffinity = 4240
SysMadvise = 4218
SysRtSigprocmask = 4195
SysSigaltstack = 4206
SysRtSigaction = 4194
SysPrlimit64 = 4338
SysClose = 4006
SysPread64 = 4200
SysFstat64 = 4215
SysOpenAt = 4288
SysReadlink = 4085
SysReadlinkAt = 4298
SysIoctl = 4054
SysEpollCreate1 = 4326
SysPipe2 = 4328
SysEpollCtl = 4249
SysEpollPwait = 4313
SysGetRandom = 4353
SysUname = 4122
SysStat64 = 4213
SysGetuid = 4024
SysGetgid = 4047
SysLlseek = 4140
SysMinCore = 4217
SysTgkill = 4266
// Profiling-related syscalls
SysSetITimer = 4104
SysTimerCreate = 4257
SysTimerSetTime = 4258
SysTimerDelete = 4261
)
// File descriptors // File descriptors
const ( const (
FdStdin = 0 FdStdin = 0
......
...@@ -78,10 +78,11 @@ func TestInstrumentedState_Alloc(t *testing.T) { ...@@ -78,10 +78,11 @@ func TestInstrumentedState_Alloc(t *testing.T) {
test := test test := test
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
t.Parallel() t.Parallel()
state, _ := testutil.LoadELFProgram(t, "../../testdata/example/bin/alloc.elf", CreateInitialState, false) state, meta := testutil.LoadELFProgram(t, "../../testdata/example/bin/alloc.elf", CreateInitialState, false)
oracle := testutil.AllocOracle(t, test.numAllocs, test.allocSize) oracle := testutil.AllocOracle(t, test.numAllocs, test.allocSize)
us := NewInstrumentedState(state, oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), nil) us := NewInstrumentedState(state, oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), meta)
require.NoError(t, us.InitDebug())
// emulation shouldn't take more than 20 B steps // emulation shouldn't take more than 20 B steps
for i := 0; i < 20_000_000_000; i++ { for i := 0; i < 20_000_000_000; i++ {
if us.GetState().GetExited() { if us.GetState().GetExited() {
......
...@@ -25,13 +25,13 @@ func (m *InstrumentedState) handleSyscall() error { ...@@ -25,13 +25,13 @@ func (m *InstrumentedState) handleSyscall() error {
//fmt.Printf("syscall: %d\n", syscallNum) //fmt.Printf("syscall: %d\n", syscallNum)
switch syscallNum { switch syscallNum {
case exec.SysMmap: case arch.SysMmap:
var newHeap Word var newHeap Word
v0, v1, newHeap = exec.HandleSysMmap(a0, a1, m.state.Heap) v0, v1, newHeap = exec.HandleSysMmap(a0, a1, m.state.Heap)
m.state.Heap = newHeap m.state.Heap = newHeap
case exec.SysBrk: case arch.SysBrk:
v0 = program.PROGRAM_BREAK v0 = program.PROGRAM_BREAK
case exec.SysClone: // clone case arch.SysClone: // clone
// a0 = flag bitmask, a1 = stack pointer // a0 = flag bitmask, a1 = stack pointer
if exec.ValidCloneFlags != a0 { if exec.ValidCloneFlags != a0 {
m.state.Exited = true m.state.Exited = true
...@@ -72,11 +72,11 @@ func (m *InstrumentedState) handleSyscall() error { ...@@ -72,11 +72,11 @@ func (m *InstrumentedState) handleSyscall() error {
// to ensure we are tracking in the context of the new thread // to ensure we are tracking in the context of the new thread
m.stackTracker.PushStack(stackCaller, stackTarget) m.stackTracker.PushStack(stackCaller, stackTarget)
return nil return nil
case exec.SysExitGroup: case arch.SysExitGroup:
m.state.Exited = true m.state.Exited = true
m.state.ExitCode = uint8(a0) m.state.ExitCode = uint8(a0)
return nil return nil
case exec.SysRead: case arch.SysRead:
var newPreimageOffset Word var newPreimageOffset Word
var memUpdated bool var memUpdated bool
var memAddr Word var memAddr Word
...@@ -85,7 +85,7 @@ func (m *InstrumentedState) handleSyscall() error { ...@@ -85,7 +85,7 @@ func (m *InstrumentedState) handleSyscall() error {
if memUpdated { if memUpdated {
m.handleMemoryUpdate(memAddr) m.handleMemoryUpdate(memAddr)
} }
case exec.SysWrite: case arch.SysWrite:
var newLastHint hexutil.Bytes var newLastHint hexutil.Bytes
var newPreimageKey common.Hash var newPreimageKey common.Hash
var newPreimageOffset Word var newPreimageOffset Word
...@@ -93,12 +93,12 @@ func (m *InstrumentedState) handleSyscall() error { ...@@ -93,12 +93,12 @@ func (m *InstrumentedState) handleSyscall() error {
m.state.LastHint = newLastHint m.state.LastHint = newLastHint
m.state.PreimageKey = newPreimageKey m.state.PreimageKey = newPreimageKey
m.state.PreimageOffset = newPreimageOffset m.state.PreimageOffset = newPreimageOffset
case exec.SysFcntl: case arch.SysFcntl:
v0, v1 = exec.HandleSysFcntl(a0, a1) v0, v1 = exec.HandleSysFcntl(a0, a1)
case exec.SysGetTID: case arch.SysGetTID:
v0 = thread.ThreadId v0 = thread.ThreadId
v1 = 0 v1 = 0
case exec.SysExit: case arch.SysExit:
thread.Exited = true thread.Exited = true
thread.ExitCode = uint8(a0) thread.ExitCode = uint8(a0)
if m.lastThreadRemaining() { if m.lastThreadRemaining() {
...@@ -106,7 +106,7 @@ func (m *InstrumentedState) handleSyscall() error { ...@@ -106,7 +106,7 @@ func (m *InstrumentedState) handleSyscall() error {
m.state.ExitCode = uint8(a0) m.state.ExitCode = uint8(a0)
} }
return nil return nil
case exec.SysFutex: case arch.SysFutex:
// args: a0 = addr, a1 = op, a2 = val, a3 = timeout // args: a0 = addr, a1 = op, a2 = val, a3 = timeout
effAddr := a0 & arch.AddressMask effAddr := a0 & arch.AddressMask
switch a1 { switch a1 {
...@@ -143,16 +143,16 @@ func (m *InstrumentedState) handleSyscall() error { ...@@ -143,16 +143,16 @@ func (m *InstrumentedState) handleSyscall() error {
v0 = exec.SysErrorSignal v0 = exec.SysErrorSignal
v1 = exec.MipsEINVAL v1 = exec.MipsEINVAL
} }
case exec.SysSchedYield, exec.SysNanosleep: case arch.SysSchedYield, arch.SysNanosleep:
v0 = 0 v0 = 0
v1 = 0 v1 = 0
exec.HandleSyscallUpdates(&thread.Cpu, &thread.Registers, v0, v1) exec.HandleSyscallUpdates(&thread.Cpu, &thread.Registers, v0, v1)
m.preemptThread(thread) m.preemptThread(thread)
return nil return nil
case exec.SysOpen: case arch.SysOpen:
v0 = exec.SysErrorSignal v0 = exec.SysErrorSignal
v1 = exec.MipsEBADF v1 = exec.MipsEBADF
case exec.SysClockGetTime: case arch.SysClockGetTime:
switch a0 { switch a0 {
case exec.ClockGettimeRealtimeFlag, exec.ClockGettimeMonotonicFlag: case exec.ClockGettimeRealtimeFlag, exec.ClockGettimeMonotonicFlag:
v0, v1 = 0, 0 v0, v1 = 0, 0
...@@ -175,44 +175,45 @@ func (m *InstrumentedState) handleSyscall() error { ...@@ -175,44 +175,45 @@ func (m *InstrumentedState) handleSyscall() error {
v0 = exec.SysErrorSignal v0 = exec.SysErrorSignal
v1 = exec.MipsEINVAL v1 = exec.MipsEINVAL
} }
case exec.SysGetpid: case arch.SysGetpid:
v0 = 0 v0 = 0
v1 = 0 v1 = 0
case exec.SysMunmap: case arch.SysMunmap:
case exec.SysGetAffinity: case arch.SysGetAffinity:
case exec.SysMadvise: case arch.SysMadvise:
case exec.SysRtSigprocmask: case arch.SysRtSigprocmask:
case exec.SysSigaltstack: case arch.SysSigaltstack:
case exec.SysRtSigaction: case arch.SysRtSigaction:
case exec.SysPrlimit64: case arch.SysPrlimit64:
// TODO(#12205): may be needed for 64-bit Cannon case arch.SysClose:
// case exec.SysGetRtLimit: case arch.SysPread64:
case exec.SysClose: case arch.SysFstat:
case exec.SysPread64: case arch.SysOpenAt:
case exec.SysFstat64: case arch.SysReadlink:
case exec.SysOpenAt: case arch.SysReadlinkAt:
case exec.SysReadlink: case arch.SysIoctl:
case exec.SysReadlinkAt: case arch.SysEpollCreate1:
case exec.SysIoctl: case arch.SysPipe2:
case exec.SysEpollCreate1: case arch.SysEpollCtl:
case exec.SysPipe2: case arch.SysEpollPwait:
case exec.SysEpollCtl: case arch.SysGetRandom:
case exec.SysEpollPwait: case arch.SysUname:
case exec.SysGetRandom: case arch.SysGetuid:
case exec.SysUname: case arch.SysGetgid:
case exec.SysStat64: case arch.SysMinCore:
case exec.SysGetuid: case arch.SysTgkill:
case exec.SysGetgid: case arch.SysSetITimer:
case exec.SysLlseek: case arch.SysTimerCreate:
case exec.SysMinCore: case arch.SysTimerSetTime:
case exec.SysTgkill: case arch.SysTimerDelete:
case exec.SysSetITimer:
case exec.SysTimerCreate:
case exec.SysTimerSetTime:
case exec.SysTimerDelete:
default: default:
m.Traceback() // These syscalls have the same values on 64-bit. So we use if-stmts here to avoid "duplicate case" compiler error for the cannon64 build
panic(fmt.Sprintf("unrecognized syscall: %d", syscallNum)) if arch.IsMips32 && syscallNum == arch.SysFstat64 || syscallNum == arch.SysStat64 || syscallNum == arch.SysLlseek {
// noop
} else {
m.Traceback()
panic(fmt.Sprintf("unrecognized syscall: %d", syscallNum))
}
} }
exec.HandleSyscallUpdates(&thread.Cpu, &thread.Registers, v0, v1) exec.HandleSyscallUpdates(&thread.Cpu, &thread.Registers, v0, v1)
......
...@@ -20,23 +20,23 @@ func (m *InstrumentedState) handleSyscall() error { ...@@ -20,23 +20,23 @@ func (m *InstrumentedState) handleSyscall() error {
//fmt.Printf("syscall: %d\n", syscallNum) //fmt.Printf("syscall: %d\n", syscallNum)
switch syscallNum { switch syscallNum {
case exec.SysMmap: case arch.SysMmap:
var newHeap Word var newHeap Word
v0, v1, newHeap = exec.HandleSysMmap(a0, a1, m.state.Heap) v0, v1, newHeap = exec.HandleSysMmap(a0, a1, m.state.Heap)
m.state.Heap = newHeap m.state.Heap = newHeap
case exec.SysBrk: case arch.SysBrk:
v0 = arch.ProgramBreak v0 = arch.ProgramBreak
case exec.SysClone: // clone (not supported) case arch.SysClone: // clone (not supported)
v0 = 1 v0 = 1
case exec.SysExitGroup: case arch.SysExitGroup:
m.state.Exited = true m.state.Exited = true
m.state.ExitCode = uint8(a0) m.state.ExitCode = uint8(a0)
return nil return nil
case exec.SysRead: case arch.SysRead:
var newPreimageOffset Word var newPreimageOffset Word
v0, v1, newPreimageOffset, _, _ = exec.HandleSysRead(a0, a1, a2, m.state.PreimageKey, m.state.PreimageOffset, m.preimageOracle, m.state.Memory, m.memoryTracker) v0, v1, newPreimageOffset, _, _ = exec.HandleSysRead(a0, a1, a2, m.state.PreimageKey, m.state.PreimageOffset, m.preimageOracle, m.state.Memory, m.memoryTracker)
m.state.PreimageOffset = newPreimageOffset m.state.PreimageOffset = newPreimageOffset
case exec.SysWrite: case arch.SysWrite:
var newLastHint hexutil.Bytes var newLastHint hexutil.Bytes
var newPreimageKey common.Hash var newPreimageKey common.Hash
var newPreimageOffset Word var newPreimageOffset Word
...@@ -44,7 +44,7 @@ func (m *InstrumentedState) handleSyscall() error { ...@@ -44,7 +44,7 @@ func (m *InstrumentedState) handleSyscall() error {
m.state.LastHint = newLastHint m.state.LastHint = newLastHint
m.state.PreimageKey = newPreimageKey m.state.PreimageKey = newPreimageKey
m.state.PreimageOffset = newPreimageOffset m.state.PreimageOffset = newPreimageOffset
case exec.SysFcntl: case arch.SysFcntl:
v0, v1 = exec.HandleSysFcntl(a0, a1) v0, v1 = exec.HandleSysFcntl(a0, a1)
} }
......
...@@ -346,7 +346,7 @@ func TestEVM_MMap(t *testing.T) { ...@@ -346,7 +346,7 @@ func TestEVM_MMap(t *testing.T) {
state := goVm.GetState() state := goVm.GetState()
state.GetMemory().SetMemory(state.GetPC(), syscallInsn) state.GetMemory().SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysMmap state.GetRegistersRef()[2] = arch.SysMmap
state.GetRegistersRef()[4] = c.address state.GetRegistersRef()[4] = c.address
state.GetRegistersRef()[5] = c.size state.GetRegistersRef()[5] = c.size
step := state.GetStep() step := state.GetStep()
...@@ -546,7 +546,7 @@ func TestEVMSysWriteHint(t *testing.T) { ...@@ -546,7 +546,7 @@ func TestEVMSysWriteHint(t *testing.T) {
oracle := testutil.HintTrackingOracle{} oracle := testutil.HintTrackingOracle{}
goVm := v.VMFactory(&oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(int64(i)), testutil.WithLastHint(tt.lastHint)) goVm := v.VMFactory(&oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(int64(i)), testutil.WithLastHint(tt.lastHint))
state := goVm.GetState() state := goVm.GetState()
state.GetRegistersRef()[2] = exec.SysWrite state.GetRegistersRef()[2] = arch.SysWrite
state.GetRegistersRef()[4] = exec.FdHintWrite state.GetRegistersRef()[4] = exec.FdHintWrite
state.GetRegistersRef()[5] = arch.Word(tt.memOffset) state.GetRegistersRef()[5] = arch.Word(tt.memOffset)
state.GetRegistersRef()[6] = arch.Word(tt.bytesToWrite) state.GetRegistersRef()[6] = arch.Word(tt.bytesToWrite)
......
...@@ -261,7 +261,7 @@ func TestEVM_MT_SysRead_Preimage(t *testing.T) { ...@@ -261,7 +261,7 @@ func TestEVM_MT_SysRead_Preimage(t *testing.T) {
// Set up state // Set up state
state.PreimageKey = preimageKey state.PreimageKey = preimageKey
state.PreimageOffset = c.preimageOffset state.PreimageOffset = c.preimageOffset
state.GetRegistersRef()[2] = exec.SysRead state.GetRegistersRef()[2] = arch.SysRead
state.GetRegistersRef()[4] = exec.FdPreimageRead state.GetRegistersRef()[4] = exec.FdPreimageRead
state.GetRegistersRef()[5] = c.addr state.GetRegistersRef()[5] = c.addr
state.GetRegistersRef()[6] = c.count state.GetRegistersRef()[6] = c.count
...@@ -414,7 +414,7 @@ func TestEVM_SysClone_FlagHandling(t *testing.T) { ...@@ -414,7 +414,7 @@ func TestEVM_SysClone_FlagHandling(t *testing.T) {
t.Run(c.name, func(t *testing.T) { t.Run(c.name, func(t *testing.T) {
state := multithreaded.CreateEmptyState() state := multithreaded.CreateEmptyState()
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysClone // Set syscall number state.GetRegistersRef()[2] = arch.SysClone // Set syscall number
state.GetRegistersRef()[4] = c.flags // Set first argument state.GetRegistersRef()[4] = c.flags // Set first argument
curStep := state.Step curStep := state.Step
...@@ -467,7 +467,7 @@ func TestEVM_SysClone_Successful(t *testing.T) { ...@@ -467,7 +467,7 @@ func TestEVM_SysClone_Successful(t *testing.T) {
goVm, state, contracts := setup(t, i, nil) goVm, state, contracts := setup(t, i, nil)
mttestutil.InitializeSingleThread(i*333, state, c.traverseRight) mttestutil.InitializeSingleThread(i*333, state, c.traverseRight)
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysClone // the syscall number state.GetRegistersRef()[2] = arch.SysClone // the syscall number
state.GetRegistersRef()[4] = exec.ValidCloneFlags // a0 - first argument, clone flags state.GetRegistersRef()[4] = exec.ValidCloneFlags // a0 - first argument, clone flags
state.GetRegistersRef()[5] = stackPtr // a1 - the stack pointer state.GetRegistersRef()[5] = stackPtr // a1 - the stack pointer
step := state.GetStep() step := state.GetStep()
...@@ -530,7 +530,7 @@ func TestEVM_SysGetTID(t *testing.T) { ...@@ -530,7 +530,7 @@ func TestEVM_SysGetTID(t *testing.T) {
state.GetCurrentThread().ThreadId = c.threadId state.GetCurrentThread().ThreadId = c.threadId
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysGetTID // Set syscall number state.GetRegistersRef()[2] = arch.SysGetTID // Set syscall number
step := state.Step step := state.Step
// Set up post-state expectations // Set up post-state expectations
...@@ -573,7 +573,7 @@ func TestEVM_SysExit(t *testing.T) { ...@@ -573,7 +573,7 @@ func TestEVM_SysExit(t *testing.T) {
mttestutil.SetupThreads(int64(i*1111), state, i%2 == 0, c.threadCount, 0) mttestutil.SetupThreads(int64(i*1111), state, i%2 == 0, c.threadCount, 0)
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysExit // Set syscall number state.GetRegistersRef()[2] = arch.SysExit // Set syscall number
state.GetRegistersRef()[4] = Word(exitCode) // The first argument (exit code) state.GetRegistersRef()[4] = Word(exitCode) // The first argument (exit code)
step := state.Step step := state.Step
...@@ -682,7 +682,7 @@ func TestEVM_SysFutex_WaitPrivate(t *testing.T) { ...@@ -682,7 +682,7 @@ func TestEVM_SysFutex_WaitPrivate(t *testing.T) {
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.Memory.SetWord(c.effAddr, c.actualValue) state.Memory.SetWord(c.effAddr, c.actualValue)
state.GetRegistersRef()[2] = exec.SysFutex // Set syscall number state.GetRegistersRef()[2] = arch.SysFutex // Set syscall number
state.GetRegistersRef()[4] = c.addressParam state.GetRegistersRef()[4] = c.addressParam
state.GetRegistersRef()[5] = exec.FutexWaitPrivate state.GetRegistersRef()[5] = exec.FutexWaitPrivate
state.GetRegistersRef()[6] = c.targetValue state.GetRegistersRef()[6] = c.targetValue
...@@ -752,7 +752,7 @@ func TestEVM_SysFutex_WakePrivate(t *testing.T) { ...@@ -752,7 +752,7 @@ func TestEVM_SysFutex_WakePrivate(t *testing.T) {
step := state.Step step := state.Step
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysFutex // Set syscall number state.GetRegistersRef()[2] = arch.SysFutex // Set syscall number
state.GetRegistersRef()[4] = c.addressParam state.GetRegistersRef()[4] = c.addressParam
state.GetRegistersRef()[5] = exec.FutexWakePrivate state.GetRegistersRef()[5] = exec.FutexWakePrivate
...@@ -837,7 +837,7 @@ func TestEVM_SysFutex_UnsupportedOp(t *testing.T) { ...@@ -837,7 +837,7 @@ func TestEVM_SysFutex_UnsupportedOp(t *testing.T) {
step := state.GetStep() step := state.GetStep()
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysFutex // Set syscall number state.GetRegistersRef()[2] = arch.SysFutex // Set syscall number
state.GetRegistersRef()[5] = op state.GetRegistersRef()[5] = op
// Setup expectations // Setup expectations
...@@ -863,11 +863,11 @@ func TestEVM_SysFutex_UnsupportedOp(t *testing.T) { ...@@ -863,11 +863,11 @@ func TestEVM_SysFutex_UnsupportedOp(t *testing.T) {
} }
func TestEVM_SysYield(t *testing.T) { func TestEVM_SysYield(t *testing.T) {
runPreemptSyscall(t, "SysSchedYield", exec.SysSchedYield) runPreemptSyscall(t, "SysSchedYield", arch.SysSchedYield)
} }
func TestEVM_SysNanosleep(t *testing.T) { func TestEVM_SysNanosleep(t *testing.T) {
runPreemptSyscall(t, "SysNanosleep", exec.SysNanosleep) runPreemptSyscall(t, "SysNanosleep", arch.SysNanosleep)
} }
func runPreemptSyscall(t *testing.T, syscallName string, syscallNum uint32) { func runPreemptSyscall(t *testing.T, syscallName string, syscallNum uint32) {
...@@ -922,7 +922,7 @@ func TestEVM_SysOpen(t *testing.T) { ...@@ -922,7 +922,7 @@ func TestEVM_SysOpen(t *testing.T) {
goVm, state, contracts := setup(t, 5512, nil) goVm, state, contracts := setup(t, 5512, nil)
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysOpen // Set syscall number state.GetRegistersRef()[2] = arch.SysOpen // Set syscall number
step := state.Step step := state.Step
// Set up post-state expectations // Set up post-state expectations
...@@ -947,7 +947,7 @@ func TestEVM_SysGetPID(t *testing.T) { ...@@ -947,7 +947,7 @@ func TestEVM_SysGetPID(t *testing.T) {
goVm, state, contracts := setup(t, 1929, nil) goVm, state, contracts := setup(t, 1929, nil)
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysGetpid // Set syscall number state.GetRegistersRef()[2] = arch.SysGetpid // Set syscall number
step := state.Step step := state.Step
// Set up post-state expectations // Set up post-state expectations
...@@ -1030,7 +1030,7 @@ func testEVM_SysClockGettime(t *testing.T, clkid Word) { ...@@ -1030,7 +1030,7 @@ func testEVM_SysClockGettime(t *testing.T, clkid Word) {
} }
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysClockGetTime // Set syscall number state.GetRegistersRef()[2] = arch.SysClockGetTime // Set syscall number
state.GetRegistersRef()[4] = clkid // a0 state.GetRegistersRef()[4] = clkid // a0
state.GetRegistersRef()[5] = c.timespecAddr // a1 state.GetRegistersRef()[5] = c.timespecAddr // a1
state.LLReservationActive = v.llReservationActive state.LLReservationActive = v.llReservationActive
...@@ -1074,7 +1074,7 @@ func TestEVM_SysClockGettimeNonMonotonic(t *testing.T) { ...@@ -1074,7 +1074,7 @@ func TestEVM_SysClockGettimeNonMonotonic(t *testing.T) {
timespecAddr := Word(0x1000) timespecAddr := Word(0x1000)
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysClockGetTime // Set syscall number state.GetRegistersRef()[2] = arch.SysClockGetTime // Set syscall number
state.GetRegistersRef()[4] = 0xDEAD // a0 - invalid clockid state.GetRegistersRef()[4] = 0xDEAD // a0 - invalid clockid
state.GetRegistersRef()[5] = timespecAddr // a1 state.GetRegistersRef()[5] = timespecAddr // a1
step := state.Step step := state.Step
...@@ -1103,6 +1103,7 @@ var NoopSyscalls = map[string]uint32{ ...@@ -1103,6 +1103,7 @@ var NoopSyscalls = map[string]uint32{
"SysPrlimit64": 4338, "SysPrlimit64": 4338,
"SysClose": 4006, "SysClose": 4006,
"SysPread64": 4200, "SysPread64": 4200,
"SysFstat": 4108,
"SysFstat64": 4215, "SysFstat64": 4215,
"SysOpenAt": 4288, "SysOpenAt": 4288,
"SysReadlink": 4085, "SysReadlink": 4085,
...@@ -1162,7 +1163,7 @@ func TestEVM_UnsupportedSyscall(t *testing.T) { ...@@ -1162,7 +1163,7 @@ func TestEVM_UnsupportedSyscall(t *testing.T) {
var tracer *tracing.Hooks var tracer *tracing.Hooks
var NoopSyscallNums = maps.Values(NoopSyscalls) var NoopSyscallNums = maps.Values(NoopSyscalls)
var SupportedSyscalls = []uint32{exec.SysMmap, exec.SysBrk, exec.SysClone, exec.SysExitGroup, exec.SysRead, exec.SysWrite, exec.SysFcntl, exec.SysExit, exec.SysSchedYield, exec.SysGetTID, exec.SysFutex, exec.SysOpen, exec.SysNanosleep, exec.SysClockGetTime, exec.SysGetpid} var SupportedSyscalls = []uint32{arch.SysMmap, arch.SysBrk, arch.SysClone, arch.SysExitGroup, arch.SysRead, arch.SysWrite, arch.SysFcntl, arch.SysExit, arch.SysSchedYield, arch.SysGetTID, arch.SysFutex, arch.SysOpen, arch.SysNanosleep, arch.SysClockGetTime, arch.SysGetpid}
unsupportedSyscalls := make([]uint32, 0, 400) unsupportedSyscalls := make([]uint32, 0, 400)
for i := 4000; i < 4400; i++ { for i := 4000; i < 4400; i++ {
candidate := uint32(i) candidate := uint32(i)
...@@ -1476,7 +1477,7 @@ func TestEVM_SchedQuantumThreshold(t *testing.T) { ...@@ -1476,7 +1477,7 @@ func TestEVM_SchedQuantumThreshold(t *testing.T) {
goVm, state, contracts := setup(t, i*789, nil) goVm, state, contracts := setup(t, i*789, nil)
// Setup basic getThreadId syscall instruction // Setup basic getThreadId syscall instruction
state.Memory.SetMemory(state.GetPC(), syscallInsn) state.Memory.SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysGetTID // Set syscall number state.GetRegistersRef()[2] = arch.SysGetTID // Set syscall number
state.StepsSinceLastContextSwitch = c.stepsSinceLastContextSwitch state.StepsSinceLastContextSwitch = c.stepsSinceLastContextSwitch
step := state.Step step := state.Step
......
...@@ -166,7 +166,7 @@ func TestEVM_SysRead_Preimage(t *testing.T) { ...@@ -166,7 +166,7 @@ func TestEVM_SysRead_Preimage(t *testing.T) {
step := state.GetStep() step := state.GetStep()
// Set up state // Set up state
state.GetRegistersRef()[2] = exec.SysRead state.GetRegistersRef()[2] = arch.SysRead
state.GetRegistersRef()[4] = exec.FdPreimageRead state.GetRegistersRef()[4] = exec.FdPreimageRead
state.GetRegistersRef()[5] = c.addr state.GetRegistersRef()[5] = c.addr
state.GetRegistersRef()[6] = c.count state.GetRegistersRef()[6] = c.count
......
...@@ -27,7 +27,7 @@ func FuzzStateSyscallBrk(f *testing.F) { ...@@ -27,7 +27,7 @@ func FuzzStateSyscallBrk(f *testing.F) {
t.Run(v.Name, func(t *testing.T) { t.Run(v.Name, func(t *testing.T) {
goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(seed)) goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(seed))
state := goVm.GetState() state := goVm.GetState()
state.GetRegistersRef()[2] = exec.SysBrk state.GetRegistersRef()[2] = arch.SysBrk
state.GetMemory().SetMemory(state.GetPC(), syscallInsn) state.GetMemory().SetMemory(state.GetPC(), syscallInsn)
step := state.GetStep() step := state.GetStep()
...@@ -65,7 +65,7 @@ func FuzzStateSyscallMmap(f *testing.F) { ...@@ -65,7 +65,7 @@ func FuzzStateSyscallMmap(f *testing.F) {
state := goVm.GetState() state := goVm.GetState()
step := state.GetStep() step := state.GetStep()
state.GetRegistersRef()[2] = exec.SysMmap state.GetRegistersRef()[2] = arch.SysMmap
state.GetRegistersRef()[4] = addr state.GetRegistersRef()[4] = addr
state.GetRegistersRef()[5] = siz state.GetRegistersRef()[5] = siz
state.GetMemory().SetMemory(state.GetPC(), syscallInsn) state.GetMemory().SetMemory(state.GetPC(), syscallInsn)
...@@ -112,7 +112,7 @@ func FuzzStateSyscallExitGroup(f *testing.F) { ...@@ -112,7 +112,7 @@ func FuzzStateSyscallExitGroup(f *testing.F) {
goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(),
testutil.WithRandomization(seed)) testutil.WithRandomization(seed))
state := goVm.GetState() state := goVm.GetState()
state.GetRegistersRef()[2] = exec.SysExitGroup state.GetRegistersRef()[2] = arch.SysExitGroup
state.GetRegistersRef()[4] = Word(exitCode) state.GetRegistersRef()[4] = Word(exitCode)
state.GetMemory().SetMemory(state.GetPC(), syscallInsn) state.GetMemory().SetMemory(state.GetPC(), syscallInsn)
step := state.GetStep() step := state.GetStep()
...@@ -141,7 +141,7 @@ func FuzzStateSyscallFcntl(f *testing.F) { ...@@ -141,7 +141,7 @@ func FuzzStateSyscallFcntl(f *testing.F) {
goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(),
testutil.WithRandomization(seed)) testutil.WithRandomization(seed))
state := goVm.GetState() state := goVm.GetState()
state.GetRegistersRef()[2] = exec.SysFcntl state.GetRegistersRef()[2] = arch.SysFcntl
state.GetRegistersRef()[4] = fd state.GetRegistersRef()[4] = fd
state.GetRegistersRef()[5] = cmd state.GetRegistersRef()[5] = cmd
state.GetMemory().SetMemory(state.GetPC(), syscallInsn) state.GetMemory().SetMemory(state.GetPC(), syscallInsn)
...@@ -201,7 +201,7 @@ func FuzzStateHintRead(f *testing.F) { ...@@ -201,7 +201,7 @@ func FuzzStateHintRead(f *testing.F) {
goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(),
testutil.WithRandomization(seed), testutil.WithPreimageKey(preimageKey)) testutil.WithRandomization(seed), testutil.WithPreimageKey(preimageKey))
state := goVm.GetState() state := goVm.GetState()
state.GetRegistersRef()[2] = exec.SysRead state.GetRegistersRef()[2] = arch.SysRead
state.GetRegistersRef()[4] = exec.FdHintRead state.GetRegistersRef()[4] = exec.FdHintRead
state.GetRegistersRef()[5] = addr state.GetRegistersRef()[5] = addr
state.GetRegistersRef()[6] = count state.GetRegistersRef()[6] = count
...@@ -245,7 +245,7 @@ func FuzzStatePreimageRead(f *testing.F) { ...@@ -245,7 +245,7 @@ func FuzzStatePreimageRead(f *testing.F) {
goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(),
testutil.WithRandomization(seed), testutil.WithPreimageKey(preimageKey), testutil.WithPreimageOffset(preimageOffset), testutil.WithPCAndNextPC(pc)) testutil.WithRandomization(seed), testutil.WithPreimageKey(preimageKey), testutil.WithPreimageOffset(preimageOffset), testutil.WithPCAndNextPC(pc))
state := goVm.GetState() state := goVm.GetState()
state.GetRegistersRef()[2] = exec.SysRead state.GetRegistersRef()[2] = arch.SysRead
state.GetRegistersRef()[4] = exec.FdPreimageRead state.GetRegistersRef()[4] = exec.FdPreimageRead
state.GetRegistersRef()[5] = addr state.GetRegistersRef()[5] = addr
state.GetRegistersRef()[6] = count state.GetRegistersRef()[6] = count
...@@ -324,7 +324,7 @@ func FuzzStateHintWrite(f *testing.F) { ...@@ -324,7 +324,7 @@ func FuzzStateHintWrite(f *testing.F) {
goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(),
testutil.WithRandomization(randSeed), testutil.WithLastHint(lastHint), testutil.WithPCAndNextPC(pc)) testutil.WithRandomization(randSeed), testutil.WithLastHint(lastHint), testutil.WithPCAndNextPC(pc))
state := goVm.GetState() state := goVm.GetState()
state.GetRegistersRef()[2] = exec.SysWrite state.GetRegistersRef()[2] = arch.SysWrite
state.GetRegistersRef()[4] = exec.FdHintWrite state.GetRegistersRef()[4] = exec.FdHintWrite
state.GetRegistersRef()[5] = addr state.GetRegistersRef()[5] = addr
state.GetRegistersRef()[6] = count state.GetRegistersRef()[6] = count
...@@ -390,7 +390,7 @@ func FuzzStatePreimageWrite(f *testing.F) { ...@@ -390,7 +390,7 @@ func FuzzStatePreimageWrite(f *testing.F) {
goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(),
testutil.WithRandomization(seed), testutil.WithPreimageKey(preimageKey), testutil.WithPreimageOffset(128), testutil.WithPCAndNextPC(pc)) testutil.WithRandomization(seed), testutil.WithPreimageKey(preimageKey), testutil.WithPreimageOffset(128), testutil.WithPCAndNextPC(pc))
state := goVm.GetState() state := goVm.GetState()
state.GetRegistersRef()[2] = exec.SysWrite state.GetRegistersRef()[2] = arch.SysWrite
state.GetRegistersRef()[4] = exec.FdPreimageWrite state.GetRegistersRef()[4] = exec.FdPreimageWrite
state.GetRegistersRef()[5] = addr state.GetRegistersRef()[5] = addr
state.GetRegistersRef()[6] = count state.GetRegistersRef()[6] = count
......
...@@ -6,6 +6,7 @@ import ( ...@@ -6,6 +6,7 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/ethereum-optimism/optimism/cannon/mipsevm/arch"
"github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec"
"github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded"
mttestutil "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded/testutil" mttestutil "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded/testutil"
...@@ -27,7 +28,7 @@ func FuzzStateSyscallCloneMT(f *testing.F) { ...@@ -27,7 +28,7 @@ func FuzzStateSyscallCloneMT(f *testing.F) {
// Setup // Setup
state.NextThreadId = nextThreadId state.NextThreadId = nextThreadId
state.GetMemory().SetMemory(state.GetPC(), syscallInsn) state.GetMemory().SetMemory(state.GetPC(), syscallInsn)
state.GetRegistersRef()[2] = exec.SysClone state.GetRegistersRef()[2] = arch.SysClone
state.GetRegistersRef()[4] = exec.ValidCloneFlags state.GetRegistersRef()[4] = exec.ValidCloneFlags
state.GetRegistersRef()[5] = stackPtr state.GetRegistersRef()[5] = stackPtr
step := state.GetStep() step := state.GetStep()
......
...@@ -7,7 +7,7 @@ import ( ...@@ -7,7 +7,7 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" "github.com/ethereum-optimism/optimism/cannon/mipsevm/arch"
"github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil"
) )
...@@ -16,7 +16,7 @@ func FuzzStateSyscallCloneST(f *testing.F) { ...@@ -16,7 +16,7 @@ func FuzzStateSyscallCloneST(f *testing.F) {
f.Fuzz(func(t *testing.T, seed int64) { f.Fuzz(func(t *testing.T, seed int64) {
goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(seed)) goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(seed))
state := goVm.GetState() state := goVm.GetState()
state.GetRegistersRef()[2] = exec.SysClone state.GetRegistersRef()[2] = arch.SysClone
state.GetMemory().SetMemory(state.GetPC(), syscallInsn) state.GetMemory().SetMemory(state.GetPC(), syscallInsn)
step := state.GetStep() step := state.GetStep()
......
...@@ -140,12 +140,12 @@ ...@@ -140,12 +140,12 @@
"sourceCodeHash": "0x2ab6be69795109a1ee04c5693a34d6ce0ff90b62e404cdeb18178bab18d06784" "sourceCodeHash": "0x2ab6be69795109a1ee04c5693a34d6ce0ff90b62e404cdeb18178bab18d06784"
}, },
"src/cannon/MIPS.sol": { "src/cannon/MIPS.sol": {
"initCodeHash": "0x3992081512da36af76b707aee7d8ef9e084c54fb1dc9f8ce9989ed16d1216f01", "initCodeHash": "0xa9a9db7bedf25800f20c947df10310c64beb2ead8eb6be991c83189e975df0fe",
"sourceCodeHash": "0x7630362c20fbca071452031b88c9384d3215c4f2cbee24c7989901de63b0c178" "sourceCodeHash": "0x83aabf115ac0ad407868e633a521602c41d86864d82198e6abbf69d33daaea65"
}, },
"src/cannon/MIPS2.sol": { "src/cannon/MIPS2.sol": {
"initCodeHash": "0x590be819d8f02a7f9eb04ddc447f93ccbfd8bc9339f7c2e65336f9805b6c9a66", "initCodeHash": "0xbb203b0d83efddfa0f664dbc63ec55844318b48fe8133758307f64e87c892a47",
"sourceCodeHash": "0x5bc0ab24cf926953b2ea9eb40b929821e280a7181c6cb18e7954bc3f7dc59be1" "sourceCodeHash": "0x16614cc0e6abf7e81e1e5dc2c0773ee7101cb38af40e0907a8800ca7eddd3b5a"
}, },
"src/cannon/PreimageOracle.sol": { "src/cannon/PreimageOracle.sol": {
"initCodeHash": "0xa0b19e18561da9990c95ebea9750dd901f73147b32b8b234eca0f35073c5a970", "initCodeHash": "0xa0b19e18561da9990c95ebea9750dd901f73147b32b8b234eca0f35073c5a970",
......
...@@ -45,8 +45,8 @@ contract MIPS is ISemver { ...@@ -45,8 +45,8 @@ contract MIPS is ISemver {
} }
/// @notice The semantic version of the MIPS contract. /// @notice The semantic version of the MIPS contract.
/// @custom:semver 1.2.1-beta.1 /// @custom:semver 1.2.1-beta.2
string public constant version = "1.2.1-beta.1"; string public constant version = "1.2.1-beta.2";
/// @notice The preimage oracle contract. /// @notice The preimage oracle contract.
IPreimageOracle internal immutable ORACLE; IPreimageOracle internal immutable ORACLE;
......
...@@ -57,8 +57,8 @@ contract MIPS2 is ISemver { ...@@ -57,8 +57,8 @@ contract MIPS2 is ISemver {
} }
/// @notice The semantic version of the MIPS2 contract. /// @notice The semantic version of the MIPS2 contract.
/// @custom:semver 1.0.0-beta.13 /// @custom:semver 1.0.0-beta.14
string public constant version = "1.0.0-beta.13"; string public constant version = "1.0.0-beta.14";
/// @notice The preimage oracle contract. /// @notice The preimage oracle contract.
IPreimageOracle internal immutable ORACLE; IPreimageOracle internal immutable ORACLE;
...@@ -534,7 +534,7 @@ contract MIPS2 is ISemver { ...@@ -534,7 +534,7 @@ contract MIPS2 is ISemver {
// ignored // ignored
} else if (syscall_no == sys.SYS_PREAD64) { } else if (syscall_no == sys.SYS_PREAD64) {
// ignored // ignored
} else if (syscall_no == sys.SYS_FSTAT64) { } else if (syscall_no == sys.SYS_FSTAT) {
// ignored // ignored
} else if (syscall_no == sys.SYS_OPENAT) { } else if (syscall_no == sys.SYS_OPENAT) {
// ignored // ignored
...@@ -556,14 +556,10 @@ contract MIPS2 is ISemver { ...@@ -556,14 +556,10 @@ contract MIPS2 is ISemver {
// ignored // ignored
} else if (syscall_no == sys.SYS_UNAME) { } else if (syscall_no == sys.SYS_UNAME) {
// ignored // ignored
} else if (syscall_no == sys.SYS_STAT64) {
// ignored
} else if (syscall_no == sys.SYS_GETUID) { } else if (syscall_no == sys.SYS_GETUID) {
// ignored // ignored
} else if (syscall_no == sys.SYS_GETGID) { } else if (syscall_no == sys.SYS_GETGID) {
// ignored // ignored
} else if (syscall_no == sys.SYS_LLSEEK) {
// ignored
} else if (syscall_no == sys.SYS_MINCORE) { } else if (syscall_no == sys.SYS_MINCORE) {
// ignored // ignored
} else if (syscall_no == sys.SYS_TGKILL) { } else if (syscall_no == sys.SYS_TGKILL) {
...@@ -577,7 +573,11 @@ contract MIPS2 is ISemver { ...@@ -577,7 +573,11 @@ contract MIPS2 is ISemver {
} else if (syscall_no == sys.SYS_TIMERDELETE) { } else if (syscall_no == sys.SYS_TIMERDELETE) {
// ignored // ignored
} else { } else {
revert("MIPS2: unimplemented syscall"); if (syscall_no == sys.SYS_FSTAT64 || syscall_no == sys.SYS_STAT64 || syscall_no == sys.SYS_LLSEEK) {
// noop
} else {
revert("MIPS2: unimplemented syscall");
}
} }
st.CpuScalars memory cpu = getCpuScalars(thread); st.CpuScalars memory cpu = getCpuScalars(thread);
......
...@@ -53,6 +53,7 @@ library MIPSSyscalls { ...@@ -53,6 +53,7 @@ library MIPSSyscalls {
uint32 internal constant SYS_PRLIMIT64 = 4338; uint32 internal constant SYS_PRLIMIT64 = 4338;
uint32 internal constant SYS_CLOSE = 4006; uint32 internal constant SYS_CLOSE = 4006;
uint32 internal constant SYS_PREAD64 = 4200; uint32 internal constant SYS_PREAD64 = 4200;
uint32 internal constant SYS_FSTAT = 4108;
uint32 internal constant SYS_FSTAT64 = 4215; uint32 internal constant SYS_FSTAT64 = 4215;
uint32 internal constant SYS_OPENAT = 4288; uint32 internal constant SYS_OPENAT = 4288;
uint32 internal constant SYS_READLINK = 4085; uint32 internal constant SYS_READLINK = 4085;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment