Лисья Нора

Оглавление


§ Работа с CSR

Эти инструкции необходимы для управления машинным статусом. Они нужны для организации прерываний, чтения и записи состояния процессора, и управления.
Код операции: 73h
-------+-31--------20-+-19---15-+-14---12-+-11--7-+-6------0-+-CSR--+
ECALL | 000000000000 | 00000 | 000 | 00000 | 111_0011 | 000h |
EBREAK | 000000000001 | 00000 | 000 | 00000 | 111_0011 | 001h |
MRET | 001100000010 | 00000 | 000 | 00000 | 111_0011 | 302h |
-------+--------------+---------+---------+-------+----------+------+
CSRRW | csr[11:0] | rs1 | 001 | rd | 111_0011 |
CSRRS | csr[11:0] | rs1 | 010 | rd | 111_0011 |
CSRRC | csr[11:0] | rs1 | 011 | rd | 111_0011 |
-------+--------------+---------+---------+-------+----------+
CSRRWI | csr[11:0] | uimm | 101 | rd | 111_0011 |
CSRRSI | csr[11:0] | uimm | 110 | rd | 111_0011 |
CSRRCI | csr[11:0] | uimm | 111 | rd | 111_0011 |
-------+--------------+---------+-funct3--+-------+----------+
Режимы работы процессора:
Описания инструкции:
Команды CSRRWI, CSRRSI, CSRRCI работают аналогично, но используют константу размером 00..1Fh.

§ Прерывания

При помощи CSR возможно установить вектора прерывания и способ их обработки.
# mstatus (Machine Status): Регистр управления машинным состоянием.
# mie (Machine Interrupt Enabled): Регистр, в котором находятся разрешения на прерывания
# mip (Machine Interrupt Pending): Ожидание машинного прерывания
# mepc (Machine Exception Program Counter): Адрес PC при машинном исключении
# mtvec (Machine Trap-Vector Base Address): Базовый адрес таблицы прерываний
# mcause (Machine Cause): Номер причины прерывания после вызова
Коды прерывания для внешних прерываний:
Для базовых:
# mtime (Machine Time): 64-битный счетчик, постоянно инкрементируется. Так как счетчик 64 бит, то его значения находятся в в 2-х CSR. Обычный адрес 0x2000000
# mtimecmp (Machine Time Compare): Регистр (64 бит) для сравнения счетчика, который выставляет флаг MTIP в mip и вызывает прерывание, если прерывания разрешены. Срабатывает когда mtime >= mtimecmp. Обычный адрес 0x2000008.
# mcycle (Machine Cycles): Количество тактов, которые сделаны процессором.

§ Список CSR

MSTATUS | 0x300 | Статус процессора
MIE | 0x304 | Разрешение прерываний
MTVEC | 0x305 | Базовый адрес таблицы прерывания
MSCRATCH | 0x340 | Временный регистр для хранения стека обработчика
MEPC | 0x341 | Адрес инструкции, где произошло прерывание
MCAUSE | 0x343 | Причина исключения
MTVAL | 0x343 | Дополнительно, к примеру адрес при ошибке доступа
MIP | 0x344 | Флаги ожидающих прерываний
Пояснения насчет mscratch – сюда при вызове прерывания сохраняется предыдущий стек пользователя, и выталкивается стек, с которым работает ядро или ОС.