int a, f, curframe, curbecome, maxbecome;
Prog *pmorestack;
Sym *symmorestack;
+ static int fsreg;
pmorestack = P;
symmorestack = lookup("sys·morestack", 0);
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;
#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
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
// <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.
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