Используйте Ftrace для перехвата функций ядра в Arm64, но вызывайте бесконечный циклLinux

Ответить Пред. темаСлед. тема
Anonymous
 Используйте Ftrace для перехвата функций ядра в Arm64, но вызывайте бесконечный цикл

Сообщение Anonymous »

Я пытаюсь подключить некоторые функции ядра, такие как kmem_cache_alloc в Arm64 linux5.7 (эта версия имеет CONFIG_DYNAMIC_FTRACE_WITH_REGS в Arm64). Но я всегда вхожу в бесконечный цикл при вызове функции.
Поэтому я упрощаю код и пишу демо-версию для перехвата _do_fork ниже, на x86-64 код в порядке, и та часть, которая должен прекратить цикл, работает нормально. Небольшая деталь: ftrace_set_filter_ip не работает в Arm64, но ftrace_set_filter работает хорошо.

Код: Выделить всё

asmlinkage long (*original_do_fork)(unsigned long clone_flags,...);

asmlinkage long hooked_do_fork(unsigned long clone_flags, unsigned long stack_start,
unsigned long stack_size, int __user *parent_tidptr,
int __user *child_tidptr, unsigned long tls) {
printk("hooked_do_fork called!\n");
return original_do_fork(clone_flags, stack_start, stack_size, parent_tidptr, child_tidptr, tls);
}

// fh_ftrace_thunk
static void notrace fh_ftrace_thunk(unsigned long ip, unsigned long parent_ip,
struct ftrace_ops *ops, struct pt_regs *regs) {
printk("fh_ftrace_thunk called!\n");
struct ftrace_hook *hook = container_of(ops, struct ftrace_hook, ops);

//this should stop infinite loop but not working
if (!within_module(parent_ip, THIS_MODULE)) regs->pc = (unsigned long)hook->function;
}

static int __init fh_init(void) {
hook.address = kallsyms_lookup_name(hook.name);
*((unsigned long*)&original_do_fork) = hook.address+ MCOUNT_INSN_SIZE;
hook.ops.func = fh_ftrace_thunk;
hook.ops.flags =  FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED | FTRACE_OPS_FL_RECURSION_SAFE | FTRACE_OPS_FL_IPMODIFY;

err = ftrace_set_filter(&hook.ops, hook.name, strlen(hook.name), 0);

err = register_ftrace_function(&hook.ops);
return 0;
}
Результаты ниже:

Код: Выделить всё

[   26.788937] fh_ftrace_thunk called!
[   26.789224] fh_ftrace_thunk called!
[   26.789544] fh_ftrace_thunk called!
[   26.789788] fh_ftrace_thunk called!
[   26.790090] fh_ftrace_thunk called!
[   26.790314] fh_ftrace_thunk called!
[   26.790600] fh_ftrace_thunk called!
[   26.790866] fh_ftrace_thunk called!
[   26.791429] fh_ftrace_thunk called!
[   26.791661] fh_ftrace_thunk called!
[   26.800664] fh_ftrace_thunk called!
[   26.801035] fh_ftrace_thunk called!
[   26.801426] fh_ftrace_thunk called!
Что вызывает этот бесконечный цикл? Есть ли какие-либо детали Arm64, которые мне не хватает?

Подробнее здесь: https://stackoverflow.com/questions/783 ... inite-loop
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»