summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-07-20 02:59:45 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2014-07-20 02:59:45 +0200
commitc78c6e349ae55d4964142780f957a9a3488b0789 (patch)
tree27be522a5396bffcc0dfd33dd78e217039738dac /sys/src
parent20b7a19c58c79568424bf40b826b681af86e6ed5 (diff)
pc64: dont save/restore DS/ES/FS/GS segment registers on syscall or interrupt, they are ignored in long mode.
we do not support 32 bit processes and DS, ES, FS and GS segment registers are ignored in long mode, so theres no point in saving and restoring them.
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/9/pc64/l.s28
-rw-r--r--sys/src/9/pc64/trap.c41
2 files changed, 18 insertions, 51 deletions
diff --git a/sys/src/9/pc64/l.s b/sys/src/9/pc64/l.s
index fe3de017b..996204897 100644
--- a/sys/src/9/pc64/l.s
+++ b/sys/src/9/pc64/l.s
@@ -687,14 +687,6 @@ TEXT touser(SB), 1, $-4
CLI
SWAPGS
- MOVW $UDSEL, AX
- MOVW AX, DS
- MOVW AX, ES
-
- MOVW $NULLSEL, AX
- MOVW AX, FS
- MOVW AX, GS
-
MOVL $0, RMACH
MOVL $0, RUSER
@@ -719,14 +711,8 @@ TEXT syscallentry(SB), 1, $-4
PUSHQ R11 /* old flags */
PUSHQ $UESEL /* old code segment */
PUSHQ CX /* old ip */
-
SUBQ $(16+16*8), SP /* unsaved registers */
- MOVW $UDSEL, (15*8+0)(SP)
- MOVW ES, (15*8+2)(SP)
- MOVW FS, (15*8+4)(SP)
- MOVW GS, (15*8+6)(SP)
-
MOVQ RMACH, (14*8)(SP)
MOVQ RUSER, (13*8)(SP)
@@ -746,11 +732,6 @@ TEXT forkret(SB), 1, $-4
CLI
SWAPGS
- MOVW 22(SP), GS
- MOVW 20(SP), FS
- MOVW 18(SP), ES
- MOVW 16(SP), DS
-
MOVQ 8(SP), RMACH
MOVQ 0(SP), RUSER
@@ -785,10 +766,6 @@ _intrcommon:
MOVQ RUSER, 0(SP)
MOVQ RMACH, 8(SP)
- MOVW DS, 16(SP)
- MOVW ES, 18(SP)
- MOVW FS, 20(SP)
- MOVW GS, 22(SP)
SWAPGS
BYTE $0x65; MOVQ 0, RMACH /* m-> (MOVQ GS:0x0, R15) */
@@ -834,10 +811,7 @@ _intrestore:
JEQ _iretnested
SWAPGS
- MOVW 22(SP), GS
- MOVW 20(SP), FS
- MOVW 18(SP), ES
- MOVW 16(SP), DS
+
MOVQ 8(SP), RMACH
MOVQ 0(SP), RUSER
diff --git a/sys/src/9/pc64/trap.c b/sys/src/9/pc64/trap.c
index 6f6f95f96..a88f41b93 100644
--- a/sys/src/9/pc64/trap.c
+++ b/sys/src/9/pc64/trap.c
@@ -476,21 +476,19 @@ dumpregs(Ureg* ureg)
else
iprint("cpu%d: registers for kernel\n", m->machno);
- iprint(" DS %.4uX AX %.16lluX BX %.16lluX CX %.16lluX\n",
- ureg->ds, ureg->ax, ureg->bx, ureg->cx);
- iprint(" ES %.4uX DX %.16lluX SI %.16lluX DI %.16lluX\n",
- ureg->es, ureg->dx, ureg->si, ureg->di);
- iprint(" FS %.4uX BP %.16lluX R8 %.16lluX R9 %.16lluX\n",
- ureg->fs, ureg->bp, ureg->r8, ureg->r9);
- iprint(" GS %.4uX R10 %.16lluX R11 %.16lluX R12 %.16lluX\n",
- ureg->gs, ureg->r10, ureg->r11, ureg->r12);
-
- iprint(" SS %.4lluX R13 %.16lluX R14 %.16lluX R15 %.16lluX\n",
- ureg->ss & 0xffff, ureg->r13, ureg->r14, ureg->r15);
- iprint(" CS %.4lluX PC %.16lluX SP %.16lluX\n",
- ureg->cs & 0xffff, ureg->pc, ureg->sp);
-
- iprint("TYPE %.2lluX ERROR %.4lluX FLAGS %.8lluX\n",
+ iprint(" AX %.16lluX BX %.16lluX CX %.16lluX\n",
+ ureg->ax, ureg->bx, ureg->cx);
+ iprint(" DX %.16lluX SI %.16lluX DI %.16lluX\n",
+ ureg->dx, ureg->si, ureg->di);
+ iprint(" BP %.16lluX R8 %.16lluX R9 %.16lluX\n",
+ ureg->bp, ureg->r8, ureg->r9);
+ iprint(" R10 %.16lluX R11 %.16lluX R12 %.16lluX\n",
+ ureg->r10, ureg->r11, ureg->r12);
+ iprint(" R13 %.16lluX R14 %.16lluX R15 %.16lluX\n",
+ ureg->r13, ureg->r14, ureg->r15);
+ iprint(" CS %.4lluX SS %.4lluX PC %.16lluX SP %.16lluX\n",
+ ureg->cs & 0xffff, ureg->ss & 0xffff, ureg->pc, ureg->sp);
+ iprint("TYPE %.2lluX ERROR %.4lluX FLAGS %.8lluX\n",
ureg->type & 0xff, ureg->error & 0xffff, ureg->flags & 0xffffffff);
/*
@@ -507,7 +505,7 @@ dumpregs(Ureg* ureg)
if(ureg->type == 18)
dumpmcregs();
}
- iprint("\n ur %#p up %#p\n", ureg, up);
+ iprint(" ur %#p up %#p\n", ureg, up);
}
@@ -854,7 +852,7 @@ if(0) print("%s %lud: notify %#p %#p %#p %s\n",
ureg->pc = (uintptr)up->notify;
ureg->bp = (uintptr)up->ureg; /* arg1 passed in RARG */
ureg->cs = UESEL;
- ureg->ss = ureg->ds = ureg->es = UDSEL;
+ ureg->ss = UDSEL;
up->notified = 1;
up->nnote--;
memmove(&up->lastnote, &up->note[0], sizeof(Note));
@@ -952,8 +950,7 @@ execregs(uintptr entry, ulong ssize, ulong nargs)
ureg->sp = (uintptr)sp;
ureg->pc = entry;
ureg->cs = UESEL;
- ureg->ss = ureg->ds = ureg->es = UDSEL;
- ureg->fs = ureg->gs = NULLSEL;
+ ureg->ss = UDSEL;
ureg->r14 = ureg->r15 = 0; /* extern user registers */
return (uintptr)USTKTOP-sizeof(Tos); /* address of kernel/user shared data */
}
@@ -981,11 +978,7 @@ setregisters(Ureg* ureg, char* pureg, char* uva, int n)
flags = ureg->flags;
memmove(pureg, uva, n);
ureg->cs = UESEL;
- ureg->ss = ureg->ds = ureg->es = UDSEL;
- if(ureg->fs != UDSEL)
- ureg->fs = NULLSEL;
- if(ureg->gs != UDSEL)
- ureg->gs = NULLSEL;
+ ureg->ss = UDSEL;
ureg->flags = (ureg->flags & 0x00ff) | (flags & 0xff00);
ureg->pc &= UADDRMASK;
}