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:
Joel Sing 2023-08-11 20:19:59 +10:00
parent 7ce1dd9979
commit ac64a3628b
7 changed files with 22 additions and 35 deletions

View file

@ -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

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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.
*/