1 ITS设备的注册
ITS设备和GIC设备通过函数kvm_register_device_ops()注册不同的操作函数,如下所示:
2 系统调用KVM_CREATE_DEVICE
在QEMU中会调用系统调用KVM_CREATE_DEVICE为ITS创建设备,并最终与fd关联,过程如下:
过程如下:
- 分配kvm_device,并根据设备类型,设置dev->ops,当ITS设备时ops=kvm_arm_vgic_its_ops;当GIC设备时ops=kvm_arm_vgic_v3_ops;
- 调用设备ops->create()回调,创建vgic_its,并设置部分成员,详细如下所示:
- 将ITS设备添加到kvm中
- 调用anon_inode_getfd()将ITS设备与fd关联,对设备操作的文件操作符kvm_device_fops;
3 ITS命令的模拟
这里主要是对CWRITE寄存器的模拟。当guest中发送ITS命令给ITS设备时,这时会以写CWRITE寄存器结束,这里会陷入到host中,并对CWRITE寄存器进行模拟。过程如下所示:
这里主要对MAPD/MAPC/MAPI命令的模拟,如下图所示,这三个命令会构建如下结构体: