Commit d837696f authored by Inphi's avatar Inphi Committed by GitHub

MIPS2.sol MT-FPVM Implementation (#11036)

* cannon: MIPS2 MT-FPVM contract

Add a smart contract implementing the multi-threaded Cannon

* Update packages/contracts-bedrock/src/cannon/libraries/MIPSSyscalls.sol
Co-authored-by: default avatarmbaxter <meredith@oplabs.co>

* cannon: Use common constant for BRK_START

* cannon: Define new constant FUTEX_EMPTY_ADDR

* cannon: Add SYS_ERROR_SIGNAL constant, fix futex wait ret val

* dedup syscall handling; rename timeout

* fix sys_clone bug

* use handler functions in onWaitComplete

* fix nits

* fix ETIMEDOUT constant

* remove leftover console import

* traverse right if left is empty on futex_wake syscall

* Update packages/contracts-bedrock/test/cannon/MIPS2.t.sol
Co-authored-by: default avatarmbaxter <meredith@oplabs.co>

* fix traverseRight updates at popThread

* exit syscall is exit_group if last thread

* simplify wakeup logic; traverse fully before any other operation

* remove dup logic for wakeup traversal end

* fuzz thread.exited in wakeup tests

* update semver-lock; abi snapshots

* implement unused syscalls

* rebase; fix clone args

* update semver-lock

* handle munmap

* add comment on unimplemented syscalls

* add mising snapshots

---------
Co-authored-by: default avatarmbaxter <meredith@oplabs.co>
parent 55b3e492
...@@ -124,8 +124,12 @@ ...@@ -124,8 +124,12 @@
"sourceCodeHash": "0x3ff4a3f21202478935412d47fd5ef7f94a170402ddc50e5c062013ce5544c83f" "sourceCodeHash": "0x3ff4a3f21202478935412d47fd5ef7f94a170402ddc50e5c062013ce5544c83f"
}, },
"src/cannon/MIPS.sol": { "src/cannon/MIPS.sol": {
"initCodeHash": "0xe2cfbfa5d8587a6c3cf52686e29fb0d07e2764af0ef728825529f42ebdeacb5d", "initCodeHash": "0x644a4167210bee38884419c2af618f3cf9533f959bda41aad3cfed4b6f325b1b",
"sourceCodeHash": "0x231f42a05f0c8e5784eb112518afca0bb16a3689f317ce021b8390a0aa70377b" "sourceCodeHash": "0xe28a16aad04ebcadba631a1920cac6e492c18f0d866836610be22779f3f04bfc"
},
"src/cannon/MIPS2.sol": {
"initCodeHash": "0xdcd3bd4bbf8c119ca2d8a435da322ecc5c55a9e2a308789064bf19105933aa6c",
"sourceCodeHash": "0xa1406c94c785b094432aed8af2e1c5b42644e2a0878d48f89b488138e079ee66"
}, },
"src/cannon/PreimageOracle.sol": { "src/cannon/PreimageOracle.sol": {
"initCodeHash": "0xe5db668fe41436f53995e910488c7c140766ba8745e19743773ebab508efd090", "initCodeHash": "0xe5db668fe41436f53995e910488c7c140766ba8745e19743773ebab508efd090",
......
...@@ -10,19 +10,6 @@ ...@@ -10,19 +10,6 @@
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"type": "constructor" "type": "constructor"
}, },
{
"inputs": [],
"name": "BRK_START",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{ {
"inputs": [], "inputs": [],
"name": "oracle", "name": "oracle",
......
[
{
"inputs": [
{
"internalType": "contract IPreimageOracle",
"name": "_oracle",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "_stateData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "_proof",
"type": "bytes"
},
{
"internalType": "bytes32",
"name": "_localContext",
"type": "bytes32"
}
],
"name": "step",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "version",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
}
]
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -43,9 +43,6 @@ contract MIPS is ISemver { ...@@ -43,9 +43,6 @@ contract MIPS is ISemver {
uint32[32] registers; uint32[32] registers;
} }
/// @notice Start of the data segment.
uint32 public constant BRK_START = 0x40000000;
/// @notice The semantic version of the MIPS contract. /// @notice The semantic version of the MIPS contract.
/// @custom:semver 1.0.1 /// @custom:semver 1.0.1
string public constant version = "1.1.0-beta.5"; string public constant version = "1.1.0-beta.5";
...@@ -143,7 +140,7 @@ contract MIPS is ISemver { ...@@ -143,7 +140,7 @@ contract MIPS is ISemver {
} }
// Load the syscall numbers and args from the registers // Load the syscall numbers and args from the registers
(uint32 syscall_no, uint32 a0, uint32 a1, uint32 a2) = sys.getSyscallArgs(state.registers); (uint32 syscall_no, uint32 a0, uint32 a1, uint32 a2,) = sys.getSyscallArgs(state.registers);
uint32 v0 = 0; uint32 v0 = 0;
uint32 v1 = 0; uint32 v1 = 0;
...@@ -152,7 +149,7 @@ contract MIPS is ISemver { ...@@ -152,7 +149,7 @@ contract MIPS is ISemver {
(v0, v1, state.heap) = sys.handleSysMmap(a0, a1, state.heap); (v0, v1, state.heap) = sys.handleSysMmap(a0, a1, state.heap);
} else if (syscall_no == sys.SYS_BRK) { } else if (syscall_no == sys.SYS_BRK) {
// brk: Returns a fixed address for the program break at 0x40000000 // brk: Returns a fixed address for the program break at 0x40000000
v0 = BRK_START; v0 = sys.BRK_START;
} else if (syscall_no == sys.SYS_CLONE) { } else if (syscall_no == sys.SYS_CLONE) {
// clone (not supported) returns 1 // clone (not supported) returns 1
v0 = 1; v0 = 1;
...@@ -162,17 +159,18 @@ contract MIPS is ISemver { ...@@ -162,17 +159,18 @@ contract MIPS is ISemver {
state.exitCode = uint8(a0); state.exitCode = uint8(a0);
return outputState(); return outputState();
} else if (syscall_no == sys.SYS_READ) { } else if (syscall_no == sys.SYS_READ) {
(v0, v1, state.preimageOffset, state.memRoot) = sys.handleSysRead({ sys.SysReadParams memory args = sys.SysReadParams({
_a0: a0, a0: a0,
_a1: a1, a1: a1,
_a2: a2, a2: a2,
_preimageKey: state.preimageKey, preimageKey: state.preimageKey,
_preimageOffset: state.preimageOffset, preimageOffset: state.preimageOffset,
_localContext: _localContext, localContext: _localContext,
_oracle: ORACLE, oracle: ORACLE,
_proofOffset: MIPSMemory.memoryProofOffset(STEP_PROOF_OFFSET, 1), proofOffset: MIPSMemory.memoryProofOffset(STEP_PROOF_OFFSET, 1),
_memRoot: state.memRoot memRoot: state.memRoot
}); });
(v0, v1, state.preimageOffset, state.memRoot) = sys.handleSysRead(args);
} else if (syscall_no == sys.SYS_WRITE) { } else if (syscall_no == sys.SYS_WRITE) {
(v0, v1, state.preimageKey, state.preimageOffset) = sys.handleSysWrite({ (v0, v1, state.preimageKey, state.preimageOffset) = sys.handleSysWrite({
_a0: a0, _a0: a0,
......
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -27,7 +27,7 @@ contract DeploymentSummary is DeploymentSummaryCode { ...@@ -27,7 +27,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
address internal constant l1StandardBridgeProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; address internal constant l1StandardBridgeProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4;
address internal constant l2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60; address internal constant l2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60;
address internal constant l2OutputOracleProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865; address internal constant l2OutputOracleProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865;
address internal constant mipsAddress = 0xcdAdd729ca2319E8955240bDb61A6A6A956A7664; address internal constant mipsAddress = 0x390B62da67a702949505A34881926D5e3Be54B66;
address internal constant optimismMintableERC20FactoryAddress = 0x39Aea2Dd53f2d01c15877aCc2791af6BDD7aD567; address internal constant optimismMintableERC20FactoryAddress = 0x39Aea2Dd53f2d01c15877aCc2791af6BDD7aD567;
address internal constant optimismMintableERC20FactoryProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; address internal constant optimismMintableERC20FactoryProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D;
address internal constant optimismPortalAddress = 0xbdD90485FCbcac869D5b5752179815a3103d8131; address internal constant optimismPortalAddress = 0xbdD90485FCbcac869D5b5752179815a3103d8131;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -27,7 +27,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { ...@@ -27,7 +27,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
address internal constant l1StandardBridgeProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; address internal constant l1StandardBridgeProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4;
address internal constant l2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60; address internal constant l2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60;
address internal constant l2OutputOracleProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865; address internal constant l2OutputOracleProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865;
address internal constant mipsAddress = 0xcdAdd729ca2319E8955240bDb61A6A6A956A7664; address internal constant mipsAddress = 0x390B62da67a702949505A34881926D5e3Be54B66;
address internal constant optimismMintableERC20FactoryAddress = 0x39Aea2Dd53f2d01c15877aCc2791af6BDD7aD567; address internal constant optimismMintableERC20FactoryAddress = 0x39Aea2Dd53f2d01c15877aCc2791af6BDD7aD567;
address internal constant optimismMintableERC20FactoryProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; address internal constant optimismMintableERC20FactoryProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D;
address internal constant optimismPortalAddress = 0xbdD90485FCbcac869D5b5752179815a3103d8131; address internal constant optimismPortalAddress = 0xbdD90485FCbcac869D5b5752179815a3103d8131;
......
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