Initial commit: Go 1.23 release state
This commit is contained in:
53
src/runtime/cgo/gcc_windows_386.c
Normal file
53
src/runtime/cgo/gcc_windows_386.c
Normal file
@@ -0,0 +1,53 @@
|
||||
// Copyright 2009 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <process.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include "libcgo.h"
|
||||
#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)
|
||||
{
|
||||
ThreadStart ts;
|
||||
|
||||
ts = *(ThreadStart*)v;
|
||||
free(v);
|
||||
|
||||
// minit queries stack bounds from the OS.
|
||||
|
||||
/*
|
||||
* Set specific keys in thread local storage.
|
||||
*/
|
||||
asm volatile (
|
||||
"movl %0, %%fs:0(%1)\n" // MOVL tls0, 0(tls_g)(FS)
|
||||
"movl %%fs:0(%1), %%eax\n" // MOVL 0(tls_g)(FS), tmp
|
||||
"movl %2, 0(%%eax)\n" // MOVL g, 0(AX)
|
||||
:: "r"(ts.tls), "r"(*tls_g), "r"(ts.g) : "%eax"
|
||||
);
|
||||
|
||||
crosscall1(ts.fn, setg_gcc, ts.g);
|
||||
}
|
||||
Reference in New Issue
Block a user