Skip to content

Commit

Permalink
Merge duplicate code into vmx_find_dmar_paddr()
Browse files Browse the repository at this point in the history
  • Loading branch information
lxylxy123456 committed Dec 21, 2022
1 parent df3cfd7 commit d6d00d2
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 148 deletions.
1 change: 1 addition & 0 deletions xmhf/src/xmhf-core/include/xmhf-runtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ void xmhf_runtime_shutdown(VCPU *vcpu, struct regs *r);

//DMAP related functions
void vmx_dmar_zap(spa_t dmaraddrphys);
spa_t vmx_find_dmar_paddr(VTD_DMAR *dmar);
void vmx_eap_zap(void);

//----------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,82 +90,19 @@ static u32 vmx_eap_initialize_early(
spa_t vtd_pts_paddr, hva_t vtd_pts_vaddr,
spa_t vtd_ret_paddr, hva_t vtd_ret_vaddr)
{
ACPI_RSDP rsdp;
ACPI_RSDT rsdt;
u32 num_rsdtentries;
u32 rsdtentries[ACPI_MAX_RSDT_ENTRIES];
uintptr_t status;
bool status2 = false;
VTD_DMAR dmar;
u32 i, dmarfound = 0;
u32 i;
spa_t dmaraddrphys, remappingstructuresaddrphys;
spa_t rsdt_xsdt_spaddr = INVALID_SPADDR;
hva_t rsdt_xsdt_vaddr = INVALID_VADDR;

(void)vtd_pml4t_paddr;(void)vtd_pml4t_vaddr;(void)vtd_pdpt_paddr;(void)vtd_pdpt_vaddr;
(void)vtd_pdts_paddr;(void)vtd_pdts_vaddr;(void)vtd_pts_paddr;(void)vtd_pts_vaddr;

#ifndef __XMHF_VERIFICATION__
// zero out rsdp and rsdt structures
memset(&rsdp, 0, sizeof(ACPI_RSDP));
memset(&rsdt, 0, sizeof(ACPI_RSDT));
memset(&g_vtd_cap_sagaw_mgaw_nd, 0, sizeof(struct dmap_vmx_cap));

// get ACPI RSDP
status = xmhf_baseplatform_arch_x86_acpi_getRSDP(&rsdp);
HALT_ON_ERRORCOND(status != 0); // we need a valid RSDP to proceed
printf("%s: RSDP at %lx\n", __FUNCTION__, status);

// Use RSDT if it is ACPI v1, or use XSDT addr if it is ACPI v2
if (rsdp.revision == 0) // ACPI v1
{
printf("%s: ACPI v1\n", __FUNCTION__);
rsdt_xsdt_spaddr = rsdp.rsdtaddress;
}
else if (rsdp.revision == 0x2) // ACPI v2
{
printf("%s: ACPI v2\n", __FUNCTION__);
rsdt_xsdt_spaddr = (spa_t)rsdp.xsdtaddress;
}
else // Unrecognized ACPI version
{
printf("%s: ACPI unsupported version!\n", __FUNCTION__);
return 0;
}

// grab ACPI RSDT
// Note: in i386, <rsdt_xsdt_spaddr> should be in lower 4GB. So the conversion to vaddr is fine.
rsdt_xsdt_vaddr = (hva_t)rsdt_xsdt_spaddr;

xmhf_baseplatform_arch_flat_copy((u8 *)&rsdt, (u8 *)rsdt_xsdt_vaddr, sizeof(ACPI_RSDT));
printf("%s: RSDT at %lx, len=%u bytes, hdrlen=%u bytes\n",
__FUNCTION__, rsdt_xsdt_vaddr, rsdt.length, sizeof(ACPI_RSDT));

// get the RSDT entry list
num_rsdtentries = (rsdt.length - sizeof(ACPI_RSDT)) / sizeof(u32);
HALT_ON_ERRORCOND(num_rsdtentries < ACPI_MAX_RSDT_ENTRIES);
xmhf_baseplatform_arch_flat_copy((u8 *)&rsdtentries, (u8 *)(rsdt_xsdt_vaddr + sizeof(ACPI_RSDT)),
sizeof(rsdtentries[0]) * num_rsdtentries);
printf("%s: RSDT entry list at %lx, len=%u\n", __FUNCTION__,
(rsdt_xsdt_vaddr + sizeof(ACPI_RSDT)), num_rsdtentries);

// find the VT-d DMAR table in the list (if any)
for (i = 0; i < num_rsdtentries; i++)
{
xmhf_baseplatform_arch_flat_copy((u8 *)&dmar, (u8 *)(uintptr_t)rsdtentries[i], sizeof(VTD_DMAR));
if (dmar.signature == VTD_DMAR_SIGNATURE)
{
dmarfound = 1;
break;
}
}

// if no DMAR table, bail out
if (!dmarfound)
return 0;

dmaraddrphys = rsdtentries[i]; // DMAR table physical memory address;
printf("%s: DMAR at %08x\n", __FUNCTION__, dmaraddrphys);
dmaraddrphys = vmx_find_dmar_paddr(&dmar);

i = 0;
remappingstructuresaddrphys = dmaraddrphys + sizeof(VTD_DMAR);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -234,79 +234,16 @@ static u32 vmx_eap_initialize(
spa_t vtd_ret_paddr, hva_t vtd_ret_vaddr,
spa_t vtd_cet_paddr, hva_t vtd_cet_vaddr)
{
ACPI_RSDP rsdp;
ACPI_RSDT rsdt;
u32 num_rsdtentries;
u32 rsdtentries[ACPI_MAX_RSDT_ENTRIES];
uintptr_t status;
bool status2 = false;
VTD_DMAR dmar;
u32 i, dmarfound = 0;
u32 i;
spa_t dmaraddrphys, remappingstructuresaddrphys;
spa_t rsdt_xsdt_spaddr = INVALID_SPADDR;
hva_t rsdt_xsdt_vaddr = INVALID_VADDR;

#ifndef __XMHF_VERIFICATION__
// zero out rsdp and rsdt structures
memset(&rsdp, 0, sizeof(ACPI_RSDP));
memset(&rsdt, 0, sizeof(ACPI_RSDT));
memset(&g_vtd_cap_sagaw_mgaw_nd, 0, sizeof(struct dmap_vmx_cap));

// get ACPI RSDP
status = xmhf_baseplatform_arch_x86_acpi_getRSDP(&rsdp);
HALT_ON_ERRORCOND(status != 0); // we need a valid RSDP to proceed
printf("%s: RSDP at %lx\n", __FUNCTION__, status);

// Use RSDT if it is ACPI v1, or use XSDT addr if it is ACPI v2
if (rsdp.revision == 0) // ACPI v1
{
printf("%s: ACPI v1\n", __FUNCTION__);
rsdt_xsdt_spaddr = rsdp.rsdtaddress;
}
else if (rsdp.revision == 0x2) // ACPI v2
{
printf("%s: ACPI v2\n", __FUNCTION__);
rsdt_xsdt_spaddr = (spa_t)rsdp.xsdtaddress;
}
else // Unrecognized ACPI version
{
printf("%s: ACPI unsupported version!\n", __FUNCTION__);
return 0;
}

// grab ACPI RSDT
// Note: in i386, <rsdt_xsdt_spaddr> should be in lower 4GB. So the conversion to vaddr is fine.
rsdt_xsdt_vaddr = (hva_t)rsdt_xsdt_spaddr;

xmhf_baseplatform_arch_flat_copy((u8 *)&rsdt, (u8 *)rsdt_xsdt_vaddr, sizeof(ACPI_RSDT));
printf("%s: RSDT at %lx, len=%u bytes, hdrlen=%u bytes\n",
__FUNCTION__, rsdt_xsdt_vaddr, rsdt.length, sizeof(ACPI_RSDT));

// get the RSDT entry list
num_rsdtentries = (rsdt.length - sizeof(ACPI_RSDT)) / sizeof(u32);
HALT_ON_ERRORCOND(num_rsdtentries < ACPI_MAX_RSDT_ENTRIES);
xmhf_baseplatform_arch_flat_copy((u8 *)&rsdtentries, (u8 *)(rsdt_xsdt_vaddr + sizeof(ACPI_RSDT)),
sizeof(rsdtentries[0]) * num_rsdtentries);
printf("%s: RSDT entry list at %lx, len=%u\n", __FUNCTION__,
(rsdt_xsdt_vaddr + sizeof(ACPI_RSDT)), num_rsdtentries);

// find the VT-d DMAR table in the list (if any)
for (i = 0; i < num_rsdtentries; i++)
{
xmhf_baseplatform_arch_flat_copy((u8 *)&dmar, (u8 *)(uintptr_t)rsdtentries[i], sizeof(VTD_DMAR));
if (dmar.signature == VTD_DMAR_SIGNATURE)
{
dmarfound = 1;
break;
}
}

// if no DMAR table, bail out
if (!dmarfound)
return 0;

dmaraddrphys = rsdtentries[i]; // DMAR table physical memory address;
printf("%s: DMAR at %llx\n", __FUNCTION__, dmaraddrphys);
dmaraddrphys = vmx_find_dmar_paddr(&dmar);

i = 0;
remappingstructuresaddrphys = dmaraddrphys + sizeof(VTD_DMAR);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@

#if defined(__DRT__) || defined(__DMAP__)

// TODO: this macro is deprecated
// This macro is defined in xmhf-dmaprot.h. However when !__DMAP__ this header
// is not included. So define it here.
#define ACPI_MAX_RSDT_ENTRIES (256)

/* Size of ACPI DESCRIPTION_HEADER Fields */
#define ACPI_DESC_HEADER_SIZE 36

Expand Down Expand Up @@ -84,24 +89,18 @@ void vmx_dmar_zap(spa_t dmaraddrphys)
xmhf_baseplatform_arch_flat_writeu8(dmaraddrphys + ACPI_DESC_CHECKSUM_OFF, checksum);
}

#endif /* defined(__DRT__) || defined(__DMAP__) */

#if defined(__DRT__) && !defined(__DMAP__)

// This macro is defined in xmhf-dmaprot.h. However when !__DMAP__ this header
// is not included. So define it here.
#define ACPI_MAX_RSDT_ENTRIES (256)

void vmx_eap_zap(void)
/*
* Return the physical address of ACPI DMAR table. Return 0 if not found.
*/
spa_t vmx_find_dmar_paddr(VTD_DMAR *dmar)
{
ACPI_RSDP rsdp;
ACPI_RSDT rsdt;
u32 num_rsdtentries;
u32 rsdtentries[ACPI_MAX_RSDT_ENTRIES];
uintptr_t status;
VTD_DMAR dmar;
u32 i, dmarfound = 0;
spa_t dmaraddrphys, remappingstructuresaddrphys;
spa_t dmaraddrphys;
spa_t rsdt_xsdt_spaddr = INVALID_SPADDR;
hva_t rsdt_xsdt_vaddr = INVALID_VADDR;

Expand All @@ -128,7 +127,7 @@ void vmx_eap_zap(void)
else // Unrecognized ACPI version
{
printf("%s: ACPI unsupported version!\n", __FUNCTION__);
return;
return 0;
}

// grab ACPI RSDT
Expand All @@ -150,24 +149,33 @@ void vmx_eap_zap(void)
// find the VT-d DMAR table in the list (if any)
for (i = 0; i < num_rsdtentries; i++)
{
xmhf_baseplatform_arch_flat_copy((u8 *)&dmar, (u8 *)(uintptr_t)rsdtentries[i], sizeof(VTD_DMAR));
if (dmar.signature == VTD_DMAR_SIGNATURE)
xmhf_baseplatform_arch_flat_copy((u8 *)dmar, (u8 *)(uintptr_t)rsdtentries[i], sizeof(VTD_DMAR));
if (dmar->signature == VTD_DMAR_SIGNATURE)
{
HALT_ON_ERRORCOND(dmar->length >= ACPI_DESC_HEADER_SIZE);
dmarfound = 1;
break;
}
}

// if no DMAR table, bail out
if (!dmarfound)
return;
return 0;

dmaraddrphys = rsdtentries[i]; // DMAR table physical memory address;
printf("%s: DMAR at %08x\n", __FUNCTION__, dmaraddrphys);

i = 0;
remappingstructuresaddrphys = dmaraddrphys + sizeof(VTD_DMAR);
printf("%s: remapping structures at %08x\n", __FUNCTION__, remappingstructuresaddrphys);
return dmaraddrphys;
}

#endif /* defined(__DRT__) || defined(__DMAP__) */

#if defined(__DRT__) && !defined(__DMAP__)

void vmx_eap_zap(void)
{
VTD_DMAR dmar;
spa_t dmaraddrphys = vmx_find_dmar_paddr(&dmar);

// zap VT-d presence in ACPI table...
// TODO: we need to be a little elegant here. eventually need to setup
Expand Down
2 changes: 2 additions & 0 deletions xmhf/src/xmhf-core/xmhf-secureloader/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ OBJECTS_PRECOMPILED += ../xmhf-runtime/xmhf-dmaprot/arch/x86/svm/dmap-svm.o
OBJECTS_PRECOMPILED += ../xmhf-runtime/xmhf-dmaprot/arch/x86/vmx/dmap-vmx-earlyinit.o
OBJECTS_PRECOMPILED += ../xmhf-runtime/xmhf-dmaprot/arch/x86/vmx/dmap-vmx-internal-common.o
OBJECTS_PRECOMPILED += ../xmhf-runtime/xmhf-dmaprot/arch/x86/vmx/dmap-vmx-internal-earlyinit.o

OBJECTS_PRECOMPILED += ../xmhf-runtime/xmhf-startup/arch/x86/rntm-x86-dmap.o
endif

OBJECTS_PRECOMPILED += ../xmhf-runtime/xmhf-baseplatform/bplt-interface.o
Expand Down

0 comments on commit d6d00d2

Please sign in to comment.