You've run into a really hairy area of asm code.
My first suggestion is not try to call from assembler into Go.
Otherwise, the problem is that when you call into Go the garbage
collector may run. The garbage collector will walk up the stack and
mark all pointers on the stack as live. That means that it needs to
know which values on the stack are live pointers and which are not.
For Go code the compiler generates this information automatically.
For assembler code you need to generate this information yourself.
Also, calling into Go code may cause the stack to be copied so, again,
the stack copier needs to know which stack pointers are live.
In your case you do apparently have a pointer on the stack while
calling the Go function. That means that you need to write PCDATA
$PCDATA_StackMapIndex pseudo-ops that specifies the stack map. But
frankly I don't know what the value should be. If you run "go tool
compile -S" on some similar Go code you will see the PCDATA
statements, probably one per function call. But the details are so
complex that they are undocumented. To get further on this you will
need to read through cmd/compile/internal/gc/plive.go.
Ian