亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? vmx.c

?? linux 內(nèi)核源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
{	vcpu_clear(to_vmx(vcpu));}static unsigned long vmx_get_rflags(struct kvm_vcpu *vcpu){	return vmcs_readl(GUEST_RFLAGS);}static void vmx_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags){	if (vcpu->rmode.active)		rflags |= IOPL_MASK | X86_EFLAGS_VM;	vmcs_writel(GUEST_RFLAGS, rflags);}static void skip_emulated_instruction(struct kvm_vcpu *vcpu){	unsigned long rip;	u32 interruptibility;	rip = vmcs_readl(GUEST_RIP);	rip += vmcs_read32(VM_EXIT_INSTRUCTION_LEN);	vmcs_writel(GUEST_RIP, rip);	/*	 * We emulated an instruction, so temporary interrupt blocking	 * should be removed, if set.	 */	interruptibility = vmcs_read32(GUEST_INTERRUPTIBILITY_INFO);	if (interruptibility & 3)		vmcs_write32(GUEST_INTERRUPTIBILITY_INFO,			     interruptibility & ~3);	vcpu->interrupt_window_open = 1;}static void vmx_inject_gp(struct kvm_vcpu *vcpu, unsigned error_code){	printk(KERN_DEBUG "inject_general_protection: rip 0x%lx\n",	       vmcs_readl(GUEST_RIP));	vmcs_write32(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code);	vmcs_write32(VM_ENTRY_INTR_INFO_FIELD,		     GP_VECTOR |		     INTR_TYPE_EXCEPTION |		     INTR_INFO_DELIEVER_CODE_MASK |		     INTR_INFO_VALID_MASK);}/* * Swap MSR entry in host/guest MSR entry array. */#ifdef CONFIG_X86_64static void move_msr_up(struct vcpu_vmx *vmx, int from, int to){	struct kvm_msr_entry tmp;	tmp = vmx->guest_msrs[to];	vmx->guest_msrs[to] = vmx->guest_msrs[from];	vmx->guest_msrs[from] = tmp;	tmp = vmx->host_msrs[to];	vmx->host_msrs[to] = vmx->host_msrs[from];	vmx->host_msrs[from] = tmp;}#endif/* * Set up the vmcs to automatically save and restore system * msrs.  Don't touch the 64-bit msrs if the guest is in legacy * mode, as fiddling with msrs is very expensive. */static void setup_msrs(struct vcpu_vmx *vmx){	int save_nmsrs;	save_nmsrs = 0;#ifdef CONFIG_X86_64	if (is_long_mode(&vmx->vcpu)) {		int index;		index = __find_msr_index(vmx, MSR_SYSCALL_MASK);		if (index >= 0)			move_msr_up(vmx, index, save_nmsrs++);		index = __find_msr_index(vmx, MSR_LSTAR);		if (index >= 0)			move_msr_up(vmx, index, save_nmsrs++);		index = __find_msr_index(vmx, MSR_CSTAR);		if (index >= 0)			move_msr_up(vmx, index, save_nmsrs++);		index = __find_msr_index(vmx, MSR_KERNEL_GS_BASE);		if (index >= 0)			move_msr_up(vmx, index, save_nmsrs++);		/*		 * MSR_K6_STAR is only needed on long mode guests, and only		 * if efer.sce is enabled.		 */		index = __find_msr_index(vmx, MSR_K6_STAR);		if ((index >= 0) && (vmx->vcpu.shadow_efer & EFER_SCE))			move_msr_up(vmx, index, save_nmsrs++);	}#endif	vmx->save_nmsrs = save_nmsrs;#ifdef CONFIG_X86_64	vmx->msr_offset_kernel_gs_base =		__find_msr_index(vmx, MSR_KERNEL_GS_BASE);#endif	vmx->msr_offset_efer = __find_msr_index(vmx, MSR_EFER);}/* * reads and returns guest's timestamp counter "register" * guest_tsc = host_tsc + tsc_offset    -- 21.3 */static u64 guest_read_tsc(void){	u64 host_tsc, tsc_offset;	rdtscll(host_tsc);	tsc_offset = vmcs_read64(TSC_OFFSET);	return host_tsc + tsc_offset;}/* * writes 'guest_tsc' into guest's timestamp counter "register" * guest_tsc = host_tsc + tsc_offset ==> tsc_offset = guest_tsc - host_tsc */static void guest_write_tsc(u64 guest_tsc){	u64 host_tsc;	rdtscll(host_tsc);	vmcs_write64(TSC_OFFSET, guest_tsc - host_tsc);}/* * Reads an msr value (of 'msr_index') into 'pdata'. * Returns 0 on success, non-0 otherwise. * Assumes vcpu_load() was already called. */static int vmx_get_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata){	u64 data;	struct kvm_msr_entry *msr;	if (!pdata) {		printk(KERN_ERR "BUG: get_msr called with NULL pdata\n");		return -EINVAL;	}	switch (msr_index) {#ifdef CONFIG_X86_64	case MSR_FS_BASE:		data = vmcs_readl(GUEST_FS_BASE);		break;	case MSR_GS_BASE:		data = vmcs_readl(GUEST_GS_BASE);		break;	case MSR_EFER:		return kvm_get_msr_common(vcpu, msr_index, pdata);#endif	case MSR_IA32_TIME_STAMP_COUNTER:		data = guest_read_tsc();		break;	case MSR_IA32_SYSENTER_CS:		data = vmcs_read32(GUEST_SYSENTER_CS);		break;	case MSR_IA32_SYSENTER_EIP:		data = vmcs_readl(GUEST_SYSENTER_EIP);		break;	case MSR_IA32_SYSENTER_ESP:		data = vmcs_readl(GUEST_SYSENTER_ESP);		break;	default:		msr = find_msr_entry(to_vmx(vcpu), msr_index);		if (msr) {			data = msr->data;			break;		}		return kvm_get_msr_common(vcpu, msr_index, pdata);	}	*pdata = data;	return 0;}/* * Writes msr value into into the appropriate "register". * Returns 0 on success, non-0 otherwise. * Assumes vcpu_load() was already called. */static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data){	struct vcpu_vmx *vmx = to_vmx(vcpu);	struct kvm_msr_entry *msr;	int ret = 0;	switch (msr_index) {#ifdef CONFIG_X86_64	case MSR_EFER:		ret = kvm_set_msr_common(vcpu, msr_index, data);		if (vmx->host_state.loaded)			load_transition_efer(vmx);		break;	case MSR_FS_BASE:		vmcs_writel(GUEST_FS_BASE, data);		break;	case MSR_GS_BASE:		vmcs_writel(GUEST_GS_BASE, data);		break;#endif	case MSR_IA32_SYSENTER_CS:		vmcs_write32(GUEST_SYSENTER_CS, data);		break;	case MSR_IA32_SYSENTER_EIP:		vmcs_writel(GUEST_SYSENTER_EIP, data);		break;	case MSR_IA32_SYSENTER_ESP:		vmcs_writel(GUEST_SYSENTER_ESP, data);		break;	case MSR_IA32_TIME_STAMP_COUNTER:		guest_write_tsc(data);		break;	default:		msr = find_msr_entry(vmx, msr_index);		if (msr) {			msr->data = data;			if (vmx->host_state.loaded)				load_msrs(vmx->guest_msrs, vmx->save_nmsrs);			break;		}		ret = kvm_set_msr_common(vcpu, msr_index, data);	}	return ret;}/* * Sync the rsp and rip registers into the vcpu structure.  This allows * registers to be accessed by indexing vcpu->regs. */static void vcpu_load_rsp_rip(struct kvm_vcpu *vcpu){	vcpu->regs[VCPU_REGS_RSP] = vmcs_readl(GUEST_RSP);	vcpu->rip = vmcs_readl(GUEST_RIP);}/* * Syncs rsp and rip back into the vmcs.  Should be called after possible * modification. */static void vcpu_put_rsp_rip(struct kvm_vcpu *vcpu){	vmcs_writel(GUEST_RSP, vcpu->regs[VCPU_REGS_RSP]);	vmcs_writel(GUEST_RIP, vcpu->rip);}static int set_guest_debug(struct kvm_vcpu *vcpu, struct kvm_debug_guest *dbg){	unsigned long dr7 = 0x400;	int old_singlestep;	old_singlestep = vcpu->guest_debug.singlestep;	vcpu->guest_debug.enabled = dbg->enabled;	if (vcpu->guest_debug.enabled) {		int i;		dr7 |= 0x200;  /* exact */		for (i = 0; i < 4; ++i) {			if (!dbg->breakpoints[i].enabled)				continue;			vcpu->guest_debug.bp[i] = dbg->breakpoints[i].address;			dr7 |= 2 << (i*2);    /* global enable */			dr7 |= 0 << (i*4+16); /* execution breakpoint */		}		vcpu->guest_debug.singlestep = dbg->singlestep;	} else		vcpu->guest_debug.singlestep = 0;	if (old_singlestep && !vcpu->guest_debug.singlestep) {		unsigned long flags;		flags = vmcs_readl(GUEST_RFLAGS);		flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF);		vmcs_writel(GUEST_RFLAGS, flags);	}	update_exception_bitmap(vcpu);	vmcs_writel(GUEST_DR7, dr7);	return 0;}static int vmx_get_irq(struct kvm_vcpu *vcpu){	u32 idtv_info_field;	idtv_info_field = vmcs_read32(IDT_VECTORING_INFO_FIELD);	if (idtv_info_field & INTR_INFO_VALID_MASK) {		if (is_external_interrupt(idtv_info_field))			return idtv_info_field & VECTORING_INFO_VECTOR_MASK;		else			printk("pending exception: not handled yet\n");	}	return -1;}static __init int cpu_has_kvm_support(void){	unsigned long ecx = cpuid_ecx(1);	return test_bit(5, &ecx); /* CPUID.1:ECX.VMX[bit 5] -> VT */}static __init int vmx_disabled_by_bios(void){	u64 msr;	rdmsrl(MSR_IA32_FEATURE_CONTROL, msr);	return (msr & (MSR_IA32_FEATURE_CONTROL_LOCKED |		       MSR_IA32_FEATURE_CONTROL_VMXON_ENABLED))	    == MSR_IA32_FEATURE_CONTROL_LOCKED;	/* locked but not enabled */}static void hardware_enable(void *garbage){	int cpu = raw_smp_processor_id();	u64 phys_addr = __pa(per_cpu(vmxarea, cpu));	u64 old;	rdmsrl(MSR_IA32_FEATURE_CONTROL, old);	if ((old & (MSR_IA32_FEATURE_CONTROL_LOCKED |		    MSR_IA32_FEATURE_CONTROL_VMXON_ENABLED))	    != (MSR_IA32_FEATURE_CONTROL_LOCKED |		MSR_IA32_FEATURE_CONTROL_VMXON_ENABLED))		/* enable and lock */		wrmsrl(MSR_IA32_FEATURE_CONTROL, old |		       MSR_IA32_FEATURE_CONTROL_LOCKED |		       MSR_IA32_FEATURE_CONTROL_VMXON_ENABLED);	write_cr4(read_cr4() | X86_CR4_VMXE); /* FIXME: not cpu hotplug safe */	asm volatile (ASM_VMX_VMXON_RAX : : "a"(&phys_addr), "m"(phys_addr)		      : "memory", "cc");}static void hardware_disable(void *garbage){	asm volatile (ASM_VMX_VMXOFF : : : "cc");}static __init int adjust_vmx_controls(u32 ctl_min, u32 ctl_opt,				      u32 msr, u32* result){	u32 vmx_msr_low, vmx_msr_high;	u32 ctl = ctl_min | ctl_opt;	rdmsr(msr, vmx_msr_low, vmx_msr_high);	ctl &= vmx_msr_high; /* bit == 0 in high word ==> must be zero */	ctl |= vmx_msr_low;  /* bit == 1 in low word  ==> must be one  */	/* Ensure minimum (required) set of control bits are supported. */	if (ctl_min & ~ctl)		return -EIO;	*result = ctl;	return 0;}static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf){	u32 vmx_msr_low, vmx_msr_high;	u32 min, opt;	u32 _pin_based_exec_control = 0;	u32 _cpu_based_exec_control = 0;	u32 _vmexit_control = 0;	u32 _vmentry_control = 0;	min = PIN_BASED_EXT_INTR_MASK | PIN_BASED_NMI_EXITING;	opt = 0;	if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_PINBASED_CTLS,				&_pin_based_exec_control) < 0)		return -EIO;	min = CPU_BASED_HLT_EXITING |#ifdef CONFIG_X86_64	      CPU_BASED_CR8_LOAD_EXITING |	      CPU_BASED_CR8_STORE_EXITING |#endif	      CPU_BASED_USE_IO_BITMAPS |	      CPU_BASED_MOV_DR_EXITING |	      CPU_BASED_USE_TSC_OFFSETING;#ifdef CONFIG_X86_64	opt = CPU_BASED_TPR_SHADOW;#else	opt = 0;#endif	if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_PROCBASED_CTLS,				&_cpu_based_exec_control) < 0)		return -EIO;#ifdef CONFIG_X86_64	if ((_cpu_based_exec_control & CPU_BASED_TPR_SHADOW))		_cpu_based_exec_control &= ~CPU_BASED_CR8_LOAD_EXITING &					   ~CPU_BASED_CR8_STORE_EXITING;#endif	min = 0;#ifdef CONFIG_X86_64	min |= VM_EXIT_HOST_ADDR_SPACE_SIZE;#endif	opt = 0;	if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_EXIT_CTLS,				&_vmexit_control) < 0)		return -EIO;	min = opt = 0;	if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_ENTRY_CTLS,				&_vmentry_control) < 0)		return -EIO;	rdmsr(MSR_IA32_VMX_BASIC, vmx_msr_low, vmx_msr_high);	/* IA-32 SDM Vol 3B: VMCS size is never greater than 4kB. */	if ((vmx_msr_high & 0x1fff) > PAGE_SIZE)		return -EIO;#ifdef CONFIG_X86_64	/* IA-32 SDM Vol 3B: 64-bit CPUs always have VMX_BASIC_MSR[48]==0. */	if (vmx_msr_high & (1u<<16))		return -EIO;#endif	/* Require Write-Back (WB) memory type for VMCS accesses. */	if (((vmx_msr_high >> 18) & 15) != 6)		return -EIO;	vmcs_conf->size = vmx_msr_high & 0x1fff;	vmcs_conf->order = get_order(vmcs_config.size);	vmcs_conf->revision_id = vmx_msr_low;	vmcs_conf->pin_based_exec_ctrl = _pin_based_exec_control;	vmcs_conf->cpu_based_exec_ctrl = _cpu_based_exec_control;	vmcs_conf->vmexit_ctrl         = _vmexit_control;	vmcs_conf->vmentry_ctrl        = _vmentry_control;	return 0;}static struct vmcs *alloc_vmcs_cpu(int cpu){	int node = cpu_to_node(cpu);	struct page *pages;	struct vmcs *vmcs;	pages = alloc_pages_node(node, GFP_KERNEL, vmcs_config.order);	if (!pages)		return NULL;	vmcs = page_address(pages);	memset(vmcs, 0, vmcs_config.size);	vmcs->revision_id = vmcs_config.revision_id; /* vmcs revision id */	return vmcs;}static struct vmcs *alloc_vmcs(void){	return alloc_vmcs_cpu(raw_smp_processor_id());}static void free_vmcs(struct vmcs *vmcs){	free_pages((unsigned long)vmcs, vmcs_config.order);}static void free_kvm_area(void){	int cpu;	for_each_online_cpu(cpu)		free_vmcs(per_cpu(vmxarea, cpu));}static __init int alloc_kvm_area(void){	int cpu;	for_each_online_cpu(cpu) {		struct vmcs *vmcs;		vmcs = alloc_vmcs_cpu(cpu);		if (!vmcs) {			free_kvm_area();			return -ENOMEM;		}		per_cpu(vmxarea, cpu) = vmcs;	}	return 0;}static __init int hardware_setup(void){	if (setup_vmcs_config(&vmcs_config) < 0)		return -EIO;	return alloc_kvm_area();}static __exit void hardware_unsetup(void){	free_kvm_area();}static void fix_pmode_dataseg(int seg, struct kvm_save_segment *save){	struct kvm_vmx_segment_field *sf = &kvm_vmx_segment_fields[seg];

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本韩国欧美一区二区三区| 亚洲国产精品ⅴa在线观看| 亚洲视频精选在线| 69久久99精品久久久久婷婷 | 男人操女人的视频在线观看欧美| 精品乱码亚洲一区二区不卡| 在线亚洲人成电影网站色www| 极品尤物av久久免费看| 亚洲一区二区三区美女| 中文字幕不卡一区| 精品区一区二区| 欧美日韩日日夜夜| 波多野结衣中文字幕一区| 免费黄网站欧美| 亚洲综合自拍偷拍| 国产欧美日韩精品在线| 日韩欧美一级片| 欧美日韩一级大片网址| 91小视频免费看| 色婷婷国产精品综合在线观看| 国产精品伊人色| 蜜桃久久久久久| 日韩国产欧美在线视频| 亚洲一区二区三区四区五区黄| 久久精品夜色噜噜亚洲a∨| 欧美乱妇一区二区三区不卡视频| 一本色道久久综合亚洲aⅴ蜜桃 | 99久久久无码国产精品| 国产精品一卡二卡在线观看| 老司机一区二区| 三级久久三级久久| 午夜久久电影网| 午夜视频在线观看一区二区三区 | 亚洲国产高清在线观看视频| 久久久久久久av麻豆果冻| 欧美一区二区性放荡片| 欧美日韩成人综合天天影院| 在线精品视频一区二区三四| 91视频一区二区| 95精品视频在线| 91视频xxxx| 一本色道**综合亚洲精品蜜桃冫| 成人网在线播放| eeuss鲁片一区二区三区 | 99久久免费视频.com| 北条麻妃国产九九精品视频| 9i看片成人免费高清| 99v久久综合狠狠综合久久| 成人av在线播放网址| 99久久99久久精品国产片果冻| 91亚洲永久精品| 欧美中文字幕一区二区三区| 欧美日韩色一区| 欧美一卡二卡三卡| 精品国产乱码久久久久久牛牛| 久久综合丝袜日本网| 亚洲国产高清在线观看视频| 成人免费一区二区三区在线观看| 亚洲精品一二三| 亚洲成人精品在线观看| 蜜臀a∨国产成人精品| 国产一区二区导航在线播放| 成人免费观看av| 欧美亚洲一区二区在线| 3d成人动漫网站| 久久欧美中文字幕| 亚洲免费视频中文字幕| 午夜激情一区二区| 91麻豆精品在线观看| 在线免费av一区| 精品少妇一区二区三区日产乱码| 久久久精品中文字幕麻豆发布| 日韩一区中文字幕| 视频一区二区不卡| 成人午夜免费av| 欧美日韩三级视频| 久久久影院官网| 亚洲免费伊人电影| 看电影不卡的网站| 一本一道久久a久久精品| 欧美一级电影网站| 亚洲人亚洲人成电影网站色| 三级欧美在线一区| 99麻豆久久久国产精品免费优播| 欧美日本国产一区| 国产精品美女久久久久aⅴ国产馆| 亚洲大片免费看| 成人一区二区三区视频在线观看| 欧美在线免费观看视频| 国产亚洲制服色| 亚洲二区在线视频| 成人av资源在线| 日韩精品在线网站| 亚洲国产精品一区二区久久恐怖片| 国产在线麻豆精品观看| 欧美日韩激情在线| 中文字幕亚洲综合久久菠萝蜜| 久久精品噜噜噜成人88aⅴ| 99久久综合国产精品| 精品久久久久99| 亚洲一区免费在线观看| 成人在线综合网站| 日韩一区二区在线播放| 亚洲午夜精品网| 99久久精品国产观看| 久久久五月婷婷| 日韩 欧美一区二区三区| 91丨九色丨黑人外教| 国产日产欧美一区| 精品午夜久久福利影院| 91精品国产综合久久蜜臀| 亚洲男人的天堂一区二区| 丁香天五香天堂综合| 日韩一二三区不卡| 丝袜美腿亚洲一区二区图片| 色综合久久综合中文综合网| 国产精品毛片无遮挡高清| 国产精品影视天天线| 日韩欧美国产麻豆| 奇米精品一区二区三区在线观看 | 五月综合激情网| eeuss国产一区二区三区| 午夜精品福利久久久| 91免费版在线看| 国产精品久久久99| 国产a精品视频| 国产日韩av一区| 国产成人午夜精品影院观看视频| 亚洲精品一区二区三区精华液| 免费高清不卡av| 日韩欧美中文字幕制服| 蜜桃视频在线一区| 日韩亚洲欧美在线观看| 毛片av一区二区三区| 欧美videos大乳护士334| 男男成人高潮片免费网站| 日韩一区二区免费高清| 蜜臀av一区二区| 精品国产亚洲在线| 国产精品系列在线观看| 国产女人18毛片水真多成人如厕 | 国产精品色婷婷| 成人爱爱电影网址| 亚洲私人黄色宅男| 欧洲av一区二区嗯嗯嗯啊| 亚洲成人精品一区二区| 91精品欧美一区二区三区综合在| 青青草精品视频| 精品国产乱码久久久久久久久 | 亚洲天堂福利av| 色婷婷精品久久二区二区蜜臂av| 亚洲三级小视频| 在线亚洲欧美专区二区| 日韩中文字幕区一区有砖一区| 欧美日韩高清一区二区不卡 | 日韩电影网1区2区| 日韩免费电影一区| 国产精品456| 亚洲日本丝袜连裤袜办公室| 欧美亚洲动漫精品| 免费观看91视频大全| 久久精品一区四区| 色综合天天综合给合国产| 亚洲电影一区二区三区| 欧美r级在线观看| 高清在线不卡av| 亚洲一卡二卡三卡四卡无卡久久 | 2024国产精品视频| 99久久精品费精品国产一区二区| 一区二区三区精品| 91精品国产综合久久福利| 国产高清不卡一区二区| 亚洲综合在线观看视频| 精品国产伦理网| 色吧成人激情小说| 日本不卡一二三区黄网| 国产天堂亚洲国产碰碰| 欧美午夜精品一区二区蜜桃| 九一九一国产精品| 夜夜精品视频一区二区 | 久久综合色之久久综合| 91麻豆国产自产在线观看| 日韩av电影一区| 国产精品夫妻自拍| 日韩免费看的电影| 91一区一区三区| 国内精品免费在线观看| 亚洲一区二区三区四区在线| 久久久久久免费毛片精品| 欧美性大战久久久| 成人一二三区视频| 狂野欧美性猛交blacked| 一区二区三区中文在线| 国产婷婷色一区二区三区 | 欧美视频三区在线播放| 国产一区二区91| 亚洲成人动漫在线免费观看| 国产精品私人影院| 日韩女优制服丝袜电影| 欧美日韩一区三区四区|