bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 5/5] x86_64: remove unneeded segment selectors handling on full 6


From: Luca Dariz
Subject: [PATCH 5/5] x86_64: remove unneeded segment selectors handling on full 64 bit
Date: Sat, 29 Jul 2023 19:47:53 +0200

* 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]