Skip to content

Commit

Permalink
Merge pull request #25 from enkerewpo/main
Browse files Browse the repository at this point in the history
update loongarch manual
  • Loading branch information
enkerewpo authored Dec 7, 2024
2 parents fc8fbaa + f00bf7e commit 6ba0f86
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 27 deletions.
28 changes: 5 additions & 23 deletions src/chap04/subchap01/LoongArchVirtualization.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

LoongArch指令集是中国龙芯中科公司于2020年发布的自主RISC指令集,包括基础指令集、二进制翻译拓展(LBT)、向量拓展(LSX)、高级向量扩展(LASX)和虚拟化拓展(LVZ)五个模块。

本文将主要对LoongArch指令集的CPU虚拟化设计进行简要介绍。
本文将主要对LoongArch指令集的CPU虚拟化设计进行简要介绍,其相关说明来自目前已经公开的KVM源代码以及代码注释

## LoongArch寄存器简介

Expand Down Expand Up @@ -74,24 +74,11 @@ LoongArch指令集是中国龙芯中科公司于2020年发布的自主RISC指令
| 0x52 | 客户机中断控制 `GINTC` |
| 0x53 | 客户机计数器补偿 `GCNTC` |

## CPU模式

实现了LVZ虚拟化拓展的CPU(即龙芯3系处理器)支持两个运行模式—— **Host模式和Guest模式** [3],其中每个模式各自有四个特权级(PLV0-PLV3)。处理器核当前处于哪个特权等级由`CSR.CRMD``PLV`域的值唯一确定[2]
对于无虚拟化的场景如在Host模式下启动一个Linux内核,其Linux内核态位于PLV0,用户态通常位于PLV3。
对于虚拟化场景,Host模式由Hypervisor使用,Guest模式则是Hypervisor所启动的虚拟机的运行模式。Guest模式在诸多方面受到Host模式下Hypervisor的控制,并且Guest模式下可以通过
Hypercall超级调用指令(hvcl)强制陷入Host模式下的Hypervisor。

下图是在loongarch架构下Hypervisor处理guest模式的异常的一种流程:

![LoongArch-Exception-Guest](../img/loongarch_guest_exception_handle.png)

### GCSR寄存器组

在实现虚拟化的LoongArch处理器中会额外有一组 **GCSR(Guest Control and Status Register)** 寄存器,供Guest模式下的虚拟机内操作系统使用,这里需要和Host模式下的CSR寄存器区分开。
通过这一套GCSR寄存器可以让虚拟机有自己的特权资源和对应管理,同时避免和Hypervisor的特权资源冲突并减少虚拟机陷入Hypervisor的次数。需要注意的是虚拟机对GCSR寄存器的操作、对特权指令(`cpucfg``cacop`等)的执行等仍然可以被Hypervisor监控和控制,LVZ拓展允许Hypervisor自由选择是否对这些操作进行拦截。
在实现虚拟化的LoongArch处理器中会额外有一组 **GCSR(Guest Control and Status Register)** 寄存器。


### 进入Guest模式的流程(KVM)[4]
### 进入Guest模式的流程(来自Linux KVM源码)[3]


1.`switch_to_guest`】:
Expand Down Expand Up @@ -120,9 +107,7 @@ Hypercall超级调用指令(hvcl)强制陷入Host模式下的Hypervisor。
| 24 | 1 | GCHC | 客户机GCSR硬件修改异常 |


### 处理Guest模式下异常的流程(KVM)[4]


### 处理Guest模式下异常的流程(来自Linux KVM源码)[3]

1.`kvm_exc_entry`】:

Expand Down Expand Up @@ -155,7 +140,4 @@ Hypercall超级调用指令(hvcl)强制陷入Host模式下的Hypervisor。

[2] 龙芯中科技术股份有限公司.龙芯架构参考手册.卷一:基础架构.

[3] 龙芯中科技术股份有限公司.龙芯架构参考手册.卷三.

<!-- [4] https://github.com/torvalds/linux/blob/master/arch/loongarch/kvm/switch.S -->
[4] [https://github.com/torvalds/linux/blob/master/arch/loongarch/kvm/switch.S](https://github.com/torvalds/linux/blob/master/arch/loongarch/kvm/switch.S).
[3] [https://github.com/torvalds/linux/blob/master/arch/loongarch/kvm/switch.S](https://github.com/torvalds/linux/blob/master/arch/loongarch/kvm/switch.S).
4 changes: 0 additions & 4 deletions src/chap04/subchap02/LoongArch-Controller.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@ LoongArch的中断配置由`CSR.ECFG`控制,龙芯架构下的中断采用线

除了兼容原有的传统 IO 中断方式,3A5000 开始支持**扩展 I/O 中断**,用于将 HT 总线上的 256 位中断直接分发给各个处理器核,而不再通过 HT 的中断线进行转发,提升 IO 中断使用的灵活性[2]

## 中断虚拟化

在LVZ拓展新增的CSR寄存器中,`CSR.GINTC`(客户机中断控制寄存器)用于虚拟机**硬件中断**的控制,其能够让Hypervisor手动控制客户机各HW中断的使能,以及配置外部HW中断直通虚拟机等功能。

## 参考资料

[1] 龙芯中科技术股份有限公司.龙芯7A2000桥片用户手册.V1.0.第5章.
Expand Down

0 comments on commit 6ba0f86

Please sign in to comment.