mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 04:30:52 +07:00
1802d0beec
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license version 2 as published by the free software foundation this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 655 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Reviewed-by: Richard Fontana <rfontana@redhat.com> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190527070034.575739538@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
94 lines
2.4 KiB
C
94 lines
2.4 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* arch/arm/probes/kprobes/checkers-common.c
|
|
*
|
|
* Copyright (C) 2014 Huawei Inc.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include "../decode.h"
|
|
#include "../decode-arm.h"
|
|
#include "checkers.h"
|
|
|
|
enum probes_insn checker_stack_use_none(probes_opcode_t insn,
|
|
struct arch_probes_insn *asi,
|
|
const struct decode_header *h)
|
|
{
|
|
asi->stack_space = 0;
|
|
return INSN_GOOD_NO_SLOT;
|
|
}
|
|
|
|
enum probes_insn checker_stack_use_unknown(probes_opcode_t insn,
|
|
struct arch_probes_insn *asi,
|
|
const struct decode_header *h)
|
|
{
|
|
asi->stack_space = -1;
|
|
return INSN_GOOD_NO_SLOT;
|
|
}
|
|
|
|
#ifdef CONFIG_THUMB2_KERNEL
|
|
enum probes_insn checker_stack_use_imm_0xx(probes_opcode_t insn,
|
|
struct arch_probes_insn *asi,
|
|
const struct decode_header *h)
|
|
{
|
|
int imm = insn & 0xff;
|
|
asi->stack_space = imm;
|
|
return INSN_GOOD_NO_SLOT;
|
|
}
|
|
|
|
/*
|
|
* Different from other insn uses imm8, the real addressing offset of
|
|
* STRD in T32 encoding should be imm8 * 4. See ARMARM description.
|
|
*/
|
|
enum probes_insn checker_stack_use_t32strd(probes_opcode_t insn,
|
|
struct arch_probes_insn *asi,
|
|
const struct decode_header *h)
|
|
{
|
|
int imm = insn & 0xff;
|
|
asi->stack_space = imm << 2;
|
|
return INSN_GOOD_NO_SLOT;
|
|
}
|
|
#else
|
|
enum probes_insn checker_stack_use_imm_x0x(probes_opcode_t insn,
|
|
struct arch_probes_insn *asi,
|
|
const struct decode_header *h)
|
|
{
|
|
int imm = ((insn & 0xf00) >> 4) + (insn & 0xf);
|
|
asi->stack_space = imm;
|
|
return INSN_GOOD_NO_SLOT;
|
|
}
|
|
#endif
|
|
|
|
enum probes_insn checker_stack_use_imm_xxx(probes_opcode_t insn,
|
|
struct arch_probes_insn *asi,
|
|
const struct decode_header *h)
|
|
{
|
|
int imm = insn & 0xfff;
|
|
asi->stack_space = imm;
|
|
return INSN_GOOD_NO_SLOT;
|
|
}
|
|
|
|
enum probes_insn checker_stack_use_stmdx(probes_opcode_t insn,
|
|
struct arch_probes_insn *asi,
|
|
const struct decode_header *h)
|
|
{
|
|
unsigned int reglist = insn & 0xffff;
|
|
int pbit = insn & (1 << 24);
|
|
asi->stack_space = (hweight32(reglist) - (!pbit ? 1 : 0)) * 4;
|
|
|
|
return INSN_GOOD_NO_SLOT;
|
|
}
|
|
|
|
const union decode_action stack_check_actions[] = {
|
|
[STACK_USE_NONE] = {.decoder = checker_stack_use_none},
|
|
[STACK_USE_UNKNOWN] = {.decoder = checker_stack_use_unknown},
|
|
#ifdef CONFIG_THUMB2_KERNEL
|
|
[STACK_USE_FIXED_0XX] = {.decoder = checker_stack_use_imm_0xx},
|
|
[STACK_USE_T32STRD] = {.decoder = checker_stack_use_t32strd},
|
|
#else
|
|
[STACK_USE_FIXED_X0X] = {.decoder = checker_stack_use_imm_x0x},
|
|
#endif
|
|
[STACK_USE_FIXED_XXX] = {.decoder = checker_stack_use_imm_xxx},
|
|
[STACK_USE_STMDX] = {.decoder = checker_stack_use_stmdx},
|
|
};
|