bug-hurd
[Top][All Lists]
Advanced

[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




reply via email to

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