linux-2.6.20/drivers/kvm/vmx.c
■機能概要
エミュレーションやバイナリ変換なしでIntel VT-xマシンで仮想マシンを実行させる。
■実装概要
次に示すように、ファイル内にstaticにkvm_arch_ops構造体がディスパッチルーチンとなる関数のポインタとともに宣言されている。
static struct kvm_arch_ops vmx_arch_ops = {
.cpu_has_kvm_support = cpu_has_kvm_support,
.disabled_by_bios = vmx_disabled_by_bios,
.hardware_setup = hardware_setup,
.hardware_unsetup = hardware_unsetup,
.hardware_enable = hardware_enable,
.hardware_disable = hardware_disable,
.vcpu_create = vmx_create_vcpu,
.vcpu_free = vmx_free_vcpu,
.vcpu_load = vmx_vcpu_load,
.vcpu_put = vmx_vcpu_put,
.set_guest_debug = set_guest_debug,
.get_msr = vmx_get_msr,
.set_msr = vmx_set_msr,
.get_segment_base = vmx_get_segment_base,
.get_segment = vmx_get_segment,
.set_segment = vmx_set_segment,
.get_cs_db_l_bits = vmx_get_cs_db_l_bits,
.decache_cr0_cr4_guest_bits = vmx_decache_cr0_cr4_guest_bits,
.set_cr0 = vmx_set_cr0,
.set_cr0_no_modeswitch = vmx_set_cr0_no_modeswitch,
.set_cr3 = vmx_set_cr3,
.set_cr4 = vmx_set_cr4,
#ifdef CONFIG_X86_64
.set_efer = vmx_set_efer,
#endif
.get_idt = vmx_get_idt,
.set_idt = vmx_set_idt,
.get_gdt = vmx_get_gdt,
.set_gdt = vmx_set_gdt,
.cache_regs = vcpu_load_rsp_rip,
.decache_regs = vcpu_put_rsp_rip,
.get_rflags = vmx_get_rflags,
.set_rflags = vmx_set_rflags,
.tlb_flush = vmx_flush_tlb,
.inject_page_fault = vmx_inject_page_fault,
.inject_gp = vmx_inject_gp,
.run = vmx_vcpu_run,
.skip_emulated_instruction = skip_emulated_instruction,
.vcpu_setup = vmx_vcpu_setup,
};
次に示す初期化関数vmx_initの中でvmx_arch_ops構造体のポインタを引数としてkvm.koの関数kvm_init_archを呼び出すことで、それぞれの処理でkvm.koから必要に応じて設定した関数にディスパッチされるようにして、初期化を完了する。
static int __init vmx_init(void)
{
return kvm_init_arch(&vmx_arch_ops, THIS_MODULE);
}
ドライバ終了時には、同様にkvm_exit_archを呼び出し、ドライバの終了処理のトリガーとする。
static void __exit vmx_exit(void)
{
kvm_exit_arch();
}
上記の実装であるため、vmx.c内の関数はすべてstaticで宣言されている。
■ディスパッチルーチン実装
□cpu_has_kvm_support?
□vmx_disabled_by_bios?
□hardware_setup?
□hardware_unsetup?
□hardware_enable?
□hardware_disable?
□vmx_create_vcpu?
□vmx_free_vcpu?
□vmx_vcpu_load?
□vmx_vcpu_put?
□set_guest_debug?
□vmx_get_msr?
□vmx_set_msr?
□vmx_get_segment_base?
□vmx_get_segment?
□vmx_set_segment?
□vmx_get_cs_db_l_bits?
□vmx_decache_cr0_cr4_guest_bits?
□vmx_set_cr0?
□vmx_set_cr0_no_modeswitch?
□vmx_set_cr3?
□vmx_set_cr4?
□vmx_set_efer?
□vmx_get_idt?
□vmx_set_idt?
□vmx_get_gdt?
□vmx_set_gdt?
□vcpu_load_rsp_rip?
□vcpu_put_rsp_rip?
□vmx_get_rflags?
□vmx_set_rflags?
□vmx_flush_tlb?
□vmx_inject_page_fault?
□vmx_inject_gp?
□vmx_vcpu_run?
□skip_emulated_instruction?
□vmx_vcpu_setup?
linux-2.6.20/drivers/kvm/vmx.c(調査用メモ)
エミュレーションやバイナリ変換なしでIntel VT-xマシンで仮想マシンを実行させる。
■実装概要
次に示すように、ファイル内にstaticにkvm_arch_ops構造体がディスパッチルーチンとなる関数のポインタとともに宣言されている。
static struct kvm_arch_ops vmx_arch_ops = {
.cpu_has_kvm_support = cpu_has_kvm_support,
.disabled_by_bios = vmx_disabled_by_bios,
.hardware_setup = hardware_setup,
.hardware_unsetup = hardware_unsetup,
.hardware_enable = hardware_enable,
.hardware_disable = hardware_disable,
.vcpu_create = vmx_create_vcpu,
.vcpu_free = vmx_free_vcpu,
.vcpu_load = vmx_vcpu_load,
.vcpu_put = vmx_vcpu_put,
.set_guest_debug = set_guest_debug,
.get_msr = vmx_get_msr,
.set_msr = vmx_set_msr,
.get_segment_base = vmx_get_segment_base,
.get_segment = vmx_get_segment,
.set_segment = vmx_set_segment,
.get_cs_db_l_bits = vmx_get_cs_db_l_bits,
.decache_cr0_cr4_guest_bits = vmx_decache_cr0_cr4_guest_bits,
.set_cr0 = vmx_set_cr0,
.set_cr0_no_modeswitch = vmx_set_cr0_no_modeswitch,
.set_cr3 = vmx_set_cr3,
.set_cr4 = vmx_set_cr4,
#ifdef CONFIG_X86_64
.set_efer = vmx_set_efer,
#endif
.get_idt = vmx_get_idt,
.set_idt = vmx_set_idt,
.get_gdt = vmx_get_gdt,
.set_gdt = vmx_set_gdt,
.cache_regs = vcpu_load_rsp_rip,
.decache_regs = vcpu_put_rsp_rip,
.get_rflags = vmx_get_rflags,
.set_rflags = vmx_set_rflags,
.tlb_flush = vmx_flush_tlb,
.inject_page_fault = vmx_inject_page_fault,
.inject_gp = vmx_inject_gp,
.run = vmx_vcpu_run,
.skip_emulated_instruction = skip_emulated_instruction,
.vcpu_setup = vmx_vcpu_setup,
};
次に示す初期化関数vmx_initの中でvmx_arch_ops構造体のポインタを引数としてkvm.koの関数kvm_init_archを呼び出すことで、それぞれの処理でkvm.koから必要に応じて設定した関数にディスパッチされるようにして、初期化を完了する。
static int __init vmx_init(void)
{
return kvm_init_arch(&vmx_arch_ops, THIS_MODULE);
}
ドライバ終了時には、同様にkvm_exit_archを呼び出し、ドライバの終了処理のトリガーとする。
static void __exit vmx_exit(void)
{
kvm_exit_arch();
}
上記の実装であるため、vmx.c内の関数はすべてstaticで宣言されている。
■ディスパッチルーチン実装
□cpu_has_kvm_support?
□vmx_disabled_by_bios?
□hardware_setup?
□hardware_unsetup?
□hardware_enable?
□hardware_disable?
□vmx_create_vcpu?
□vmx_free_vcpu?
□vmx_vcpu_load?
□vmx_vcpu_put?
□set_guest_debug?
□vmx_get_msr?
□vmx_set_msr?
□vmx_get_segment_base?
□vmx_get_segment?
□vmx_set_segment?
□vmx_get_cs_db_l_bits?
□vmx_decache_cr0_cr4_guest_bits?
□vmx_set_cr0?
□vmx_set_cr0_no_modeswitch?
□vmx_set_cr3?
□vmx_set_cr4?
□vmx_set_efer?
□vmx_get_idt?
□vmx_set_idt?
□vmx_get_gdt?
□vmx_set_gdt?
□vcpu_load_rsp_rip?
□vcpu_put_rsp_rip?
□vmx_get_rflags?
□vmx_set_rflags?
□vmx_flush_tlb?
□vmx_inject_page_fault?
□vmx_inject_gp?
□vmx_vcpu_run?
□skip_emulated_instruction?
□vmx_vcpu_setup?
linux-2.6.20/drivers/kvm/vmx.c(調査用メモ)
2007年03月03日(土) 23:15:52 Modified by deku_nobo