[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH gnumach] Add x86_64 registers to i386_thread_state
From: |
Flavio Cruz |
Subject: |
[PATCH gnumach] Add x86_64 registers to i386_thread_state |
Date: |
Sun, 12 Feb 2023 13:26:29 -0500 |
This is required to implement ptrace.
---
i386/i386/pcb.c | 42 +++++++++++++++++++++++++-
i386/include/mach/i386/thread_status.h | 28 +++++++++++++++++
2 files changed, 69 insertions(+), 1 deletion(-)
diff --git a/i386/i386/pcb.c b/i386/i386/pcb.c
index 9ac55a1c..ba856523 100644
--- a/i386/i386/pcb.c
+++ b/i386/i386/pcb.c
@@ -500,6 +500,25 @@ kern_return_t thread_setstatus(
/*
* General registers
*/
+#if defined(__x86_64__) && !defined(USER32)
+ saved_state->r8 = state->r8;
+ saved_state->r9 = state->r9;
+ saved_state->r10 = state->r10;
+ saved_state->r11 = state->r11;
+ saved_state->r12 = state->r12;
+ saved_state->r13 = state->r13;
+ saved_state->r14 = state->r14;
+ saved_state->r15 = state->r15;
+ saved_state->edi = state->rdi;
+ saved_state->esi = state->rsi;
+ saved_state->ebp = state->rbp;
+ saved_state->uesp = state->ursp;
+ saved_state->ebx = state->rbx;
+ saved_state->edx = state->rdx;
+ saved_state->ecx = state->rcx;
+ saved_state->eax = state->rax;
+ saved_state->eip = state->rip;
+#else
saved_state->edi = state->edi;
saved_state->esi = state->esi;
saved_state->ebp = state->ebp;
@@ -509,6 +528,7 @@ kern_return_t thread_setstatus(
saved_state->ecx = state->ecx;
saved_state->eax = state->eax;
saved_state->eip = state->eip;
+#endif /* __x86_64__ && !USER32 */
saved_state->efl = (state->efl & ~EFL_USER_CLEAR)
| EFL_USER_SET;
@@ -696,6 +716,25 @@ kern_return_t thread_getstatus(
/*
* General registers.
*/
+#if defined(__x86_64__) && !defined(USER32)
+ state->r8 = saved_state->r8;
+ state->r9 = saved_state->r9;
+ state->r10 = saved_state->r10;
+ state->r11 = saved_state->r11;
+ state->r12 = saved_state->r12;
+ state->r13 = saved_state->r13;
+ state->r14 = saved_state->r14;
+ state->r15 = saved_state->r15;
+ state->rdi = saved_state->edi;
+ state->rsi = saved_state->esi;
+ state->rbp = saved_state->ebp;
+ state->rbx = saved_state->ebx;
+ state->rdx = saved_state->edx;
+ state->rcx = saved_state->ecx;
+ state->rax = saved_state->eax;
+ state->rip = saved_state->eip;
+ state->ursp = saved_state->uesp;
+#else
state->edi = saved_state->edi;
state->esi = saved_state->esi;
state->ebp = saved_state->ebp;
@@ -704,8 +743,9 @@ kern_return_t thread_getstatus(
state->ecx = saved_state->ecx;
state->eax = saved_state->eax;
state->eip = saved_state->eip;
- state->efl = saved_state->efl;
state->uesp = saved_state->uesp;
+#endif /* __x86_64__ && !USER32 */
+ state->efl = saved_state->efl;
state->cs = saved_state->cs;
state->ss = saved_state->ss;
diff --git a/i386/include/mach/i386/thread_status.h
b/i386/include/mach/i386/thread_status.h
index ba1e3dea..2d05947e 100644
--- a/i386/include/mach/i386/thread_status.h
+++ b/i386/include/mach/i386/thread_status.h
@@ -67,6 +67,26 @@ struct i386_thread_state {
unsigned int fs;
unsigned int es;
unsigned int ds;
+
+#if defined(__x86_64__) && !defined(USER32)
+ uint64_t r8;
+ uint64_t r9;
+ uint64_t r10;
+ uint64_t r11;
+ uint64_t r12;
+ uint64_t r13;
+ uint64_t r14;
+ uint64_t r15;
+ uint64_t rdi;
+ uint64_t rsi;
+ uint64_t rbp;
+ uint64_t rsp;
+ uint64_t rbx;
+ uint64_t rdx;
+ uint64_t rcx;
+ uint64_t rax;
+ uint64_t rip;
+#else
unsigned int edi;
unsigned int esi;
unsigned int ebp;
@@ -76,9 +96,17 @@ struct i386_thread_state {
unsigned int ecx;
unsigned int eax;
unsigned int eip;
+#endif /* __x86_64__ && !USER32 */
+
unsigned int cs;
+#if defined(__x86_64__) && !defined(USER32)
+ uint64_t efl;
+ uint64_t ursp;
+#else
unsigned int efl;
unsigned int uesp;
+#endif /* __x86_64__ and !USER32 */
+
unsigned int ss;
};
#define i386_THREAD_STATE_COUNT (sizeof (struct
i386_thread_state)/sizeof(unsigned int))
--
2.39.1
- [PATCH gnumach] Add x86_64 registers to i386_thread_state,
Flavio Cruz <=