[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.