mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-22 13:37:10 +00:00
dm: ptct: pass through PTCT ACPI Table
Pass through PTCT ACPI Table to the guest which wants to use PTCT. Now we assume the GPA of resources of the PTCT is equal to the HPA. Tracked-On: #5330 Signed-off-by: Qian Wang <qian1.wang@intel.com> Signed-off-by: Li Fei1 <fei1.li@intel.com>
This commit is contained in:
parent
f94ad6aef7
commit
c9d6565798
@ -89,6 +89,7 @@ bool stdio_in_use;
|
||||
bool lapic_pt;
|
||||
bool is_rtvm;
|
||||
bool pt_tpm2;
|
||||
bool pt_ptct;
|
||||
bool is_winvm;
|
||||
bool skip_pci_mem64bar_workaround = false;
|
||||
|
||||
|
@ -85,7 +85,8 @@
|
||||
#define FACS_OFFSET 0x3C0
|
||||
#define NHLT_OFFSET 0x400
|
||||
#define TPM2_OFFSET 0xC00
|
||||
#define DSDT_OFFSET 0xE40
|
||||
#define PTCT_OFFSET 0xF00
|
||||
#define DSDT_OFFSET 0x1100
|
||||
|
||||
#define ASL_TEMPLATE "dm.XXXXXXX"
|
||||
#define ASL_SUFFIX ".aml"
|
||||
@ -186,6 +187,11 @@ basl_fwrite_rsdt(FILE *fp, struct vmctx *ctx)
|
||||
EFPRINTF(fp, "[0004]\t\tACPI Table Address %u : %08X\n", num++,
|
||||
basl_acpi_base + TPM2_OFFSET);
|
||||
|
||||
if (pt_ptct) {
|
||||
EFPRINTF(fp, "[0004]\t\tACPI Table Address %u : %08X\n", num++,
|
||||
basl_acpi_base + PTCT_OFFSET);
|
||||
}
|
||||
|
||||
EFFLUSH(fp);
|
||||
|
||||
return 0;
|
||||
@ -228,6 +234,11 @@ basl_fwrite_xsdt(FILE *fp, struct vmctx *ctx)
|
||||
EFPRINTF(fp, "[0004]\t\tACPI Table Address %u : 00000000%08X\n", num++,
|
||||
basl_acpi_base + TPM2_OFFSET);
|
||||
|
||||
if (pt_ptct) {
|
||||
EFPRINTF(fp, "[0004]\t\tACPI Table Address %u : 00000000%08X\n", num++,
|
||||
basl_acpi_base + PTCT_OFFSET);
|
||||
}
|
||||
|
||||
EFFLUSH(fp);
|
||||
|
||||
return 0;
|
||||
@ -1064,6 +1075,41 @@ static struct {
|
||||
{ basl_fwrite_dsdt, DSDT_OFFSET, true }
|
||||
};
|
||||
|
||||
int create_and_inject_vptct(struct vmctx *ctx)
|
||||
{
|
||||
#define PTCT_NATIVE_FILE_PATH_IN_SOS "/sys/firmware/acpi/tables/PTCT"
|
||||
#define PTCT_BUF_LEN 0x200 /* Otherwise, need to modify DSDT_OFFSET corresponding */
|
||||
int native_ptct_fd;
|
||||
int rc;
|
||||
size_t native_ptct_len;
|
||||
size_t vptct_len;
|
||||
uint8_t buf[PTCT_BUF_LEN] = {0};
|
||||
|
||||
native_ptct_fd = open(PTCT_NATIVE_FILE_PATH_IN_SOS, O_RDONLY);
|
||||
if (native_ptct_fd < 0){
|
||||
pr_err("failed to open /sys/firmware/acpi/tables/PTCT !!!!! errno:%d\n", errno);
|
||||
return -1;
|
||||
}
|
||||
native_ptct_len = lseek(native_ptct_fd, 0, SEEK_END);
|
||||
if (native_ptct_len > PTCT_BUF_LEN) {
|
||||
pr_err("%s native_ptct_len = %d large than PTCT_BUF_LEN\n", __func__, native_ptct_len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
(void)lseek(native_ptct_fd, 0, SEEK_SET);
|
||||
rc = read(native_ptct_fd, buf, native_ptct_len);
|
||||
if (rc < native_ptct_len ){
|
||||
pr_err("Native PTCT is not fully read into buf!!!");
|
||||
return -1;
|
||||
}
|
||||
close(native_ptct_fd);
|
||||
|
||||
vptct_len = native_ptct_len;
|
||||
|
||||
memcpy(vm_map_gpa(ctx, ACPI_BASE + PTCT_OFFSET, vptct_len), buf, vptct_len);
|
||||
return 0;
|
||||
};
|
||||
|
||||
void
|
||||
acpi_table_enable(int num)
|
||||
{
|
||||
@ -1134,5 +1180,9 @@ acpi_build(struct vmctx *ctx, int ncpu)
|
||||
i++;
|
||||
}
|
||||
|
||||
if (pt_ptct) {
|
||||
create_and_inject_vptct(ctx);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -49,6 +49,7 @@ extern char *mac_seed;
|
||||
extern bool lapic_pt;
|
||||
extern bool is_rtvm;
|
||||
extern bool pt_tpm2;
|
||||
extern bool pt_ptct;
|
||||
extern bool is_winvm;
|
||||
|
||||
int vmexit_task_switch(struct vmctx *ctx, struct vhm_request *vhm_req,
|
||||
|
Loading…
Reference in New Issue
Block a user