mirror of
https://github.com/golang/go
synced 2024-11-23 00:10:07 -07:00
runtime/cgo: rename crosscall_386 to crosscall1 and standardise API
Most architectures have a crosscall1 function that takes a function pointer, a setg_gcc function pointer and a g pointer. However, crosscall_386 only takes a function pointer and the call to setg_gcc is performed in the thread entry function. Rename crosscall_386 to crosscall1 for consistency with other architectures, as well as standardising the API - while not strictly necessary, it will allow for further deduplication as the calling code becomes more consistent. Change-Id: I77cf42e1e15e0a4c5802359849a849c32cebd92f Reviewed-on: https://go-review.googlesource.com/c/go/+/518618 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com> Run-TryBot: Joel Sing <joel@sing.id.au> Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
parent
7ce1dd9979
commit
ac64a3628b
@ -14,20 +14,26 @@
|
||||
#endif
|
||||
|
||||
/*
|
||||
* void crosscall_386(void (*fn)(void))
|
||||
* void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g)
|
||||
*
|
||||
* Calling into the 8c tool chain, where all registers are caller save.
|
||||
* Calling into the gc tool chain, where all registers are caller save.
|
||||
* Called from standard x86 ABI, where %ebp, %ebx, %esi,
|
||||
* and %edi are callee-save, so they must be saved explicitly.
|
||||
*/
|
||||
.globl EXT(crosscall_386)
|
||||
EXT(crosscall_386):
|
||||
.globl EXT(crosscall1)
|
||||
EXT(crosscall1):
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
pushl %ebx
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
|
||||
movl 16(%ebp), %eax /* g */
|
||||
pushl %eax
|
||||
movl 12(%ebp), %eax /* setg_gcc */
|
||||
call *%eax
|
||||
popl %eax
|
||||
|
||||
movl 8(%ebp), %eax /* fn */
|
||||
call *%eax
|
||||
|
||||
|
@ -47,6 +47,7 @@ _cgo_sys_thread_start(ThreadStart *ts)
|
||||
}
|
||||
}
|
||||
|
||||
extern void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g);
|
||||
static void*
|
||||
threadentry(void *v)
|
||||
{
|
||||
@ -55,11 +56,6 @@ threadentry(void *v)
|
||||
ts = *(ThreadStart*)v;
|
||||
free(v);
|
||||
|
||||
/*
|
||||
* Set specific keys.
|
||||
*/
|
||||
setg_gcc((void*)ts.g);
|
||||
|
||||
crosscall_386(ts.fn);
|
||||
crosscall1(ts.fn, setg_gcc, ts.g);
|
||||
return nil;
|
||||
}
|
||||
|
@ -50,6 +50,7 @@ _cgo_sys_thread_start(ThreadStart *ts)
|
||||
}
|
||||
}
|
||||
|
||||
extern void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g);
|
||||
static void*
|
||||
threadentry(void *v)
|
||||
{
|
||||
@ -58,11 +59,6 @@ threadentry(void *v)
|
||||
ts = *(ThreadStart*)v;
|
||||
free(v);
|
||||
|
||||
/*
|
||||
* Set specific keys.
|
||||
*/
|
||||
setg_gcc((void*)ts.g);
|
||||
|
||||
crosscall_386(ts.fn);
|
||||
crosscall1(ts.fn, setg_gcc, ts.g);
|
||||
return nil;
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ _cgo_sys_thread_start(ThreadStart *ts)
|
||||
}
|
||||
}
|
||||
|
||||
extern void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g);
|
||||
static void*
|
||||
threadentry(void *v)
|
||||
{
|
||||
@ -55,11 +56,6 @@ threadentry(void *v)
|
||||
ts = *(ThreadStart*)v;
|
||||
free(v);
|
||||
|
||||
/*
|
||||
* Set specific keys.
|
||||
*/
|
||||
setg_gcc((void*)ts.g);
|
||||
|
||||
// On NetBSD, a new thread inherits the signal stack of the
|
||||
// creating thread. That confuses minit, so we remove that
|
||||
// signal stack here before calling the regular mstart. It's
|
||||
@ -71,6 +67,6 @@ threadentry(void *v)
|
||||
ss.ss_flags = SS_DISABLE;
|
||||
sigaltstack(&ss, nil);
|
||||
|
||||
crosscall_386(ts.fn);
|
||||
crosscall1(ts.fn, setg_gcc, ts.g);
|
||||
return nil;
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ _cgo_sys_thread_start(ThreadStart *ts)
|
||||
}
|
||||
}
|
||||
|
||||
extern void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g);
|
||||
static void*
|
||||
threadentry(void *v)
|
||||
{
|
||||
@ -54,11 +55,6 @@ threadentry(void *v)
|
||||
ts = *(ThreadStart*)v;
|
||||
free(v);
|
||||
|
||||
/*
|
||||
* Set specific keys.
|
||||
*/
|
||||
setg_gcc((void*)ts.g);
|
||||
|
||||
crosscall_386(ts.fn);
|
||||
crosscall1(ts.fn, setg_gcc, ts.g);
|
||||
return nil;
|
||||
}
|
||||
|
@ -12,21 +12,23 @@
|
||||
#include "libcgo_windows.h"
|
||||
|
||||
static void threadentry(void*);
|
||||
static void (*setg_gcc)(void*);
|
||||
static DWORD *tls_g;
|
||||
|
||||
void
|
||||
x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)
|
||||
{
|
||||
setg_gcc = setg;
|
||||
tls_g = (DWORD *)tlsg;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_cgo_sys_thread_start(ThreadStart *ts)
|
||||
{
|
||||
_cgo_beginthread(threadentry, ts);
|
||||
}
|
||||
|
||||
extern void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g);
|
||||
static void
|
||||
threadentry(void *v)
|
||||
{
|
||||
@ -47,5 +49,5 @@ threadentry(void *v)
|
||||
:: "r"(ts.tls), "r"(*tls_g), "r"(ts.g) : "%eax"
|
||||
);
|
||||
|
||||
crosscall_386(ts.fn);
|
||||
crosscall1(ts.fn, setg_gcc, ts.g);
|
||||
}
|
||||
|
@ -68,11 +68,6 @@ void _cgo_sys_thread_start(ThreadStart *ts);
|
||||
*/
|
||||
uintptr_t _cgo_wait_runtime_init_done(void);
|
||||
|
||||
/*
|
||||
* Call fn in the 8c world.
|
||||
*/
|
||||
void crosscall_386(void (*fn)(void));
|
||||
|
||||
/*
|
||||
* Prints error then calls abort. For linux and android.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user