On 10/07, Roland McGrath wrote:
>
> Make it something like:
>
>       static inline void set_stop_code(struct ptrace_context *ctx, int event)
>       {
>               ctx->stop_code = (event << 8) | SIGTRAP |
>                       (event >= PTRACE_EVENT_SYSCALL_ENTRY &&
>                        (ctx->options & PTRACE_O_TRACESYSGOOD) ? 0x80 : 0);
>       }
>
> and pick PTRACE_EVENT_* numbers so SYSCALL_{ENTRY,EXIT} are highest,
> or something along those lines.

Oh, I don't like this. This is unreadable, and ">= PTRACE_EVENT_" complicates
the reading even more.

How about

        void set_stop_code(struct ptrace_context *ctx, int event)
        {
                ctx->stop_code = (event << 8) | SIGTRAP;
        }

        void set_syscall_code(struct ptrace_context *ctx, int event)
        {
                set_stop_code(ctx, event);
                if (PTRACE_O_TRACESYSGOOD)
                        ctx->stop_code |= 0x80;
        }

Or,
        void __set_stop_code(struct ptrace_context *ctx, int event, int sig)
        {
                ctx->stop_code = (event << 8) | sig;
        }

        void set_syscall_code(struct ptrace_context *ctx, int event)
        {
                int sig = PTRACE_O_TRACESYSGOOD ? (0x80 | SIGTRAP) : SIGTRAP;

                __set_stop_code(event, sig);
        }

        void set_stop_code(struct ptrace_context *ctx, int event)
        {
                __set_stop_code(event, SIGTRAP);
        }

This way ptrace_report_signal() can use __set_stop_code() too.

But this is minor, if your prefer your version I'll send the patch.

Oleg.

Reply via email to