bug-hurd
[Top][All Lists]
Advanced

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

Re: [PATCH gnumach] Add x86_64 registers to i386_thread_state


From: Samuel Thibault
Subject: Re: [PATCH gnumach] Add x86_64 registers to i386_thread_state
Date: Sun, 12 Feb 2023 19:56:21 +0100
User-agent: NeoMutt/20170609 (1.8.3)

Applied, thanks!

Flavio Cruz, le dim. 12 févr. 2023 13:26:29 -0500, a ecrit:
> 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
> 
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.



reply via email to

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