Skip to content

Commit

Permalink
runtime/cgo: rename crosscall_386 to crosscall1 and standardise API
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Michael Knyszek <[email protected]>
Run-TryBot: Joel Sing <[email protected]>
Reviewed-by: Ian Lance Taylor <[email protected]>
  • Loading branch information
4a6f656c committed Aug 12, 2023
1 parent 7ce1dd9 commit ac64a36
Show file tree
Hide file tree
Showing 7 changed files with 22 additions and 35 deletions.
14 changes: 10 additions & 4 deletions src/runtime/cgo/gcc_386.S
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
8 changes: 2 additions & 6 deletions src/runtime/cgo/gcc_freebsd_386.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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;
}
8 changes: 2 additions & 6 deletions src/runtime/cgo/gcc_linux_386.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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;
}
8 changes: 2 additions & 6 deletions src/runtime/cgo/gcc_netbsd_386.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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
Expand All @@ -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;
}
8 changes: 2 additions & 6 deletions src/runtime/cgo/gcc_openbsd_386.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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;
}
6 changes: 4 additions & 2 deletions src/runtime/cgo/gcc_windows_386.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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);
}
5 changes: 0 additions & 5 deletions src/runtime/cgo/libcgo.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down

0 comments on commit ac64a36

Please sign in to comment.