// Convert
// op n(GS), reg
// to
- // MOVL 0x58(GS), reg
+ // MOVL 0x28(GS), reg
// op n(reg), reg
// The purpose of this patch is to fix some accesses
// to extern register variables (TLS) on Windows, as
q->as = p->as;
p->as = AMOVQ;
p->from.type = D_INDIR+D_GS;
- p->from.offset = 0x58;
+ p->from.offset = 0x28;
}
}
if(HEADTYPE == Hlinux || HEADTYPE == Hfreebsd
p->from.offset = tlsoffset+0;
p->to.type = D_CX;
if(HEADTYPE == Hwindows) {
- // movq %gs:0x58, %rcx
+ // movq %gs:0x28, %rcx
// movq (%rcx), %rcx
p->as = AMOVQ;
p->from.type = D_INDIR+D_GS;
- p->from.offset = 0x58;
+ p->from.offset = 0x28;
p->to.type = D_CX;
// Convert
// op n(GS), reg
// to
- // MOVL 0x2C(FS), reg
+ // MOVL 0x14(FS), reg
// op n(reg), reg
// The purpose of this patch is to fix some accesses
// to extern register variables (TLS) on Windows, as
q->as = p->as;
p->as = AMOVL;
p->from.type = D_INDIR+D_FS;
- p->from.offset = 0x2C;
+ p->from.offset = 0x14;
}
}
if(HEADTYPE == Hlinux) {
case Hwindows:
p->as = AMOVL;
p->from.type = D_INDIR+D_FS;
- p->from.offset = 0x2c;
+ p->from.offset = 0x14;
p->to.type = D_CX;
p = appendp(p);
*/
tls0 = (void*)LocalAlloc(LPTR, 32);
asm volatile (
- "movl %0, %%fs:0x2c\n" // MOVL tls0, 0x2c(FS)
- "movl %%fs:0x2c, %%eax\n" // MOVL 0x2c(FS), tmp
+ "movl %0, %%fs:0x14\n" // MOVL tls0, 0x14(FS)
+ "movl %%fs:0x14, %%eax\n" // MOVL 0x14(FS), tmp
"movl %1, 0(%%eax)\n" // MOVL g, 0(FS)
"movl %2, 4(%%eax)\n" // MOVL m, 4(FS)
:: "r"(tls0), "r"(ts.g), "r"(ts.m) : "%eax"
*/
tls0 = (void*)LocalAlloc(LPTR, 64);
asm volatile (
- "movq %0, %%gs:0x58\n" // MOVL tls0, 0x58(GS)
- "movq %%gs:0x58, %%rax\n" // MOVQ 0x58(GS), tmp
+ "movq %0, %%gs:0x28\n" // MOVL tls0, 0x28(GS)
+ "movq %%gs:0x28, %%rax\n" // MOVQ 0x28(GS), tmp
"movq %1, 0(%%rax)\n" // MOVQ g, 0(GS)
"movq %2, 8(%%rax)\n" // MOVQ m, 8(GS)
:: "r"(tls0), "r"(ts.g), "r"(ts.m) : "%rax"
# ../../libcgo/darwin_386.c:/^threadentry
case "$GOOS" in
windows)
- echo '#define get_tls(r) MOVL 0x2c(FS), r'
+ echo '#define get_tls(r) MOVL 0x14(FS), r'
echo '#define g(r) 0(r)'
echo '#define m(r) 4(r)'
;;
amd64)
case "$GOOS" in
windows)
- echo '#define get_tls(r) MOVQ 0x58(GS), r'
+ echo '#define get_tls(r) MOVQ 0x28(GS), r'
echo '#define g(r) 0(r)'
echo '#define m(r) 8(r)'
;;
PUSHL BX
PUSHL SI
PUSHL DI
- PUSHL 0x2c(FS)
+ PUSHL 0x14(FS)
MOVL SP, DX
// setup dummy m, g
CALL runtime·memclr(SB) // smashes AX,BX,CX
LEAL m_tls(SP), CX
- MOVL CX, 0x2c(FS)
+ MOVL CX, 0x14(FS)
MOVL SP, m(CX)
MOVL SP, BX
SUBL $g_end, SP // space for G
get_tls(CX)
MOVL g(CX), CX
MOVL g_stackbase(CX), SP
- POPL 0x2c(FS)
+ POPL 0x14(FS)
POPL DI
POPL SI
POPL BX
// Set up tls.
LEAL m_tls(CX), SI
- MOVL SI, 0x2c(FS)
+ MOVL SI, 0x14(FS)
MOVL CX, m(SI)
MOVL DX, g(SI)
// setldt(int entry, int address, int limit)
TEXT runtime·setldt(SB),7,$0
MOVL address+4(FP), CX
- MOVL CX, 0x2c(FS)
+ MOVL CX, 0x14(FS)
RET
PUSHQ BX
PUSHQ SI
PUSHQ DI
- PUSHQ 0x58(GS)
+ PUSHQ 0x28(GS)
MOVQ SP, DX
// setup dummy m, g
CALL runtime·memclr(SB) // smashes AX,BX,CX
LEAQ m_tls(SP), CX
- MOVQ CX, 0x58(GS)
+ MOVQ CX, 0x28(GS)
MOVQ SP, m(CX)
MOVQ SP, BX
SUBQ $g_end, SP // space for G
get_tls(CX)
MOVQ g(CX), CX
MOVQ g_stackbase(CX), SP
- POPQ 0x58(GS)
+ POPQ 0x28(GS)
POPQ DI
POPQ SI
POPQ BX
// Set up tls.
LEAQ m_tls(CX), SI
- MOVQ SI, 0x58(GS)
+ MOVQ SI, 0x28(GS)
MOVQ CX, m(SI)
MOVQ DX, g(SI)
// set tls base to DI
TEXT runtime·settls(SB),7,$0
CALL runtime·setstacklimits(SB)
- MOVQ DI, 0x58(GS)
+ MOVQ DI, 0x28(GS)
RET