О регистрах контроля и статуса

Для поддержания работы операционной системы, виртуализации, системы прерывания (но не ограничиваясь ими), в архитектуре RISC-V предусмотрено использование группы регистров, под общим названием регистры контроля и статуса (Control and Status Registers, CSR), обеспечивающих управление элементами процессора и доступ к статусной информации о системе. С помощью этих регистров реализуются привилегированные режимы работы процессора, хранение указателей на различные программные стеки, статус различных подсистем, регистры для обеспечения перехватов и многое другое.

Все регистры имеют уникальные 12-битные адреса, а их роли определены в спецификации на архитектуру RISC-V. В Таблице 1 приводится фрагмент спецификации привилегированной архитектуры[1, стр. 17], иллюстрирующая некоторые из регистров. В левом столбце указан 12-битный адрес. Далее указывается в каком режиме, что можно делать с этим регистром. После идёт название, а в правом столбике описание.

В этой таблице можно увидеть регистры для сохранения адреса возврата из перехвата, адрес вектора прерывания, регистры причины (cause), регистры настройки безопасности и защиты памяти. И это далеко не полный список регистров, предоставляемых стандартом (который помимо прочего, оставляет место в адресном пространстве для ваших собственных регистров).

../../.pic/Labs/lab_10_irq/tab_01.png

Таблица 1. Регистры контроля и статуса машинного (наивысшего) уровня привилегий.

Для работы с CS-регистрами используются специальные SYSTEM-инструкции I-типа (с опкодом 1110011), хранящие в 12-битном поле imm адрес регистра, к которому будет осуществлён доступ и адреса в регистровом файле откуда будет считан или куда будет записан один из CS-регистров.

opcodefunc3ТипИнструкцияОписаниеОперация
1110011000ImretВозврат из перехватаPC = mepc
1110011001Icsrrw rd, csr, rs1Чтение и Запись CSRrd = csr, csr = rs1
1110011010Icsrrs rd, csr, rs1Чтение и Установка бит CSRrd = csr, csr = csr | rs1
1110011011Icsrrc rd, csr, rs1Чтение и Очистка бит CSRrd = csr, csr = csr & ~rs1
1110011101Icsrrwi rd, csr, rs1Чтение и Запись CSRrd = csr, csr = imm
1110011110Icsrrsi rd, csr, rs1Чтение и Установка бит CSRrd = csr, csr = csr | imm
1110011111Icsrrci rd, csr, rs1Чтение и Очистка бит CSRrd = csr, csr = csr & ~imm

Таблица 2. Список инструкций для работы с регистрами контроля и статуса.

[!IMPORTANT] Обратите внимание на инструкции csrrwi, csrrsi, csrrci. Эти инструкции используют 19-15 биты в качестве беззнаковой константы (несмотря на то, что согласно способу кодирования инструкций I-типа, эти биты должны интерпретироваться как rs1). Данная 5-битная константа — единственная, которая расширяется нулями.

Для удобства программирования на языке ассемблера RISC-V существуют псевдоинструкции для работы с CSR.

ПсевдоинструкцияИнструкция RISC-VОписаниеОперация
csrr rd, csrcsrrs rd, csr, x0Чтение CSRrd = csr
csrw csr, rs1csrrw x0, csr, rs1Запись CSRcsr = rs1

Таблица 3. Псевдоинструкции для работы с регистрами контроля и статуса.

Операция логического ИЛИ нулевого регистра регистрового файла с содержимым регистра из блока CSR не меняет его содержимого, поэтому при использовании инструкции csrr происходит только операция чтения. Подобным образом реализована псевдоинструкция csrw.

Список использованной литературы

  1. The RISC-V Instruction Set Manual Volume II: Privileged Architecture, Document Version 20240411, Editors Andrew Waterman and Krste Asanović, RISC-V Foundation, April 2024.