]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/cgo: rename crosscall_386 to crosscall1 and standardise API
authorJoel Sing <joel@sing.id.au>
Fri, 11 Aug 2023 10:19:59 +0000 (20:19 +1000)
committerJoel Sing <joel@sing.id.au>
Sat, 12 Aug 2023 03:56:58 +0000 (03:56 +0000)
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>
src/runtime/cgo/gcc_386.S
src/runtime/cgo/gcc_freebsd_386.c
src/runtime/cgo/gcc_linux_386.c
src/runtime/cgo/gcc_netbsd_386.c
src/runtime/cgo/gcc_openbsd_386.c
src/runtime/cgo/gcc_windows_386.c
src/runtime/cgo/libcgo.h

index 5bd677f4d68c34a50e93023f56871a0509a061b7..d4c5934bcc1026cc3fd4c7b0556b929900b9a720 100644 (file)
 #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
 
index e56fad6a5b9f2d733f31f1bb295cf8073f5a1c9c..ee4306071c660299271804e92faa627392c74639 100644 (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;
 }
index 13a5aa90decfeea9861cc926d3f314a490ea8378..9c23c9030870dd633297e51ca0d97ef69fa123f5 100644 (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;
 }
index b8cb5d0bc95bb94852c84cf82c783c4663d1f4e6..2e775647189ceb9694902907d13a792ff1773e4e 100644 (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;
 }
index 092da4a6d24d71e694fd0187d6c9d5dbfee688a2..5fd2c2f10fb2920daf77a402e8e6dca347c73ae1 100644 (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;
 }
index 0f4f01c7c03f81fc0e821ce7eef3ecb7dcf4e874..983e14b7c8ff3b782e1943d58d3ee221945df211 100644 (file)
 #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);
 }
index 1d2da2d0dfca2c010c3a95ff99469d44dd307440..443aa2696d49349b91881e3d3c507910971a8c74 100644 (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.
  */