⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dom_fw_common.c

📁 xen虚拟机源代码安装包
💻 C
📖 第 1 页 / 共 2 页
字号:
	 */	fadt->pm1_event_length = 4;	fadt->xpm1a_event_block.space_id = ACPI_ADR_SPACE_SYSTEM_MEMORY;	fadt->xpm1a_event_block.bit_width = 8;	fadt->xpm1a_event_block.address = ACPI_TABLE_MPA(pm1a_event_block);	fadt->pm1_control_length = 1;	fadt->xpm1a_control_block.space_id = ACPI_ADR_SPACE_SYSTEM_MEMORY;	fadt->xpm1a_control_block.bit_width = 8;	fadt->xpm1a_control_block.address = ACPI_TABLE_MPA(pm1a_control_block);	fadt->pm_timer_length = 4;	fadt->xpm_timer_block.space_id = ACPI_ADR_SPACE_SYSTEM_MEMORY;	fadt->xpm_timer_block.bit_width = 8;	fadt->xpm_timer_block.address = ACPI_TABLE_MPA(pm_timer_block);	fadt->header.checksum = -acpi_tb_checksum((u8*)fadt,						  fadt->header.length);	/* setup RSDP */	memcpy(rsdp->signature, ACPI_SIG_RSDP, strlen(ACPI_SIG_RSDP));	memcpy(rsdp->oem_id, "XEN", 3);	rsdp->revision = 2; /* ACPI 2.0 includes XSDT */	rsdp->length = sizeof(struct acpi_table_rsdp);	rsdp->xsdt_physical_address = ACPI_TABLE_MPA(xsdt);	rsdp->checksum = -acpi_tb_checksum((u8*)rsdp,					   ACPI_RSDP_CHECKSUM_LENGTH);	rsdp->extended_checksum = -acpi_tb_checksum((u8*)rsdp, rsdp->length);	/* setup DSDT with trivial namespace. */ 	memcpy(dsdt->signature, ACPI_SIG_DSDT, strlen(ACPI_SIG_DSDT));	dsdt->revision = 1;	memcpy(dsdt->oem_id, "XEN", 3);	memcpy(dsdt->oem_table_id, "Xen/ia64", 8);	memcpy(dsdt->asl_compiler_id, "XEN", 3);	dsdt->asl_compiler_revision = xen_ia64_version(d);	/* Trivial namespace, avoids ACPI CA complaints */	tables->aml[0] = 0x10; /* Scope */	tables->aml[1] = 0x40; /* length/offset to next object (patched) */	tables->aml[2] = 0x00;	memcpy(&tables->aml[3], "_SB_", 4);	/* The processor object isn't absolutely necessary, revist for SMP */	aml_len = 7;	for (i = 0; i < 3; i++) {		unsigned char *p = tables->aml + aml_len;		p[0] = 0x5b; /* processor object */		p[1] = 0x83;		p[2] = 0x0b; /* next */		p[3] = 'C';		p[4] = 'P';		snprintf ((char *)p + 5, 3, "%02x", i);		if (i < 16)			p[5] = 'U';		p[7] = i;	/* acpi_id */		p[8] = 0;	/* pblk_addr */		p[9] = 0;		p[10] = 0;		p[11] = 0;		p[12] = 0;	/* pblk_len */		aml_len += 13;	}	tables->aml[1] = 0x40 + ((aml_len - 1) & 0x0f);	tables->aml[2] = (aml_len - 1) >> 4;	dsdt->length = sizeof(struct acpi_table_header) + aml_len;	dsdt->checksum = -acpi_tb_checksum((u8*)dsdt, dsdt->length);	/* setup MADT */	memcpy(madt->header.signature, ACPI_SIG_MADT,	       sizeof(madt->header.signature));	madt->header.revision = 2;	memcpy(madt->header.oem_id, "XEN", 3);	memcpy(madt->header.oem_table_id, "Xen/ia64", 8);	memcpy(madt->header.asl_compiler_id, "XEN", 3);	madt->header.asl_compiler_revision = xen_ia64_version(d);	/* An LSAPIC entry describes a CPU.  */	nbr_cpus = 0;	for (i = 0; i < MAX_VIRT_CPUS; i++) {		lsapic[i].header.type = ACPI_MADT_LSAPIC;		lsapic[i].header.length = sizeof(struct acpi_table_lsapic);		lsapic[i].acpi_id = i;		lsapic[i].id = i;		lsapic[i].eid = 0;		if (xen_ia64_is_vcpu_allocated(d, i)) {			lsapic[i].flags.enabled = 1;			nbr_cpus++;		}	}	madt->header.length = sizeof(struct acpi_table_madt) +	                      nbr_cpus * sizeof(struct acpi_table_lsapic);	madt->header.checksum = -acpi_tb_checksum((u8*)madt,						  madt->header.length);	return;}intefi_mdt_cmp(const void *a, const void *b){	const efi_memory_desc_t *x = a, *y = b;	if (x->phys_addr > y->phys_addr)		return 1;	if (x->phys_addr < y->phys_addr)		return -1;	/* num_pages == 0 is allowed. */	if (x->num_pages > y->num_pages)		return 1;	if (x->num_pages < y->num_pages)		return -1;	return 0;}intdom_fw_init(domain_t *d,	    uint64_t brkimm,            struct xen_ia64_boot_param *bp,            struct fw_tables *tables,            unsigned long hypercalls_imva,            unsigned long maxmem){	unsigned long pfn;	unsigned char checksum;	char *cp;	int num_mds, i;	int fpswa_supported = 0;	/* Caller must zero-clear fw_tables */	/* EFI systab.  */	tables->efi_systab.hdr.signature = EFI_SYSTEM_TABLE_SIGNATURE;	tables->efi_systab.hdr.revision  = ((1 << 16) | 00); /* EFI 1.00 */	tables->efi_systab.hdr.headersize = sizeof(tables->efi_systab.hdr);	memcpy(tables->fw_vendor,FW_VENDOR,sizeof(FW_VENDOR));	tables->efi_systab.fw_vendor = FW_FIELD_MPA(fw_vendor);	tables->efi_systab.fw_revision = 1;	tables->efi_systab.runtime = (void *)FW_FIELD_MPA(efi_runtime);	tables->efi_systab.nr_tables = NUM_EFI_SYS_TABLES;	tables->efi_systab.tables = FW_FIELD_MPA(efi_tables);	/* EFI runtime.  */	tables->efi_runtime.hdr.signature = EFI_RUNTIME_SERVICES_SIGNATURE;	tables->efi_runtime.hdr.revision = EFI_RUNTIME_SERVICES_REVISION;	tables->efi_runtime.hdr.headersize = sizeof(tables->efi_runtime.hdr);	pfn = 0;	EFI_HYPERCALL_PATCH(get_time,EFI_GET_TIME);	EFI_HYPERCALL_PATCH(set_time,EFI_SET_TIME);	EFI_HYPERCALL_PATCH(get_wakeup_time,EFI_GET_WAKEUP_TIME);	EFI_HYPERCALL_PATCH(set_wakeup_time,EFI_SET_WAKEUP_TIME);	EFI_HYPERCALL_PATCH(set_virtual_address_map,	                    EFI_SET_VIRTUAL_ADDRESS_MAP);	EFI_HYPERCALL_PATCH(get_variable,EFI_GET_VARIABLE);	EFI_HYPERCALL_PATCH(get_next_variable,EFI_GET_NEXT_VARIABLE);	EFI_HYPERCALL_PATCH(set_variable,EFI_SET_VARIABLE);	EFI_HYPERCALL_PATCH(get_next_high_mono_count,	                    EFI_GET_NEXT_HIGH_MONO_COUNT);	EFI_HYPERCALL_PATCH(reset_system,EFI_RESET_SYSTEM);	/* System tables.  */	tables->efi_tables[0].guid = SAL_SYSTEM_TABLE_GUID;	tables->efi_tables[0].table = FW_FIELD_MPA(sal_systab);	for (i = 1; i < NUM_EFI_SYS_TABLES; i++) {		tables->efi_tables[i].guid = NULL_GUID;		tables->efi_tables[i].table = 0;	}	if (xen_ia64_is_dom0(d)) {		efi_systable_init_dom0(tables);	} else {		efi_systable_init_domu(tables);	}	/* fill in the SAL system table: */	memcpy(tables->sal_systab.signature, "SST_", 4);	tables->sal_systab.size = sizeof(tables->sal_systab);	tables->sal_systab.sal_rev_minor = 1;	tables->sal_systab.sal_rev_major = 0;	tables->sal_systab.entry_count = 2;	memcpy((char *)tables->sal_systab.oem_id, "Xen/ia64", 8);	memcpy((char *)tables->sal_systab.product_id, "Xen/ia64", 8);	/* PAL entry point: */	tables->sal_ed.type = SAL_DESC_ENTRY_POINT;	tables->sal_ed.pal_proc = FW_HYPERCALL_PAL_CALL_PADDR;	dom_fw_pal_hypercall_patch(brkimm, tables->sal_ed.pal_proc,				   hypercalls_imva);	/* SAL entry point.  */	tables->sal_ed.sal_proc = FW_HYPERCALL_SAL_CALL_PADDR;	dom_fw_hypercall_patch(brkimm, tables->sal_ed.sal_proc,	                       FW_HYPERCALL_SAL_CALL, 1, hypercalls_imva);	tables->sal_ed.gp = 0;  /* will be ignored */	/* Fill an AP wakeup descriptor.  */	tables->sal_wakeup.type = SAL_DESC_AP_WAKEUP;	tables->sal_wakeup.mechanism = IA64_SAL_AP_EXTERNAL_INT;	tables->sal_wakeup.vector = XEN_SAL_BOOT_RENDEZ_VEC;	/* Compute checksum.  */	checksum = 0;	for (cp = (char *)&tables->sal_systab;	     cp < (char *)&tables->fpswa_inf;	     ++cp)		checksum += *cp;	tables->sal_systab.checksum = -checksum;	/* SAL return point.  */	dom_fw_hypercall_patch(brkimm, FW_HYPERCALL_SAL_RETURN_PADDR,	                       FW_HYPERCALL_SAL_RETURN, 0, hypercalls_imva);	/* Fill in the FPSWA interface: */	if (!xen_ia64_fpswa_revision(d, &tables->fpswa_inf.revision)) {		fpswa_supported = 1;		dom_fpswa_hypercall_patch(brkimm, hypercalls_imva);		tables->fpswa_inf.fpswa = 			(void *)FW_HYPERCALL_FPSWA_ENTRY_PADDR;	}	tables->num_mds = 0;	/* hypercall patches live here, masquerade as reserved PAL memory */	xen_ia64_efi_make_md(&tables->efi_memmap[tables->num_mds],			     EFI_PAL_CODE, EFI_MEMORY_WB | EFI_MEMORY_RUNTIME,			     FW_HYPERCALL_BASE_PADDR, FW_HYPERCALL_END_PADDR);	tables->num_mds++;	/* Create dom0/domu md entry for fw and cpi tables area.  */	xen_ia64_efi_make_md(&tables->efi_memmap[tables->num_mds],			     EFI_ACPI_MEMORY_NVS,			     EFI_MEMORY_WB | EFI_MEMORY_RUNTIME,			     FW_ACPI_BASE_PADDR, FW_ACPI_END_PADDR);	tables->num_mds++;	xen_ia64_efi_make_md(&tables->efi_memmap[tables->num_mds],			     EFI_RUNTIME_SERVICES_DATA,			     EFI_MEMORY_WB | EFI_MEMORY_RUNTIME,			     FW_TABLES_BASE_PADDR,			     tables->fw_tables_end_paddr);	tables->num_mds++;	if (!xen_ia64_is_dom0(d) || xen_ia64_is_running_on_sim(d)) {		/* DomU (or hp-ski).		   Create a continuous memory area.  */		/* kludge: bp->efi_memmap is used to pass memmap_info		 * page's pfn and number of pages to reserve. 		 * Currently the following pages must be reserved.		 * memmap info page, start info page, xenstore page		 * and console page.		 * see ia64_setup_memmap() @ xc_dom_boot.c		 */		num_mds = complete_domu_memmap(d, tables, maxmem,					       XEN_IA64_MEMMAP_INFO_PFN(bp),					       XEN_IA64_MEMMAP_INFO_NUM_PAGES(bp));	} else {		/* Dom0.		   We must preserve ACPI data from real machine,		   as well as IO areas.  */		num_mds = complete_dom0_memmap(d, tables);	}	if (num_mds < 0)		return num_mds;	BUG_ON(num_mds != tables->num_mds);	/* Display memmap.  */	for (i = 0 ; i < tables->num_mds; i++)		print_md(&tables->efi_memmap[i]);	/* Fill boot_param  */	bp->efi_systab = FW_FIELD_MPA(efi_systab);	bp->efi_memmap = FW_FIELD_MPA(efi_memmap);	bp->efi_memmap_size = tables->num_mds * sizeof(efi_memory_desc_t);	bp->efi_memdesc_size = sizeof(efi_memory_desc_t);	bp->efi_memdesc_version = EFI_MEMDESC_VERSION;	bp->command_line = 0;	bp->console_info.num_cols = 80;	bp->console_info.num_rows = 25;	bp->console_info.orig_x = 0;	bp->console_info.orig_y = 24;	if (fpswa_supported)		bp->fpswa = FW_FIELD_MPA(fpswa_inf);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -