[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