31 [[nodiscard]]
auto Which() const -> uint32_t;
37 auto
Done(uint32_t source_id) const ->
void;
46 auto
Set(uint32_t hart_id, uint32_t source_id, uint32_t priority,
47 bool enable) const ->
void;
55 [[nodiscard]] auto
Get(uint32_t hart_id, uint32_t source_id) const
56 ->
std::tuple<uint32_t,
bool,
bool>;
70 auto
Do(uint64_t cause,
cpu_io::TrapContext* context) ->
void;
81 explicit
Plic(uint64_t dev_addr,
size_t ndev,
size_t context_count);
86 auto operator=(const
Plic&) ->
Plic& = default;
120 uint32_t mode = 1) const
122 return hart_id * 2 + mode;
131 [[nodiscard]]
auto GetEnableBit(uint32_t context_id, uint32_t source_id)
const
140 auto SetEnableBit(uint32_t context_id, uint32_t source_id,
bool value)
const
148 [[nodiscard]]
auto SourcePriority(uint32_t source_id)
const -> uint32_t&;
155 [[nodiscard]]
auto GetPendingBit(uint32_t source_id)
const -> bool;
162 auto SetPendingBit(uint32_t source_id,
bool value)
const -> void;
176 [[nodiscard]]
auto ClaimComplete(uint32_t context_id)
const -> uint32_t&;
etl::delegate< uint64_t(uint64_t, cpu_io::TrapContext *)> InterruptDelegate
类型安全的中断处理委托
auto Set(uint32_t hart_id, uint32_t source_id, uint32_t priority, bool enable) const -> void
设置指定中断源的使能状态
static constexpr uint64_t kEnableSize
auto GetEnableBit(uint32_t context_id, uint32_t source_id) const -> bool
获取使能位寄存器中指定中断源的状态
auto Done(uint32_t source_id) const -> void
告知 Plic 已经处理了当前 IRQ
auto PriorityThreshold(uint32_t context_id) const -> uint32_t &
获取优先级阈值寄存器
auto SourcePriority(uint32_t source_id) const -> uint32_t &
获取中断源优先级寄存器
static constexpr uint64_t kPendingBitsOffset
auto Which() const -> uint32_t
向 Plic 询问中断
auto GetPendingBit(uint32_t source_id) const -> bool
获取挂起位寄存器中指定中断源的状态
auto SetEnableBit(uint32_t context_id, uint32_t source_id, bool value) const -> void
设置使能位寄存器中指定中断源的状态
static constexpr uint64_t kPriorityThresholdOffset
auto ClaimComplete(uint32_t context_id) const -> uint32_t &
获取声明/完成寄存器
static constexpr uint64_t kContextSize
static constexpr uint64_t kContextOffset
static constexpr uint64_t kClaimCompleteOffset
auto Get(uint32_t hart_id, uint32_t source_id) const -> std::tuple< uint32_t, bool, bool >
获取指定中断源的状态信息
auto Do(uint64_t cause, cpu_io::TrapContext *context) -> void
执行外部中断处理
static constexpr uint64_t kEnableBitsOffset
__always_inline auto GetContextId(uint32_t hart_id, uint32_t mode=1) const -> uint32_t
计算 context ID
static constexpr size_t kInterruptMaxCount
最大外部中断数量
static constexpr uint64_t kSourcePriorityOffset
InterruptBase::InterruptDelegate InterruptDelegate
auto SetPendingBit(uint32_t source_id, bool value) const -> void
设置挂起位寄存器中指定中断源的状态
auto RegisterInterruptFunc(uint8_t cause, InterruptDelegate func) -> void
注册外部中断处理函数
static std::array< InterruptDelegate, kInterruptMaxCount > interrupt_handlers_
外部中断处理函数数组