mirror of
https://github.com/golang/go
synced 2024-11-22 07:44:43 -07:00
convert 386 to use %gs instead of %fs for extern register.
required for nacl and may be nicer for ffi, because %gs is the standard register for thread-local storage. R=ken OCL=34861 CL=34866
This commit is contained in:
parent
a95ee61aea
commit
bbcb91a3a7
@ -450,7 +450,7 @@ naddr(Node *n, Adr *a)
|
||||
break;
|
||||
|
||||
case OEXREG:
|
||||
a->type = D_INDIR + D_FS;
|
||||
a->type = D_INDIR + D_GS;
|
||||
a->offset = n->reg - 1;
|
||||
break;
|
||||
|
||||
|
@ -464,6 +464,7 @@ dostkoff(void)
|
||||
int a, f, curframe, curbecome, maxbecome;
|
||||
Prog *pmorestack;
|
||||
Sym *symmorestack;
|
||||
static int fsreg;
|
||||
|
||||
pmorestack = P;
|
||||
symmorestack = lookup("sys·morestack", 0);
|
||||
@ -565,7 +566,7 @@ dostkoff(void)
|
||||
if(!(p->from.scale & NOSPLIT)) {
|
||||
p = appendp(p); // load g into CX
|
||||
p->as = AMOVL;
|
||||
p->from.type = D_INDIR+D_FS;
|
||||
p->from.type = D_INDIR+D_GS;
|
||||
p->from.offset = 0;
|
||||
p->to.type = D_CX;
|
||||
|
||||
|
@ -15,12 +15,12 @@ TEXT _rt0_386(SB),7,$0
|
||||
|
||||
CALL ldt0setup(SB)
|
||||
|
||||
// set up %fs to refer to that ldt entry
|
||||
// set up %gs to refer to that ldt entry
|
||||
MOVL $(7*8+7), AX
|
||||
MOVW AX, FS
|
||||
MOVW AX, GS
|
||||
|
||||
// store through it, to make sure it works
|
||||
MOVL $0x123, 0(FS)
|
||||
MOVL $0x123, 0(GS)
|
||||
MOVL tls0(SB), AX
|
||||
CMPL AX, $0x123
|
||||
JEQ ok
|
||||
|
@ -139,7 +139,7 @@ TEXT bsdthread_start(SB),7,$0
|
||||
POPAL
|
||||
SHLL $3, DI // segment# is ldt*8 + 7.
|
||||
ADDL $7, DI
|
||||
MOVW DI, FS
|
||||
MOVW DI, GS
|
||||
|
||||
// Now segment is established. Initialize m, g.
|
||||
MOVL AX, g
|
||||
|
@ -8,20 +8,6 @@
|
||||
|
||||
#include "386/asm.h"
|
||||
|
||||
TEXT syscall(SB),7,$0
|
||||
MOVL 4(SP), AX // syscall number
|
||||
MOVL 8(SP), BX // arg1
|
||||
MOVL 12(SP), CX // arg2
|
||||
MOVL 16(SP), DX // arg3
|
||||
MOVL 20(SP), SI // arg4
|
||||
MOVL 24(SP), DI // arg5
|
||||
MOVL 28(SP), BP // arg6
|
||||
INT $0x80
|
||||
CMPL AX, $0xfffff001
|
||||
JLS 2(PC)
|
||||
INT $3 // not reached
|
||||
RET
|
||||
|
||||
TEXT exit(SB),7,$0
|
||||
MOVL $252, AX // syscall number
|
||||
MOVL 4(SP), BX
|
||||
@ -159,7 +145,7 @@ TEXT clone(SB),7,$0
|
||||
POPAL
|
||||
SHLL $3, DI // segment# is ldt*8 + 7 (different 7 than above)
|
||||
ADDL $7, DI
|
||||
MOVW DI, FS
|
||||
MOVW DI, GS
|
||||
|
||||
// Now segment is established. Initialize m, g.
|
||||
MOVL DX, g
|
||||
@ -190,15 +176,15 @@ TEXT sigaltstack(SB),7,$-8
|
||||
|
||||
// <asm-i386/ldt.h>
|
||||
// struct user_desc {
|
||||
// unsigned int entry_number;
|
||||
// unsigned long base_addr;
|
||||
// unsigned int limit;
|
||||
// unsigned int seg_32bit:1;
|
||||
// unsigned int contents:2;
|
||||
// unsigned int read_exec_only:1;
|
||||
// unsigned int limit_in_pages:1;
|
||||
// unsigned int seg_not_present:1;
|
||||
// unsigned int useable:1;
|
||||
// unsigned int entry_number;
|
||||
// unsigned long base_addr;
|
||||
// unsigned int limit;
|
||||
// unsigned int seg_32bit:1;
|
||||
// unsigned int contents:2;
|
||||
// unsigned int read_exec_only:1;
|
||||
// unsigned int limit_in_pages:1;
|
||||
// unsigned int seg_not_present:1;
|
||||
// unsigned int useable:1;
|
||||
// };
|
||||
#define SEG_32BIT 0x01
|
||||
// contents are the 2 bits 0x02 and 0x04.
|
||||
@ -223,10 +209,15 @@ TEXT setldt(SB),7,$32
|
||||
MOVL $(SEG_32BIT|USEABLE|CONTENTS_DATA), 12(AX) // flag bits
|
||||
|
||||
// call modify_ldt
|
||||
MOVL $123, 0(SP) // syscall - modify_ldt
|
||||
MOVL $1, 4(SP) // func = 1 (write)
|
||||
MOVL AX, 8(SP) // user_desc
|
||||
MOVL $16, 12(SP) // sizeof(user_desc)
|
||||
CALL syscall(SB)
|
||||
MOVL $1, BX // func = 1 (write)
|
||||
MOVL AX, CX // user_desc
|
||||
MOVL $16, DX // sizeof(user_desc)
|
||||
MOVL $123, AX // syscall - modify_ldt
|
||||
INT $0x80
|
||||
|
||||
// breakpoint on error
|
||||
CMPL AX, $0xfffff001
|
||||
JLS 2(PC)
|
||||
INT $3
|
||||
RET
|
||||
|
||||
|
@ -13,8 +13,8 @@ EOF
|
||||
|
||||
case "$GOARCH" in
|
||||
386)
|
||||
echo '#define g 0(FS)'
|
||||
echo '#define m 4(FS)'
|
||||
echo '#define g 0(GS)'
|
||||
echo '#define m 4(GS)'
|
||||
;;
|
||||
amd64)
|
||||
echo '#define g R15'
|
||||
|
Loading…
Reference in New Issue
Block a user