Commit bbcb91a3 authored by Russ Cox's avatar Russ Cox

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
parent a95ee61a
...@@ -450,7 +450,7 @@ naddr(Node *n, Adr *a) ...@@ -450,7 +450,7 @@ naddr(Node *n, Adr *a)
break; break;
case OEXREG: case OEXREG:
a->type = D_INDIR + D_FS; a->type = D_INDIR + D_GS;
a->offset = n->reg - 1; a->offset = n->reg - 1;
break; break;
......
...@@ -464,6 +464,7 @@ dostkoff(void) ...@@ -464,6 +464,7 @@ dostkoff(void)
int a, f, curframe, curbecome, maxbecome; int a, f, curframe, curbecome, maxbecome;
Prog *pmorestack; Prog *pmorestack;
Sym *symmorestack; Sym *symmorestack;
static int fsreg;
pmorestack = P; pmorestack = P;
symmorestack = lookup("sys·morestack", 0); symmorestack = lookup("sys·morestack", 0);
...@@ -565,7 +566,7 @@ dostkoff(void) ...@@ -565,7 +566,7 @@ dostkoff(void)
if(!(p->from.scale & NOSPLIT)) { if(!(p->from.scale & NOSPLIT)) {
p = appendp(p); // load g into CX p = appendp(p); // load g into CX
p->as = AMOVL; p->as = AMOVL;
p->from.type = D_INDIR+D_FS; p->from.type = D_INDIR+D_GS;
p->from.offset = 0; p->from.offset = 0;
p->to.type = D_CX; p->to.type = D_CX;
......
...@@ -15,12 +15,12 @@ TEXT _rt0_386(SB),7,$0 ...@@ -15,12 +15,12 @@ TEXT _rt0_386(SB),7,$0
CALL ldt0setup(SB) 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 MOVL $(7*8+7), AX
MOVW AX, FS MOVW AX, GS
// store through it, to make sure it works // store through it, to make sure it works
MOVL $0x123, 0(FS) MOVL $0x123, 0(GS)
MOVL tls0(SB), AX MOVL tls0(SB), AX
CMPL AX, $0x123 CMPL AX, $0x123
JEQ ok JEQ ok
......
...@@ -139,7 +139,7 @@ TEXT bsdthread_start(SB),7,$0 ...@@ -139,7 +139,7 @@ TEXT bsdthread_start(SB),7,$0
POPAL POPAL
SHLL $3, DI // segment# is ldt*8 + 7. SHLL $3, DI // segment# is ldt*8 + 7.
ADDL $7, DI ADDL $7, DI
MOVW DI, FS MOVW DI, GS
// Now segment is established. Initialize m, g. // Now segment is established. Initialize m, g.
MOVL AX, g MOVL AX, g
......
...@@ -8,20 +8,6 @@ ...@@ -8,20 +8,6 @@
#include "386/asm.h" #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 TEXT exit(SB),7,$0
MOVL $252, AX // syscall number MOVL $252, AX // syscall number
MOVL 4(SP), BX MOVL 4(SP), BX
...@@ -159,7 +145,7 @@ TEXT clone(SB),7,$0 ...@@ -159,7 +145,7 @@ TEXT clone(SB),7,$0
POPAL POPAL
SHLL $3, DI // segment# is ldt*8 + 7 (different 7 than above) SHLL $3, DI // segment# is ldt*8 + 7 (different 7 than above)
ADDL $7, DI ADDL $7, DI
MOVW DI, FS MOVW DI, GS
// Now segment is established. Initialize m, g. // Now segment is established. Initialize m, g.
MOVL DX, g MOVL DX, g
...@@ -190,15 +176,15 @@ TEXT sigaltstack(SB),7,$-8 ...@@ -190,15 +176,15 @@ TEXT sigaltstack(SB),7,$-8
// <asm-i386/ldt.h> // <asm-i386/ldt.h>
// struct user_desc { // struct user_desc {
// unsigned int entry_number; // unsigned int entry_number;
// unsigned long base_addr; // unsigned long base_addr;
// unsigned int limit; // unsigned int limit;
// unsigned int seg_32bit:1; // unsigned int seg_32bit:1;
// unsigned int contents:2; // unsigned int contents:2;
// unsigned int read_exec_only:1; // unsigned int read_exec_only:1;
// unsigned int limit_in_pages:1; // unsigned int limit_in_pages:1;
// unsigned int seg_not_present:1; // unsigned int seg_not_present:1;
// unsigned int useable:1; // unsigned int useable:1;
// }; // };
#define SEG_32BIT 0x01 #define SEG_32BIT 0x01
// contents are the 2 bits 0x02 and 0x04. // contents are the 2 bits 0x02 and 0x04.
...@@ -223,10 +209,15 @@ TEXT setldt(SB),7,$32 ...@@ -223,10 +209,15 @@ TEXT setldt(SB),7,$32
MOVL $(SEG_32BIT|USEABLE|CONTENTS_DATA), 12(AX) // flag bits MOVL $(SEG_32BIT|USEABLE|CONTENTS_DATA), 12(AX) // flag bits
// call modify_ldt // call modify_ldt
MOVL $123, 0(SP) // syscall - modify_ldt MOVL $1, BX // func = 1 (write)
MOVL $1, 4(SP) // func = 1 (write) MOVL AX, CX // user_desc
MOVL AX, 8(SP) // user_desc MOVL $16, DX // sizeof(user_desc)
MOVL $16, 12(SP) // sizeof(user_desc) MOVL $123, AX // syscall - modify_ldt
CALL syscall(SB) INT $0x80
// breakpoint on error
CMPL AX, $0xfffff001
JLS 2(PC)
INT $3
RET RET
...@@ -13,8 +13,8 @@ EOF ...@@ -13,8 +13,8 @@ EOF
case "$GOARCH" in case "$GOARCH" in
386) 386)
echo '#define g 0(FS)' echo '#define g 0(GS)'
echo '#define m 4(FS)' echo '#define m 4(GS)'
;; ;;
amd64) amd64)
echo '#define g R15' echo '#define g R15'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment