From 26269dfc53a850c21bf41b86296a2d3566097b92 Mon Sep 17 00:00:00 2001 From: wheatfox Date: Sat, 7 Dec 2024 15:04:01 +0800 Subject: [PATCH 1/2] update loongarch manual --- .../subchap01/LoongArchVirtualization.md | 26 +++---------------- src/chap04/subchap02/LoongArch-Controller.md | 4 --- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/chap04/subchap01/LoongArchVirtualization.md b/src/chap04/subchap01/LoongArchVirtualization.md index 78c69be..1d71435 100644 --- a/src/chap04/subchap01/LoongArchVirtualization.md +++ b/src/chap04/subchap01/LoongArchVirtualization.md @@ -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源码)[4] 1. 【`switch_to_guest`】: @@ -120,9 +107,7 @@ Hypercall超级调用指令(hvcl)强制陷入Host模式下的Hypervisor。 | 24 | 1 | GCHC | 客户机GCSR硬件修改异常 | -### 处理Guest模式下异常的流程(KVM)[4] - - +### 处理Guest模式下异常的流程(来自Linux KVM源码)[4] 1. 【`kvm_exc_entry`】: @@ -155,7 +140,4 @@ Hypercall超级调用指令(hvcl)强制陷入Host模式下的Hypervisor。 [2] 龙芯中科技术股份有限公司.龙芯架构参考手册.卷一:基础架构. -[3] 龙芯中科技术股份有限公司.龙芯架构参考手册.卷三. - - -[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). \ No newline at end of file +[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). \ No newline at end of file diff --git a/src/chap04/subchap02/LoongArch-Controller.md b/src/chap04/subchap02/LoongArch-Controller.md index aaa0c0d..03ede9b 100644 --- a/src/chap04/subchap02/LoongArch-Controller.md +++ b/src/chap04/subchap02/LoongArch-Controller.md @@ -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章. From f00bf7e7ef0ab422266c614f9317767469f7339a Mon Sep 17 00:00:00 2001 From: wheatfox Date: Sat, 7 Dec 2024 15:11:48 +0800 Subject: [PATCH 2/2] update footnote number --- src/chap04/subchap01/LoongArchVirtualization.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/chap04/subchap01/LoongArchVirtualization.md b/src/chap04/subchap01/LoongArchVirtualization.md index 1d71435..075f8e2 100644 --- a/src/chap04/subchap01/LoongArchVirtualization.md +++ b/src/chap04/subchap01/LoongArchVirtualization.md @@ -2,7 +2,7 @@ LoongArch指令集是中国龙芯中科公司于2020年发布的自主RISC指令集,包括基础指令集、二进制翻译拓展(LBT)、向量拓展(LSX)、高级向量扩展(LASX)和虚拟化拓展(LVZ)五个模块。 -本文将主要对LoongArch指令集的CPU虚拟化设计进行简要介绍。 +本文将主要对LoongArch指令集的CPU虚拟化设计进行简要介绍,其相关说明来自目前已经公开的KVM源代码以及代码注释。 ## LoongArch寄存器简介 @@ -78,7 +78,7 @@ LoongArch指令集是中国龙芯中科公司于2020年发布的自主RISC指令 在实现虚拟化的LoongArch处理器中会额外有一组 **GCSR(Guest Control and Status Register)** 寄存器。 -### 进入Guest模式的流程(来自Linux KVM源码)[4] +### 进入Guest模式的流程(来自Linux KVM源码)[3] 1. 【`switch_to_guest`】: @@ -107,7 +107,7 @@ LoongArch指令集是中国龙芯中科公司于2020年发布的自主RISC指令 | 24 | 1 | GCHC | 客户机GCSR硬件修改异常 | -### 处理Guest模式下异常的流程(来自Linux KVM源码)[4] +### 处理Guest模式下异常的流程(来自Linux KVM源码)[3] 1. 【`kvm_exc_entry`】: