Я пишу драйвер Linux в архитектуре MIPS.
там я реализую операцию чтения - читаю содержимое некоторых регистров.
Вот код:
static int proc_seq_show(struct seq_file *seq, void *v)
{
volatile unsigned reg;
//here read registers and pass to user using seq_printf
//1. read reg number 1
//2. read reg number 2
}
int proc_open(struct inode *inode, struct file *filp)
{
return single_open(filp,&proc_seq_show, NULL);
}
static struct file_operation proc_ops = {.read = &seq_read, .open=&seq_open};
Моя проблема в том, что чтениерегистрировать содержимое иногда вызывает ошибку ядра - ошибка шины, и операция чтения запрещена.Я не могу избежать этого заранее.
Так как это поведение приемлемо, я хотел бы проигнорировать эту ошибку и продолжить читать другие регистры.
Я видел обработчик ошибок шины в ядре (do_be в traps.c), есть возможность добавить мою собственную запись в таблицу __dbe_table.Запись выглядит так:
struct exception_table_entry {unsigned long insn, nextinsn; };
insn - это инструкция, которая вызывает ошибку. nextinsn - следующая инструкция, выполняемая после исключения.
В драйвере я объявляю запись:
struct exception_table_entry e __attribute__ ((section("__dbe_table"))) = {0,0};
, но я не знаю, какинициализировать это.Как я могу получить адрес инструкции рискованной строки в C?как я могу получить адрес линии исправления?Я пробовал что-то с метками и адресами меток - но мне не удалось правильно установить имя_презента__ исключения_
Та же инфраструктура доступна в x86, кто-то знает, как они ее используют?
Любая помощь будет оценена.