diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-07-20 02:59:45 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-07-20 02:59:45 +0200 |
commit | c78c6e349ae55d4964142780f957a9a3488b0789 (patch) | |
tree | 27be522a5396bffcc0dfd33dd78e217039738dac /sys/src | |
parent | 20b7a19c58c79568424bf40b826b681af86e6ed5 (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.s | 28 | ||||
-rw-r--r-- | sys/src/9/pc64/trap.c | 41 |
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; } |