cregit-Linux how code gets into the kernel

Release 4.14 arch/x86/kernel/kprobes/common.h

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __X86_KERNEL_KPROBES_COMMON_H

#define __X86_KERNEL_KPROBES_COMMON_H

/* Kprobes and Optprobes common header */

#include <asm/asm.h>

#ifdef CONFIG_FRAME_POINTER

# define SAVE_RBP_STRING "       push %" _ASM_BP "\n" \
                         "      mov  %" _ASM_SP ", %" _ASM_BP "\n"
#else

# define SAVE_RBP_STRING "       push %" _ASM_BP "\n"
#endif

#ifdef CONFIG_X86_64

#define SAVE_REGS_STRING			\
	/* Skip cs, ip, orig_ax. */		\
	"       subq $24, %rsp\n"               \
        "       pushq %rdi\n"                   \
        "       pushq %rsi\n"                   \
        "       pushq %rdx\n"                   \
        "       pushq %rcx\n"                   \
        "       pushq %rax\n"                   \
        "       pushq %r8\n"                    \
        "       pushq %r9\n"                    \
        "       pushq %r10\n"                   \
        "       pushq %r11\n"                   \
        "       pushq %rbx\n"                   \
        SAVE_RBP_STRING                         \
        "       pushq %r12\n"                   \
        "       pushq %r13\n"                   \
        "       pushq %r14\n"                   \
        "       pushq %r15\n"

#define RESTORE_REGS_STRING			\
	"       popq %r15\n"                    \
        "       popq %r14\n"                    \
        "       popq %r13\n"                    \
        "       popq %r12\n"                    \
        "       popq %rbp\n"                    \
        "       popq %rbx\n"                    \
        "       popq %r11\n"                    \
        "       popq %r10\n"                    \
        "       popq %r9\n"                     \
        "       popq %r8\n"                     \
        "       popq %rax\n"                    \
        "       popq %rcx\n"                    \
        "       popq %rdx\n"                    \
        "       popq %rsi\n"                    \
        "       popq %rdi\n"                    \
	/* Skip orig_ax, ip, cs */		\
        "       addq $24, %rsp\n"
#else

#define SAVE_REGS_STRING			\
	/* Skip cs, ip, orig_ax and gs. */	\
	"       subl $16, %esp\n"               \
        "       pushl %fs\n"                    \
        "       pushl %es\n"                    \
        "       pushl %ds\n"                    \
        "       pushl %eax\n"                   \
        SAVE_RBP_STRING                         \
        "       pushl %edi\n"                   \
        "       pushl %esi\n"                   \
        "       pushl %edx\n"                   \
        "       pushl %ecx\n"                   \
        "       pushl %ebx\n"

#define RESTORE_REGS_STRING			\
	"       popl %ebx\n"                    \
        "       popl %ecx\n"                    \
        "       popl %edx\n"                    \
        "       popl %esi\n"                    \
        "       popl %edi\n"                    \
        "       popl %ebp\n"                    \
        "       popl %eax\n"                    \
	/* Skip ds, es, fs, gs, orig_ax, and ip. Note: don't pop cs here*/\
        "       addl $24, %esp\n"
#endif

/* Ensure if the instruction can be boostable */
extern int can_boost(struct insn *insn, void *orig_addr);
/* Recover instruction if given address is probed */
extern unsigned long recover_probed_instruction(kprobe_opcode_t *buf,
					 unsigned long addr);
/*
 * Copy an instruction and adjust the displacement if the instruction
 * uses the %rip-relative addressing mode.
 */
extern int __copy_instruction(u8 *dest, u8 *src, struct insn *insn);

/* Generate a relative-jump/call instruction */
extern void synthesize_reljump(void *from, void *to);
extern void synthesize_relcall(void *from, void *to);

#ifdef	CONFIG_OPTPROBES
extern int setup_detour_execution(struct kprobe *p, struct pt_regs *regs, int reenter);
extern unsigned long __recover_optprobed_insn(kprobe_opcode_t *buf, unsigned long addr);
#else	/* !CONFIG_OPTPROBES */

static inline int setup_detour_execution(struct kprobe *p, struct pt_regs *regs, int reenter) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Masami Hiramatsu23100.00%1100.00%
Total23100.00%1100.00%


static inline unsigned long __recover_optprobed_insn(kprobe_opcode_t *buf, unsigned long addr) { return addr; }

Contributors

PersonTokensPropCommitsCommitProp
Masami Hiramatsu19100.00%1100.00%
Total19100.00%1100.00%

#endif #ifdef CONFIG_KPROBES_ON_FTRACE extern int skip_singlestep(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *kcb); #else
static inline int skip_singlestep(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *kcb) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Masami Hiramatsu25100.00%1100.00%
Total25100.00%1100.00%

#endif #endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Masami Hiramatsu25292.31%466.67%
Josh Poimboeuf207.33%116.67%
Greg Kroah-Hartman10.37%116.67%
Total273100.00%6100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.