Как расширить обработчики ошибок шины MIPS? - PullRequest
0 голосов
/ 26 августа 2018

Я пишу драйвер 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, кто-то знает, как они ее используют?

Любая помощь будет оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...