31 lines
1.2 KiB
ArmAsm
31 lines
1.2 KiB
ArmAsm
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
#include "textflag.h"
|
|
|
|
// ABI0 JIT trampoline. enterJIT switches from the Go stack to a prepared
|
|
// stack and jumps to the assembled function; when the function RETs, control
|
|
// lands in leaveJIT, which restores the Go stack and returns to the Go caller.
|
|
//
|
|
// The prepared stack must begin with the address of leaveJIT (the return
|
|
// address the JIT function will pop), followed by the function's ABI0
|
|
// argument area.
|
|
//
|
|
// Single-threaded: savedSP is a package global, so only one JIT call may be
|
|
// in flight at a time. gasm verify runs sequentially.
|
|
|
|
// func enterJIT(fn uintptr, stack uintptr)
|
|
// Switches to the prepared stack and jumps to fn. Does not return normally;
|
|
// the JIT function's RET transfers control to leaveJIT.
|
|
TEXT ·enterJIT(SB), NOSPLIT, $0-16
|
|
MOVQ fn+0(FP), AX // target function address (before SP switch)
|
|
MOVQ SP, ·savedSP(SB) // preserve the Go stack pointer
|
|
MOVQ stack+8(FP), SP // switch to the prepared stack
|
|
JMP AX
|
|
|
|
// func leaveJIT()
|
|
// Restores the Go stack pointer and returns to enterJIT's caller.
|
|
TEXT ·leaveJIT(SB), NOSPLIT, $0-0
|
|
MOVQ ·savedSP(SB), SP
|
|
RET
|