Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • O OSKernel2026-NameNotFound
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 8
    • Issues 8
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Terraform modules
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • NameNotFound
  • OSKernel2026-NameNotFound
  • Issues
  • #4
Closed
Open
Issue created Apr 02, 2026 by 孙浩宇@shyliuliMaintainer

子 issue #4:Trap/中断/异常处理

子 issue #4 (closed):Trap/中断/异常处理

描述

实现 LoongArch64 的异常入口、中断分发和 syscall 入口。

依赖

  • #3 (closed)(Boot 启动完成,能进入 rust_main)
  • 与 #6 类型设计强耦合:trap entry 必须知道 TrapFrame 布局才能保存/恢复寄存器。建议 #4 (closed) 和 #6 共同设计 TrapFrame 结构体,然后分头实现。

需要实现的文件

文件 说明
kernel/src/arch/loongarch64/interrupt/mod.rs 完整实现:中断开关(enable/disable_and_store/restore)、trap_handler 分发逻辑、ack、enable_irq、get_trap_num、 handle_user_page_fault_ext、handle_reserved_inst
kernel/src/arch/loongarch64/interrupt/trap.S trap entry/exit 汇编:保存全部通用寄存器到 TrapFrame、恢复、ERTN 返回
kernel/src/arch/loongarch64/interrupt/consts.rs LoongArch 异常码定义(替换 #2 (closed) 的 stub)
kernel/src/arch/loongarch64/timer.rs 时钟中断实现:CSR.TCFG 配置、CSR.TICLR 清除

关键技术点

异常入口配置

  • CSR.EENTRY:异常入口基地址
  • CSR.ECFG.VS:中断间距(0 表示所有中断共享入口,非 0 则按中断号偏移)
  • 建议初期使用共享入口(VS=0),在 trap_handler 中通过 CSR.ESTAT.Ecode 分发

LoongArch 异常码

Ecode 名称 说明
0x0 INT 中断
0x1 PIL Load 页无效异常
0x2 PIS Store 页无效异常
0x3 PIF 取指页无效异常
0x4 PME 页修改异常
0x7 PPI 页特权等级不合规异常
0x8 ADEF 取指地址错误
0x9 ADEM 访存地址错误
0xB SYS 系统调用
0xC BRK 断点
0xD INE 指令不存在
0xE IPE 指令特权等级错误
0x3F TLBR TLB 重填异常

中断控制

  • 全局中断开关: CSR.CRMD.IE 位
  • 局部中断使能: CSR.ECFG.LIE[12:0] — 13 个中断源
    • LIE[0:1]:软中断 SWI0/SWI1
    • LIE[2:10]:硬中断 HWI0~HWI7 + PMI
    • LIE[11]:定时器中断 TI
    • LIE[12]:IPI
  • 中断状态读取: CSR.ESTAT.IS[12:0]

Syscall 约定

  • 异常码 0xB (SYS)
  • CSR.ERA:syscall 指令地址(返回时需 +4)
  • 参数:a0a6 (r4r10),调用号:a7 (r11)
  • 返回值:a0 (r4)

时钟中断

  • CSR.TCFG:定时器配置(En 使能位 + Periodic 周期位 + InitVal 初始值)
  • CSR.TVAL:定时器当前倒计时值
  • CSR.TICLR:写 1 清除定时器中断(CSR.TICLR.TI 位)
  • 时钟频率可通过 CSR.CPUCFG 或固件传递获取

完成标准

  1. 时钟中断正常触发和处理(能看到 tick 计数增长)
  2. 手动触发 syscall 指令不 panic,能正确分发
  3. 非法指令异常能被捕获并处理
  4. interrupt::enable() / disable_and_store() / restore() 正确控制中断

父任务:#1

Edited Apr 04, 2026 by 孙浩宇
Assignee
Assign to
Time tracking