diff --git a/.github/workflows/demo_test.yml b/.github/workflows/demo_test.yml index 5e761004..bcc03c8d 100644 --- a/.github/workflows/demo_test.yml +++ b/.github/workflows/demo_test.yml @@ -57,10 +57,10 @@ jobs: SGX_MODE=SIM make test" - name: Run Golang v1.16.3 sqlite test - run: docker exec ${{ github.job }} bash -c "cd /root/occlum/tools/toolchains/golang && ./build.sh go1.16.3 && cd /root/occlum/demos/golang/go_sqlite/ && SGX_MODE=SIM ./run_go_sqlite_demo.sh" + run: docker exec ${{ github.job }} bash -c "cd /root/occlum/tools/toolchains/golang && ./build.sh go1.16.3_for_occlum && cd /root/occlum/demos/golang/go_sqlite/ && SGX_MODE=SIM ./run_go_sqlite_demo.sh" - name: Run Golang v1.18.4 sqlite test - run: docker exec ${{ github.job }} bash -c "cd /root/occlum/tools/toolchains/golang && ./build.sh go1.18.4 && cd /root/occlum/demos/golang/go_sqlite/ && SGX_MODE=SIM ./run_go_sqlite_demo.sh" + run: docker exec ${{ github.job }} bash -c "cd /root/occlum/tools/toolchains/golang && ./build.sh go1.18.4_for_occlum && cd /root/occlum/demos/golang/go_sqlite/ && SGX_MODE=SIM ./run_go_sqlite_demo.sh" - name: Go Server set up and run run: docker exec ${{ github.job }} bash -c "cd /root/occlum/demos/golang/web_server && occlum-go mod init web_server && occlum-go get -u -v github.com/gin-gonic/gin; diff --git a/tools/toolchains/golang/adapt-golang1.16.3-to-occlum.patch b/tools/toolchains/golang/adapt-golang1.16.3-to-occlum.patch deleted file mode 100644 index 39a301c4..00000000 --- a/tools/toolchains/golang/adapt-golang1.16.3-to-occlum.patch +++ /dev/null @@ -1,696 +0,0 @@ -From c1d15cf5649843a46e2563982ed981dbda9e7219 Mon Sep 17 00:00:00 2001 -From: jeffery.wsj -Date: Fri, 9 Apr 2021 14:23:49 +0800 -Subject: [PATCH] adapt golang1.16 to occlum libos - ---- - src/runtime/malloc.go | 70 ++++++++++++++++++++++++++++++++++++---------------------------------- - src/runtime/os_linux.go | 4 ++++ - src/runtime/sys_linux_amd64.go | 3 +++ - src/runtime/sys_linux_amd64.s | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------- - src/runtime/textflag.h | 14 ++++++++++++++ - src/syscall/asm_linux_amd64.s | 14 +++++++------- - 6 files changed, 208 insertions(+), 84 deletions(-) - create mode 100644 src/runtime/sys_linux_amd64.go - -diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go -index f20ded5..a557638 100644 ---- a/src/runtime/malloc.go -+++ b/src/runtime/malloc.go -@@ -638,42 +638,44 @@ func (h *mheap) sysAlloc(n uintptr) (v unsafe.Pointer, size uintptr) { - goto mapped - } - -- // Try to grow the heap at a hint address. -- for h.arenaHints != nil { -- hint := h.arenaHints -- p := hint.addr -- if hint.down { -- p -= n -- } -- if p+n < p { -- // We can't use this, so don't ask. -- v = nil -- } else if arenaIndex(p+n-1) >= 1<= 1<(SB),NOSPLIT,$0 - MOVQ $SYS_rt_sigreturn, AX -- SYSCALL -+ SYSCALL_ENHANCE - INT $3 // not reached - - TEXT runtime·sysMmap(SB),NOSPLIT,$0 -@@ -503,7 +503,7 @@ TEXT runtime·sysMmap(SB),NOSPLIT,$0 - MOVL off+28(FP), R9 - - MOVL $SYS_mmap, AX -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS ok - NOTQ AX -@@ -538,7 +538,7 @@ TEXT runtime·sysMunmap(SB),NOSPLIT,$0 - MOVQ addr+0(FP), DI - MOVQ n+8(FP), SI - MOVQ $SYS_munmap, AX -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS 2(PC) - MOVL $0xf1, 0xf1 // crash -@@ -562,7 +562,7 @@ TEXT runtime·madvise(SB),NOSPLIT,$0 - MOVQ n+8(FP), SI - MOVL flags+16(FP), DX - MOVQ $SYS_madvise, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+24(FP) - RET - -@@ -576,12 +576,15 @@ TEXT runtime·futex(SB),NOSPLIT,$0 - MOVQ addr2+24(FP), R8 - MOVL val3+32(FP), R9 - MOVL $SYS_futex, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+40(FP) - RET - - // int32 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void)); - TEXT runtime·clone(SB),NOSPLIT,$0 -+ CMPQ runtime·occlumentry(SB), $0x0 -+ JNE occlum -+ - MOVL flags+0(FP), DI - MOVQ stk+8(FP), SI - MOVQ $0, DX -@@ -644,11 +647,109 @@ nog2: - SYSCALL - JMP -3(PC) // keep exiting - -+occlum: -+ MOVL flags+0(FP), DI -+ MOVQ stk+8(FP), SI -+ MOVQ $0, DX -+ MOVQ $0, R10 -+ MOVQ $0, R8 -+ // Copy mp, gp, fn off parent stack for use by child. -+ // Careful: Linux system call clobbers CX and R11. -+ MOVQ mp+16(FP), R13 -+ MOVQ gp+24(FP), R9 -+ MOVQ fn+32(FP), R12 -+ CMPQ R13, $0 // m -+ JEQ occlum_nog1 -+ CMPQ R9, $0 // g -+ JEQ occlum_nog1 -+ LEAQ m_tls(R13), R8 -+#ifdef GOOS_android -+ // Android stores the TLS offset in runtime·tls_g. -+ SUBQ runtime·tls_g(SB), R8 -+#else -+ ADDQ $8, R8 // ELF wants to use -8(FS) -+#endif -+ ORQ $0x00080000, DI //add flag CLONE_SETTLS(0x00080000) to call clone -+occlum_nog1: -+ // flags -+ MOVQ DI, -16(SI) -+ // fn -+ MOVQ R12, -24(SI) -+ // gp -+ MOVQ R9, -32(SI) -+ // m -+ MOVQ R13, -40(SI) -+ // lea 0x23(%rip),%rax -+ BYTE $0x48; BYTE $0x8d; BYTE $0x05; BYTE $0x23; BYTE $0x00; BYTE $0x00; BYTE $0x00 -+ // thread entry point -+ MOVQ AX, -8(SI) -+ -+ SUBQ $8, SI -+ -+ MOVL $SYS_clone, AX -+ // BYTE $0xcc -+ // lea 0xa(%rip),%rcx -+ BYTE $0x48; BYTE $0x8d; BYTE $0x0d; BYTE $0x0a; BYTE $0x00; BYTE $0x00; BYTE $0x00 -+ MOVQ runtime·occlumentry(SB), R11 -+ JMP R11 -+ -+ // In parent, return. -+ MOVL AX, ret+40(FP) -+ RET -+ -+thread_entrypoint: -+ // add 8, %rsp -+ // MOVQ SI, SP -+ ADDQ $8, SP -+ -+ MOVQ SP, SI -+ -+ // mov -24(%rsp), %r12 -+ // fn -+ BYTE $0x4c; BYTE $0x8b; BYTE $0x64; BYTE $0x24; BYTE $0xe8 -+ -+ // mov -32(%rsp), %r9 -+ // gp -+ BYTE $0x4c; BYTE $0x8b; BYTE $0x4c; BYTE $0x24; BYTE $0xe0 -+ -+ // mov -40(%rsp), %r13 -+ // m -+ BYTE $0x4c; BYTE $0x8b; BYTE $0x6c; BYTE $0x24; BYTE $0xd8 -+ -+ // BYTE $0xcc -+ -+ // If g or m are nil, skip Go-related setup. -+ CMPQ R13, $0 // m -+ JEQ occlum_nog2 -+ CMPQ R9, $0 // g -+ JEQ occlum_nog2 -+ -+ // Initialize m->procid to Linux tid -+ MOVL $SYS_gettid, AX -+ SYSCALL_ENHANCE -+ MOVQ AX, m_procid(R13) -+ -+ // In child, set up new stack -+ get_tls(CX) -+ MOVQ R13, g_m(R9) -+ MOVQ R9, g(CX) -+ CALL runtime·stackcheck(SB) -+ -+occlum_nog2: -+ // Call fn -+ CALL R12 -+ -+ // It shouldn't return. If it does, exit that thread. -+ MOVL $111, DI -+ MOVL $SYS_exit, AX -+ SYSCALL_ENHANCE -+ JMP -3(PC) // keep exiting -+ - TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 - MOVQ new+0(FP), DI - MOVQ old+8(FP), SI - MOVQ $SYS_sigaltstack, AX -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS 2(PC) - MOVL $0xf1, 0xf1 // crash -@@ -665,7 +766,7 @@ TEXT runtime·settls(SB),NOSPLIT,$32 - MOVQ DI, SI - MOVQ $0x1002, DI // ARCH_SET_FS - MOVQ $SYS_arch_prctl, AX -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS 2(PC) - MOVL $0xf1, 0xf1 // crash -@@ -673,7 +774,7 @@ TEXT runtime·settls(SB),NOSPLIT,$32 - - TEXT runtime·osyield(SB),NOSPLIT,$0 - MOVL $SYS_sched_yield, AX -- SYSCALL -+ SYSCALL_ENHANCE - RET - - TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 -@@ -681,7 +782,7 @@ TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 - MOVQ len+8(FP), SI - MOVQ buf+16(FP), DX - MOVL $SYS_sched_getaffinity, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+24(FP) - RET - -@@ -689,7 +790,7 @@ TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 - TEXT runtime·epollcreate(SB),NOSPLIT,$0 - MOVL size+0(FP), DI - MOVL $SYS_epoll_create, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+8(FP) - RET - -@@ -697,7 +798,7 @@ TEXT runtime·epollcreate(SB),NOSPLIT,$0 - TEXT runtime·epollcreate1(SB),NOSPLIT,$0 - MOVL flags+0(FP), DI - MOVL $SYS_epoll_create1, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+8(FP) - RET - -@@ -708,7 +809,7 @@ TEXT runtime·epollctl(SB),NOSPLIT,$0 - MOVL fd+8(FP), DX - MOVQ ev+16(FP), R10 - MOVL $SYS_epoll_ctl, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+24(FP) - RET - -@@ -721,7 +822,7 @@ TEXT runtime·epollwait(SB),NOSPLIT,$0 - MOVL timeout+20(FP), R10 - MOVQ $0, R8 - MOVL $SYS_epoll_pwait, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+24(FP) - RET - -@@ -731,7 +832,7 @@ TEXT runtime·closeonexec(SB),NOSPLIT,$0 - MOVQ $2, SI // F_SETFD - MOVQ $1, DX // FD_CLOEXEC - MOVL $SYS_fcntl, AX -- SYSCALL -+ SYSCALL_ENHANCE - RET - - // func runtime·setNonblock(int32 fd) -@@ -740,13 +841,13 @@ TEXT runtime·setNonblock(SB),NOSPLIT,$0-4 - MOVQ $3, SI // F_GETFL - MOVQ $0, DX - MOVL $SYS_fcntl, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL fd+0(FP), DI // fd - MOVQ $4, SI // F_SETFL - MOVQ $0x800, DX // O_NONBLOCK - ORL AX, DX - MOVL $SYS_fcntl, AX -- SYSCALL -+ SYSCALL_ENHANCE - RET - - // int access(const char *name, int mode) -@@ -757,7 +858,7 @@ TEXT runtime·access(SB),NOSPLIT,$0 - MOVL mode+8(FP), DX - MOVL $0, R10 - MOVL $SYS_faccessat, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+16(FP) - RET - -@@ -767,7 +868,7 @@ TEXT runtime·connect(SB),NOSPLIT,$0-28 - MOVQ addr+8(FP), SI - MOVL len+16(FP), DX - MOVL $SYS_connect, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+24(FP) - RET - -@@ -777,7 +878,7 @@ TEXT runtime·socket(SB),NOSPLIT,$0-20 - MOVL typ+4(FP), SI - MOVL prot+8(FP), DX - MOVL $SYS_socket, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+16(FP) - RET - -@@ -786,6 +887,6 @@ TEXT runtime·sbrk0(SB),NOSPLIT,$0-8 - // Implemented as brk(NULL). - MOVQ $0, DI - MOVL $SYS_brk, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVQ AX, ret+0(FP) - RET -diff --git a/src/runtime/textflag.h b/src/runtime/textflag.h -index daca36d..c4056c0 100644 ---- a/src/runtime/textflag.h -+++ b/src/runtime/textflag.h -@@ -35,3 +35,17 @@ - // Function is the top of the call stack. Call stack unwinders should stop - // at this function. - #define TOPFRAME 2048 -+ -+// step one: assign syscall return address to register rcx, occlum know where -+// should return according to rcx. -+// step two: jump to syscall interface address provided by occlum when go -+// .bin file loaded. -+// -+// actually is the assembler instruction: lea 0xc(%rip),%rcx -+#define SYSCALL_ENHANCE \ -+ CMPQ runtime·occlumentry(SB), $0x0 \ -+ JBE 10(PC) \ -+ BYTE $0x48; BYTE $0x8d; BYTE $0x0d; BYTE $0x0c; BYTE $0x00; BYTE $0x00; BYTE $0x00 \ -+ MOVQ runtime·occlumentry(SB), R11 \ -+ JMP R11 \ -+ SYSCALL -diff --git a/src/syscall/asm_linux_amd64.s b/src/syscall/asm_linux_amd64.s -index ba22179..18cb535 100644 ---- a/src/syscall/asm_linux_amd64.s -+++ b/src/syscall/asm_linux_amd64.s -@@ -22,7 +22,7 @@ TEXT ·Syscall(SB),NOSPLIT,$0-56 - MOVQ a2+16(FP), SI - MOVQ a3+24(FP), DX - MOVQ trap+0(FP), AX // syscall entry -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS ok - MOVQ $-1, r1+32(FP) -@@ -48,7 +48,7 @@ TEXT ·Syscall6(SB),NOSPLIT,$0-80 - MOVQ a5+40(FP), R8 - MOVQ a6+48(FP), R9 - MOVQ trap+0(FP), AX // syscall entry -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS ok6 - MOVQ $-1, r1+56(FP) -@@ -70,7 +70,7 @@ TEXT ·RawSyscall(SB),NOSPLIT,$0-56 - MOVQ a2+16(FP), SI - MOVQ a3+24(FP), DX - MOVQ trap+0(FP), AX // syscall entry -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS ok1 - MOVQ $-1, r1+32(FP) -@@ -93,7 +93,7 @@ TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 - MOVQ a5+40(FP), R8 - MOVQ a6+48(FP), R9 - MOVQ trap+0(FP), AX // syscall entry -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS ok2 - MOVQ $-1, r1+56(FP) -@@ -117,7 +117,7 @@ TEXT ·rawVforkSyscall(SB),NOSPLIT,$0-32 - MOVQ $0, R9 - MOVQ trap+0(FP), AX // syscall entry - POPQ R12 // preserve return address -- SYSCALL -+ SYSCALL_ENHANCE - PUSHQ R12 - CMPQ AX, $0xfffffffffffff001 - JLS ok2 -@@ -136,7 +136,7 @@ TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48 - MOVQ a2+16(FP), SI - MOVQ a3+24(FP), DX - MOVQ trap+0(FP), AX // syscall entry -- SYSCALL -+ SYSCALL_ENHANCE - MOVQ AX, r1+32(FP) - MOVQ DX, r2+40(FP) - RET -@@ -157,7 +157,7 @@ ret: - RET - fallback: - MOVL $SYS_gettimeofday, AX -- SYSCALL -+ SYSCALL_ENHANCE - JMP ret - ok7: - MOVQ $0, err+8(FP) --- -libgit2 0.23.3 - diff --git a/tools/toolchains/golang/adapt-golang1.18.4-to-occlum.patch b/tools/toolchains/golang/adapt-golang1.18.4-to-occlum.patch deleted file mode 100644 index 91302921..00000000 --- a/tools/toolchains/golang/adapt-golang1.18.4-to-occlum.patch +++ /dev/null @@ -1,721 +0,0 @@ -From 59017c2fa01ed4764225fdbfed7a17287f81d87a Mon Sep 17 00:00:00 2001 -From: Lan Yun -Date: Thu, 28 Jul 2022 11:00:15 +0800 -Subject: [PATCH] occlum-go-patch - -Signed-off-by: Lan Yun ---- - src/runtime/malloc.go | 70 ++++++------ - src/runtime/os_linux.go | 4 + - src/runtime/sys_linux_amd64.go | 3 + - src/runtime/sys_linux_amd64.s | 192 +++++++++++++++++++++++++-------- - src/runtime/textflag.h | 18 +++- - src/syscall/asm_linux_amd64.s | 14 +-- - 6 files changed, 212 insertions(+), 89 deletions(-) - create mode 100644 src/runtime/sys_linux_amd64.go - -diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go -index 6ed6ceade2..2a94401c0c 100644 ---- a/src/runtime/malloc.go -+++ b/src/runtime/malloc.go -@@ -645,42 +645,44 @@ func (h *mheap) sysAlloc(n uintptr) (v unsafe.Pointer, size uintptr) { - goto mapped - } - -- // Try to grow the heap at a hint address. -- for h.arenaHints != nil { -- hint := h.arenaHints -- p := hint.addr -- if hint.down { -- p -= n -- } -- if p+n < p { -- // We can't use this, so don't ask. -- v = nil -- } else if arenaIndex(p+n-1) >= 1<= 1<procid to Linux tid -+ MOVL $SYS_gettid, AX -+ SYSCALL_ENHANCE -+ MOVQ AX, m_procid(R13) -+ -+ // In child, set up new stack -+ get_tls(CX) -+ MOVQ R13, g_m(R9) -+ MOVQ R9, g(CX) -+ MOVQ R9, R14 // set g register -+ CALL runtime·stackcheck(SB) -+ -+occlum_nog2: -+ // Call fn -+ CALL R12 -+ -+ // It shouldn't return. If it does, exit that thread. -+ MOVL $111, DI -+ MOVL $SYS_exit, AX -+ SYSCALL_ENHANCE -+ JMP -3(PC) // keep exiting -+ - TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 - MOVQ new+0(FP), DI - MOVQ old+8(FP), SI - MOVQ $SYS_sigaltstack, AX -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS 2(PC) - MOVL $0xf1, 0xf1 // crash -@@ -639,7 +741,7 @@ TEXT runtime·settls(SB),NOSPLIT,$32 - MOVQ DI, SI - MOVQ $0x1002, DI // ARCH_SET_FS - MOVQ $SYS_arch_prctl, AX -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS 2(PC) - MOVL $0xf1, 0xf1 // crash -@@ -647,7 +749,7 @@ TEXT runtime·settls(SB),NOSPLIT,$32 - - TEXT runtime·osyield(SB),NOSPLIT,$0 - MOVL $SYS_sched_yield, AX -- SYSCALL -+ SYSCALL_ENHANCE - RET - - TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 -@@ -655,7 +757,7 @@ TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 - MOVQ len+8(FP), SI - MOVQ buf+16(FP), DX - MOVL $SYS_sched_getaffinity, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+24(FP) - RET - -@@ -663,7 +765,7 @@ TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 - TEXT runtime·epollcreate(SB),NOSPLIT,$0 - MOVL size+0(FP), DI - MOVL $SYS_epoll_create, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+8(FP) - RET - -@@ -671,7 +773,7 @@ TEXT runtime·epollcreate(SB),NOSPLIT,$0 - TEXT runtime·epollcreate1(SB),NOSPLIT,$0 - MOVL flags+0(FP), DI - MOVL $SYS_epoll_create1, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+8(FP) - RET - -@@ -682,7 +784,7 @@ TEXT runtime·epollctl(SB),NOSPLIT,$0 - MOVL fd+8(FP), DX - MOVQ ev+16(FP), R10 - MOVL $SYS_epoll_ctl, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+24(FP) - RET - -@@ -695,7 +797,7 @@ TEXT runtime·epollwait(SB),NOSPLIT,$0 - MOVL timeout+20(FP), R10 - MOVQ $0, R8 - MOVL $SYS_epoll_pwait, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+24(FP) - RET - -@@ -705,7 +807,7 @@ TEXT runtime·closeonexec(SB),NOSPLIT,$0 - MOVQ $2, SI // F_SETFD - MOVQ $1, DX // FD_CLOEXEC - MOVL $SYS_fcntl, AX -- SYSCALL -+ SYSCALL_ENHANCE - RET - - // func runtime·setNonblock(int32 fd) -@@ -714,13 +816,13 @@ TEXT runtime·setNonblock(SB),NOSPLIT,$0-4 - MOVQ $3, SI // F_GETFL - MOVQ $0, DX - MOVL $SYS_fcntl, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL fd+0(FP), DI // fd - MOVQ $4, SI // F_SETFL - MOVQ $0x800, DX // O_NONBLOCK - ORL AX, DX - MOVL $SYS_fcntl, AX -- SYSCALL -+ SYSCALL_ENHANCE - RET - - // int access(const char *name, int mode) -@@ -731,7 +833,7 @@ TEXT runtime·access(SB),NOSPLIT,$0 - MOVL mode+8(FP), DX - MOVL $0, R10 - MOVL $SYS_faccessat, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+16(FP) - RET - -@@ -741,7 +843,7 @@ TEXT runtime·connect(SB),NOSPLIT,$0-28 - MOVQ addr+8(FP), SI - MOVL len+16(FP), DX - MOVL $SYS_connect, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+24(FP) - RET - -@@ -751,7 +853,7 @@ TEXT runtime·socket(SB),NOSPLIT,$0-20 - MOVL typ+4(FP), SI - MOVL prot+8(FP), DX - MOVL $SYS_socket, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVL AX, ret+16(FP) - RET - -@@ -760,6 +862,6 @@ TEXT runtime·sbrk0(SB),NOSPLIT,$0-8 - // Implemented as brk(NULL). - MOVQ $0, DI - MOVL $SYS_brk, AX -- SYSCALL -+ SYSCALL_ENHANCE - MOVQ AX, ret+0(FP) - RET -diff --git a/src/runtime/textflag.h b/src/runtime/textflag.h -index 214075e360..4b7da24e64 100644 ---- a/src/runtime/textflag.h -+++ b/src/runtime/textflag.h -@@ -32,8 +32,20 @@ - #define NOFRAME 512 - // Function can call reflect.Type.Method or reflect.Type.MethodByName. - #define REFLECTMETHOD 1024 --// Function is the outermost frame of the call stack. Call stack unwinders --// should stop at this function. -+// Function is the top of the call stack. Call stack unwinders should stop -+// at this function. - #define TOPFRAME 2048 --// Function is an ABI wrapper. - #define ABIWRAPPER 4096 -+// step one: assign syscall return address to register rcx, occlum know where -+// should return according to rcx. -+// step two: jump to syscall interface address provided by occlum when go -+// .bin file loaded. -+// -+// actually is the assembler instruction: lea 0xc(%rip),%rcx -+#define SYSCALL_ENHANCE \ -+ CMPQ runtime·occlumentry(SB), $0x0 \ -+ JBE 10(PC) \ -+ BYTE $0x48; BYTE $0x8d; BYTE $0x0d; BYTE $0x0c; BYTE $0x00; BYTE $0x00; BYTE $0x00 \ -+ MOVQ runtime·occlumentry(SB), R11 \ -+ JMP R11 \ -+ SYSCALL -diff --git a/src/syscall/asm_linux_amd64.s b/src/syscall/asm_linux_amd64.s -index a9af68d51d..5110d78bb5 100644 ---- a/src/syscall/asm_linux_amd64.s -+++ b/src/syscall/asm_linux_amd64.s -@@ -22,7 +22,7 @@ TEXT ·Syscall(SB),NOSPLIT,$0-56 - MOVQ a2+16(FP), SI - MOVQ a3+24(FP), DX - MOVQ trap+0(FP), AX // syscall entry -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS ok - MOVQ $-1, r1+32(FP) -@@ -48,7 +48,7 @@ TEXT ·Syscall6(SB),NOSPLIT,$0-80 - MOVQ a5+40(FP), R8 - MOVQ a6+48(FP), R9 - MOVQ trap+0(FP), AX // syscall entry -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS ok6 - MOVQ $-1, r1+56(FP) -@@ -70,7 +70,7 @@ TEXT ·RawSyscall(SB),NOSPLIT,$0-56 - MOVQ a2+16(FP), SI - MOVQ a3+24(FP), DX - MOVQ trap+0(FP), AX // syscall entry -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS ok1 - MOVQ $-1, r1+32(FP) -@@ -93,7 +93,7 @@ TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 - MOVQ a5+40(FP), R8 - MOVQ a6+48(FP), R9 - MOVQ trap+0(FP), AX // syscall entry -- SYSCALL -+ SYSCALL_ENHANCE - CMPQ AX, $0xfffffffffffff001 - JLS ok2 - MOVQ $-1, r1+56(FP) -@@ -117,7 +117,7 @@ TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32 - MOVQ $0, R9 - MOVQ trap+0(FP), AX // syscall entry - POPQ R12 // preserve return address -- SYSCALL -+ SYSCALL_ENHANCE - PUSHQ R12 - CMPQ AX, $0xfffffffffffff001 - JLS ok2 -@@ -136,7 +136,7 @@ TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48 - MOVQ a2+16(FP), SI - MOVQ a3+24(FP), DX - MOVQ trap+0(FP), AX // syscall entry -- SYSCALL -+ SYSCALL_ENHANCE - MOVQ AX, r1+32(FP) - MOVQ DX, r2+40(FP) - RET -@@ -157,7 +157,7 @@ ret: - RET - fallback: - MOVL $SYS_gettimeofday, AX -- SYSCALL -+ SYSCALL_ENHANCE - JMP ret - ok7: - MOVQ $0, err+8(FP) --- -2.25.1 - diff --git a/tools/toolchains/golang/build.sh b/tools/toolchains/golang/build.sh index faf5ec41..f518f04b 100755 --- a/tools/toolchains/golang/build.sh +++ b/tools/toolchains/golang/build.sh @@ -2,22 +2,9 @@ THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" BUILD_DIR=/tmp/occlum_golang_toolchain INSTALL_DIR=/opt/occlum/toolchains/golang -GO_VERSION="1.18.4" -if [[ $# -ge 1 ]];then -case $1 in - --help|help) - echo "Usage:$0 [go1.16.3|go1.18.4]" - exit - ;; - "go1.16.3"|"1.16.3"|"v1.16.3") - GO_VERSION="1.16.3" - ;; - "go1.18.4"|"1.18.4"|"v1.18.4") - GO_VERSION="1.18.4" - ;; - esac -fi +#go1.18.4_for_occlum or go1.16.3_for_occlum +GO_BRANCH=${1:-"go1.18.4_for_occlum"} # Exit if any command fails set -e @@ -31,11 +18,7 @@ mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} # Download Golang -git clone https://github.com/golang/go . -# Swtich to Golang 1.16.3 or Golang 1.18.4 -git checkout -b go${GO_VERSION} tags/go${GO_VERSION} -# Apply the patch to adapt Golang to Occlum -git apply ${THIS_DIR}/adapt-golang${GO_VERSION}-to-occlum.patch +git clone -b ${GO_BRANCH} https://github.com/occlum/go.git . # Build Golang cd src