static asmlinkage void do_write_msr_sub (void *arg) { struct msrarg *p; p = arg; asm_wrmsr64 (p->msrindex, *p->msrdata); }
void savemsr_load (struct savemsr *p) { int i; for (i = 0; i < NUM_OF_SAVEMSR_DATA; i++) { if (p->data[i].exist) asm_wrmsr64 (savemsr_index[i], p->data[i].msrdata); } }
static u64 get_ia32_bios_sign_id (void) { u64 rev; u32 a, b, c, d; asm_wrmsr64 (MSR_IA32_BIOS_SIGN_ID, 0); asm_cpuid (1, 0, &a, &b, &c, &d); asm_rdmsr64 (MSR_IA32_BIOS_SIGN_ID, &rev); return rev; }
void svm_init (void) { u64 p; u64 tmp; void *v; ulong efer; asm_rdmsr (MSR_IA32_EFER, &efer); efer |= MSR_IA32_EFER_SVME_BIT; asm_wrmsr (MSR_IA32_EFER, efer); asm_rdmsr64 (MSR_AMD_VM_CR, &tmp); tmp |= MSR_AMD_VM_CR_DIS_A20M_BIT; asm_wrmsr64 (MSR_AMD_VM_CR, tmp); /* FIXME: size of a host state area is undocumented */ alloc_page (&v, &p); currentcpu->svm.hsave = v; currentcpu->svm.hsave_phys = p; asm_wrmsr64 (MSR_AMD_VM_HSAVE_PA, p); alloc_page (&v, &p); memset (v, 0, PAGESIZE); currentcpu->svm.vmcbhost = v; currentcpu->svm.vmcbhost_phys = p; }