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