Skip to content

Commit

Permalink
refactor: interrupt
Browse files Browse the repository at this point in the history
Signed-off-by: Zone.N <[email protected]>
  • Loading branch information
MRNIU committed Feb 8, 2025
1 parent 5083ede commit dc33053
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 30 deletions.
18 changes: 9 additions & 9 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,27 @@ repos:
# - id: clang-tidy
# args:
# - --checks=.clang-tidy
# - -p=/root/SimpleKernel/build_riscv64/compiler_commands.json
# - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json
# - -extra-arg=--std=c++2b
# - --fix
# - --header-filter=^(/root/SimpleKernel/build_riscv64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_riscv64/src/arch/x86_64|/root/SimpleKernel/build_riscv64/src/arch/aarch64).*
# - --header-filter=^(/root/SimpleKernel/build_aarch64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_aarch64/src/arch/x86_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).*
# - id: clang-tidy
# args:
# - --checks=.clang-tidy
# - -p=/root/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json
# - -p=/root/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json
# - -extra-arg=--std=c++2b
# - --fix
# - --header-filter=^(?/root/SimpleKernel/build_riscv64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_riscv64/src/arch/riscv_64|/root/SimpleKernel/build_riscv64/src/arch/aarch64).*
# - --header-filter=^(?/root/SimpleKernel/build_aarch64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_aarch64/src/arch/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).*
# - id: clang-tidy
# args:
# - --checks=.clang-tidy
# - -p=/root/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json
# - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json
# - -extra-arg=--std=c++2b
# - --fix
# - --header-filter=^(?/root/SimpleKernel/build_riscv64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_riscv64/src/arch/riscv64|/root/SimpleKernel/build_riscv64/src/arch/x86_64).*
# - --header-filter=^(?/root/SimpleKernel/build_aarch64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_aarch64/src/arch/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).*

- repo: https://github.com/koalaman/shellcheck-precommit
rev: v0.10.0
Expand Down
19 changes: 10 additions & 9 deletions src/kernel/arch/aarch64/interrupt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@

#include "interrupt.h"

#include "gic.h"
#include "io.hpp"
#include "kernel_fdt.hpp"
#include "kernel_log.hpp"
Expand Down Expand Up @@ -174,7 +173,13 @@ extern "C" void error_lower_el_aarch32_handler(uint64_t sp) {
}
}

Interrupt::Interrupt() { klog::Info("Interrupt init.\n"); }
Interrupt::Interrupt() {
auto [gicd_base_addr, gicr_base_addr] =
Singleton<KernelFdt>::GetInstance().GetGIC();
gic_ = std::move(Gic(gicd_base_addr, gicr_base_addr));

klog::Info("Interrupt init.\n");
}

void Interrupt::Do(uint64_t cause, uint8_t *context) {
(void)cause;
Expand All @@ -191,13 +196,9 @@ uint32_t InterruptInit(uint32_t, uint8_t *) {

cpu_io::VBAR_EL1::Write(reinterpret_cast<uint64_t>(vector_table));

auto [gicd_base_addr, gicr_base_addr] =
Singleton<KernelFdt>::GetInstance().GetGIC();

Singleton<Gic>::GetInstance() =
std::move(Gic(gicd_base_addr, gicr_base_addr));

// asm("udf #0");
Singleton<Interrupt>::GetInstance().SPI(UART0_IRQ);
Singleton<Interrupt>::GetInstance().SPI(VIRTIO0_IRQ);
Singleton<Interrupt>::GetInstance().PPI(TIMER0_IRQ, 0);

cpu_io::EnableInterrupt();

Expand Down
11 changes: 11 additions & 0 deletions src/kernel/arch/aarch64/interrupt.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,15 @@

#include <cstdint>

#include "gic.h"
#include "interrupt_base.h"
#include "singleton.hpp"
#include "sk_stdio.h"

static constexpr const uint32_t UART0_IRQ = 33;
static constexpr const uint32_t VIRTIO0_IRQ = 48;
static constexpr const uint32_t TIMER0_IRQ = 27;

class Interrupt final : public InterruptBase {
public:
Interrupt();
Expand Down Expand Up @@ -52,7 +57,13 @@ class Interrupt final : public InterruptBase {
*/
void RegisterInterruptFunc(uint64_t cause, InterruptFunc func) override;

__always_inline void SPI(uint32_t intid) const { gic_.SPI(intid); }
__always_inline void PPI(uint32_t intid, uint32_t cpuid) const {
gic_.PPI(intid, cpuid);
}

private:
Gic gic_;
};

#endif /* SIMPLEKERNEL_SRC_KERNEL_ARCH_AARCH64_INCLUDE_INTERRUPT_H_ */
16 changes: 10 additions & 6 deletions src/kernel/driver/gic/gic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,20 @@

Gic::Gic(uint64_t gicd_base_addr, uint64_t gicr_base_addr)
: gicd_(gicd_base_addr), gicr_(gicr_base_addr) {
gicd_.SetupSPI(UART0_IRQ);
gicd_.SetupSPI(VIRTIO0_IRQ);

int cpu = cpu_io::GetCurrentCoreId();

cpu_io::ICC_IGRPEN1_EL1::Enable::Clear();
cpu_io::ICC_PMR_EL1::Priority::Set();

gicr_.SetupPPI(TIMER0_IRQ, cpu);

gicd_.EnableGrp1NS();

klog::Info("Gic init.\n");
}

void Gic::SPI(uint32_t intid) const { gicd_.SetupSPI(intid); }

void Gic::PPI(uint32_t intid, uint32_t cpuid) const {
gicr_.SetupPPI(intid, cpuid);
}

Gic::Gicd::Gicd(uint64_t base_addr) : base_addr_(base_addr) {
Expand Down Expand Up @@ -133,8 +136,9 @@ Gic::Gicr::Gicr(uint64_t base_addr) : base_addr_(base_addr) {

uint32_t waker = Read(cpuid, kGICR_WAKER);
Write(cpuid, kGICR_WAKER, waker & ~(1 << 1));
while (Read(cpuid, kGICR_WAKER) & (1 << 2))
while (Read(cpuid, kGICR_WAKER) & (1 << 2)) {
;
}
}

void Gic::Gicr::Enable(uint32_t intid, uint32_t cpuid) const {
Expand Down
9 changes: 3 additions & 6 deletions src/kernel/driver/gic/include/gic.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,6 @@
#include "kernel_log.hpp"
#include "per_cpu.hpp"

#define UART0_IRQ 33

#define VIRTIO0_IRQ 48

#define TIMER0_IRQ 27

/**
* @brief gic 中断控制器驱动
* @see
Expand Down Expand Up @@ -553,6 +547,9 @@ class Gic {
~Gic() = default;
/// @}

void SPI(uint32_t intid) const;
void PPI(uint32_t intid, uint32_t cpuid) const;

private:
Gicd gicd_;
Gicr gicr_;
Expand Down

0 comments on commit dc33053

Please sign in to comment.