From b0454fa2949b456eaf3e39cf29e9f13eb8f3e17e Mon Sep 17 00:00:00 2001
From: George Hotz <geohot@gmail.com>
Date: Thu, 30 Sep 2021 15:55:16 -0700
Subject: [PATCH] minigeth is running in mipsevm

---
 mipsevm/main.go     | 18 +++++++++++++-----
 mipsevm/minigeth.sh |  5 +++++
 risc/run.py         | 15 ++++++++++-----
 3 files changed, 28 insertions(+), 10 deletions(-)
 create mode 100755 mipsevm/minigeth.sh

diff --git a/mipsevm/main.go b/mipsevm/main.go
index 8fc7b4311..1a9fd1f96 100644
--- a/mipsevm/main.go
+++ b/mipsevm/main.go
@@ -94,7 +94,7 @@ type jsoncontract struct {
 //var ram []byte
 //var regs [4096]byte
 
-var debug bool = false
+var debug int = 0
 var ram map[uint64](uint32)
 
 func opStaticCall(pc *uint64, interpreter *vm.EVMInterpreter, scope *vm.ScopeContext) ([]byte, error) {
@@ -119,14 +119,17 @@ func opStaticCall(pc *uint64, interpreter *vm.EVMInterpreter, scope *vm.ScopeCon
 		//scope.Memory.GetPtr(int64(inOffset.Uint64()), int64(inSize.Uint64()))
 
 		ret := common.BigToHash(big.NewInt(int64(nret))).Bytes()
-		if debug {
+		if debug >= 2 {
 			fmt.Println("HOOKED READ!   ", fmt.Sprintf("%x = %x", addr, nret))
 		}
+		if addr == 0xc0000080 && debug >= 1 {
+			fmt.Printf("PC %x\n", nret)
+		}
 		scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
 	} else if args[0] == 184 {
 		addr := common.BytesToHash(args[0x24:0x44]).Big().Uint64()
 		dat := common.BytesToHash(args[0x44:0x64]).Big().Uint64()
-		if debug {
+		if debug >= 2 {
 			fmt.Println("HOOKED WRITE!  ", fmt.Sprintf("%x = %x", addr, dat))
 		}
 		ram[addr] = uint32(dat)
@@ -218,8 +221,13 @@ func main() {
 	//debug = true
 
 	if len(os.Args) > 1 {
-		debug = true
-		runTest(os.Args[1], 20, interpreter, bytecode)
+		if os.Args[1] == "/tmp/minigeth.bin" {
+			debug = 1
+			runTest(os.Args[1], 20, interpreter, bytecode)
+		} else {
+			debug = 2
+			runTest(os.Args[1], 20, interpreter, bytecode)
+		}
 	} else {
 		files, err := ioutil.ReadDir("test/bin")
 		if err != nil {
diff --git a/mipsevm/minigeth.sh b/mipsevm/minigeth.sh
new file mode 100755
index 000000000..f7eb735dd
--- /dev/null
+++ b/mipsevm/minigeth.sh
@@ -0,0 +1,5 @@
+#!/bin/bash -e
+(cd ../ && npx hardhat compile)
+(cd ../risc && ./build.sh && COMPILE=1 ./run.py)
+go build
+./mipsevm /tmp/minigeth.bin
diff --git a/risc/run.py b/risc/run.py
index f56fc9664..7dca778f1 100755
--- a/risc/run.py
+++ b/risc/run.py
@@ -24,9 +24,6 @@ mu = Uc(UC_ARCH_MIPS, UC_MODE_32 + UC_MODE_BIG_ENDIAN)
 mregs = [UC_MIPS_REG_AT, UC_MIPS_REG_V0, UC_MIPS_REG_V1, UC_MIPS_REG_A0, UC_MIPS_REG_A1, UC_MIPS_REG_A2, UC_MIPS_REG_A3]
 regs = ["at", "v0", "v1", "a0", "a1", "a2", "a3"]
 
-SIZE = 16*1024*1024
-
-
 heap_start = 0x20000000 # 0x20000000-0x30000000
 # input oracle              @ 0x30000000
 # output oracle             @ 0x30000800
@@ -279,7 +276,9 @@ elf.seek(0)
 #print(hex(rte))
 
 # program memory (16 MB)
-mu.mem_map(0, SIZE)
+prog_size = (len(data)+0xFFF) & ~0xFFF
+mu.mem_map(0, prog_size)
+print("malloced 0x%x for program" % prog_size)
 
 # heap (256 MB) @ 0x20000000
 mu.mem_map(heap_start, 256*1024*1024)
@@ -369,8 +368,14 @@ mu.hook_add(UC_HOOK_INTR, hook_interrupt)
 if tracelevel == 4:
   start_instrumenting()
 
+with open("/tmp/minigeth.bin", "wb") as f:
+  f.write(mu.mem_read(0, prog_size))
+
+if os.getenv("COMPILE", None) == "1":
+  exit(0)
+
 try:
-  mu.emu_start(entry, SIZE)
+  mu.emu_start(entry, -1)
 except unicorn.UcError:
   pass
 
-- 
2.23.0