* i386/i386/db_interface.c: don't set unused segment selectors on full 64-bit * i386/i386/db_trace.c: likewise. * i386/i386/i386asm.sym: likewise. * i386/i386/pcb.c:: likewise. * i386/i386/thread.h: remove ES/DS/FS/GS from thread state on !USER32, as they are unused in this configuration. Only SS and CS are kept. * x86_64/locore.S: convert segment handling macros to no-op on full 64-bit --- i386/i386/db_interface.c | 10 +++++++--- i386/i386/db_trace.c | 2 ++ i386/i386/i386asm.sym | 2 ++ i386/i386/pcb.c | 12 ++++++++---- i386/i386/thread.h | 4 ++++ x86_64/locore.S | 16 +++++----------- 6 files changed, 28 insertions(+), 18 deletions(-)
diff --git a/i386/i386/db_interface.c b/i386/i386/db_interface.c index 5a4ace9f..8f0ab4ec 100644 --- a/i386/i386/db_interface.c +++ b/i386/i386/db_interface.c @@ -332,12 +332,13 @@ kdb_trap( regs->ebp = ddb_regs.ebp; regs->esi = ddb_regs.esi; regs->edi = ddb_regs.edi; - regs->es = ddb_regs.es & 0xffff; regs->cs = ddb_regs.cs & 0xffff; +#if !defined(__x86_64__) || defined(USER32) + regs->es = ddb_regs.es & 0xffff; regs->ds = ddb_regs.ds & 0xffff; regs->fs = ddb_regs.fs & 0xffff; regs->gs = ddb_regs.gs & 0xffff; - +#endif if ((type == T_INT3) && (db_get_task_value(regs->eip, BKPT_SIZE, FALSE, TASK_NULL) == BKPT_INST)) @@ -401,11 +402,12 @@ kdb_kentry( ddb_regs.esi = is->rsi; ddb_regs.edi = is->rdi; #endif +#if !defined(__x86_64__) || defined(USER32) ddb_regs.ds = is->ds; ddb_regs.es = is->es; ddb_regs.fs = is->fs; ddb_regs.gs = is->gs; - +#endif cnpollc(TRUE); db_task_trap(-1, 0, (ddb_regs.cs & 0x3) != 0); cnpollc(FALSE); @@ -430,10 +432,12 @@ kdb_kentry( is->rsi = ddb_regs.esi; is->rdi = ddb_regs.edi; #endif +#if !defined(__x86_64__) || defined(USER32) is->ds = ddb_regs.ds & 0xffff; is->es = ddb_regs.es & 0xffff; is->fs = ddb_regs.fs & 0xffff; is->gs = ddb_regs.gs & 0xffff; +#endif } #if NCPUS > 1 db_leave(); diff --git a/i386/i386/db_trace.c b/i386/i386/db_trace.c index 8bd86fa5..b63e140f 100644 --- a/i386/i386/db_trace.c +++ b/i386/i386/db_trace.c @@ -54,10 +54,12 @@ */ struct db_variable db_regs[] = { { "cs", (long *)&ddb_regs.cs, db_i386_reg_value }, +#if !defined(__x86_64__) || defined(USER32) { "ds", (long *)&ddb_regs.ds, db_i386_reg_value }, { "es", (long *)&ddb_regs.es, db_i386_reg_value }, { "fs", (long *)&ddb_regs.fs, db_i386_reg_value }, { "gs", (long *)&ddb_regs.gs, db_i386_reg_value }, +#endif { "ss", (long *)&ddb_regs.ss, db_i386_reg_value }, { "eax",(long *)&ddb_regs.eax, db_i386_reg_value }, { "ecx",(long *)&ddb_regs.ecx, db_i386_reg_value }, diff --git a/i386/i386/i386asm.sym b/i386/i386/i386asm.sym index 1b9b40bb..8af0c5d6 100644 --- a/i386/i386/i386asm.sym +++ b/i386/i386/i386asm.sym @@ -84,8 +84,10 @@ size i386_kernel_state iks size i386_exception_link iel +#if !defined(__x86_64__) || defined(USER32) offset i386_saved_state r gs offset i386_saved_state r fs +#endif offset i386_saved_state r cs offset i386_saved_state r uesp offset i386_saved_state r eax diff --git a/i386/i386/pcb.c b/i386/i386/pcb.c index 1cf87eb1..e0f4f57a 100644 --- a/i386/i386/pcb.c +++ b/i386/i386/pcb.c @@ -417,10 +417,12 @@ void pcb_init(task_t parent_task, thread_t thread) */ pcb->iss.cs = USER_CS; pcb->iss.ss = USER_DS; +#if !defined(__x86_64__) || defined(USER32) pcb->iss.ds = USER_DS; pcb->iss.es = USER_DS; pcb->iss.fs = USER_DS; pcb->iss.gs = USER_DS; +#endif pcb->iss.efl = EFL_USER_SET; thread->pcb = pcb; @@ -578,10 +580,12 @@ kern_return_t thread_setstatus( */ saved_state->cs = USER_CS; saved_state->ss = USER_DS; +#if !defined(__x86_64__) || defined(USER32) saved_state->ds = USER_DS; saved_state->es = USER_DS; saved_state->fs = USER_DS; saved_state->gs = USER_DS; +#endif } else { /* @@ -592,10 +596,12 @@ kern_return_t thread_setstatus( */ saved_state->cs = state->cs; saved_state->ss = state->ss; +#if !defined(__x86_64__) || defined(USER32) saved_state->ds = state->ds; saved_state->es = state->es; saved_state->fs = state->fs; saved_state->gs = state->gs; +#endif } break; } @@ -803,10 +809,7 @@ kern_return_t thread_getstatus( == 0) saved_state->efl &= ~EFL_IF; } - } - else -#endif - { + } else { /* * 386 mode. */ @@ -815,6 +818,7 @@ kern_return_t thread_getstatus( state->fs = saved_state->fs & 0xffff; state->gs = saved_state->gs & 0xffff; } +#endif *count = i386_THREAD_STATE_COUNT; break; } diff --git a/i386/i386/thread.h b/i386/i386/thread.h index 86a44098..9c88d09a 100644 --- a/i386/i386/thread.h +++ b/i386/i386/thread.h @@ -51,10 +51,12 @@ */ struct i386_saved_state { +#if !defined(__x86_64__) || defined(USER32) unsigned long gs; unsigned long fs; unsigned long es; unsigned long ds; +#endif #ifdef __x86_64__ unsigned long r15; unsigned long r14; @@ -174,10 +176,12 @@ struct i386_segment_base_state { */ struct i386_interrupt_state { +#if !defined(__x86_64__) || defined(USER32) long gs; long fs; long es; long ds; +#endif #ifdef __x86_64__ long r11; long r10; diff --git a/x86_64/locore.S b/x86_64/locore.S index 66a9436a..271a9071 100644 --- a/x86_64/locore.S +++ b/x86_64/locore.S @@ -94,8 +94,7 @@ pushq %fs ;\ pushq %gs #else -#define PUSH_SEGMENTS(reg) \ - subq $32,%rsp +#define PUSH_SEGMENTS(reg) #endif #ifdef USER32 @@ -107,8 +106,7 @@ popq reg ;\ movq reg,%ds #else -#define POP_SEGMENTS(reg) \ - addq $32,%rsp +#define POP_SEGMENTS(reg) #endif #ifdef USER32 @@ -120,8 +118,7 @@ pushq %fs ;\ pushq %gs #else -#define PUSH_SEGMENTS_ISR(reg) \ - subq $32,%rsp +#define PUSH_SEGMENTS_ISR(reg) #endif #ifdef USER32 @@ -133,8 +130,7 @@ popq reg ;\ movq reg,%ds #else -#define POP_SEGMENTS_ISR(reg) \ - addq $32,%rsp +#define POP_SEGMENTS_ISR(reg) #endif #ifdef USER32 @@ -639,9 +635,7 @@ _return_to_user: */ _return_from_kernel: -#ifndef USER32 - addq $32,%rsp /* skip FS/GS selector */ -#else +#ifdef USER32 _kret_popl_gs: popq %gs /* restore segment registers */ _kret_popl_fs: -- 2.39.2