Skip to content

Commit

Permalink
dm: pm: add s3 support for an User VM with elf/bzImage
Browse files Browse the repository at this point in the history
For an elf-loaded or beImage-loaded User VM, acrn-dm is responsible for
handling s3 related matters.

After resume from S3, acrn-dm should read waking_vector and set related
registers to make guest to resume.

Tracked-On: projectacrn#8536
Signed-off-by: Haiwei Li <[email protected]>
  • Loading branch information
haiwei-li committed Jun 25, 2024
1 parent a9c016e commit 34ec27e
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 1 deletion.
27 changes: 26 additions & 1 deletion devicemodel/core/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -742,6 +742,7 @@ vm_system_reset(struct vmctx *ctx)
static void
vm_suspend_resume(struct vmctx *ctx)
{
struct acrn_vcpu_regs bsp_regs;
/*
* If we get warm reboot request, we don't want to exit the
* vcpu_loop/vm_loop/mevent_loop. So we do:
Expand All @@ -764,8 +765,32 @@ vm_suspend_resume(struct vmctx *ctx)
vm_reset_watchdog(ctx);
vm_reset(ctx);

bsp_regs = ctx->bsp_regs;
/* for bzImage or elf */
if (!ovmf_loaded) {
uint32_t *guest_wakeup_vec32;
/* 64BIT_WAKE_SUPPORTED_F is not set */
guest_wakeup_vec32 = paddr_guest2host(ctx,
get_acpi_wakingvector_offset(),
get_acpi_wakingvector_length());
/* set the BSP waking vector */
bsp_regs.vcpu_regs.cs_sel = (uint16_t)((*guest_wakeup_vec32 >> 4U) & 0xFFFFU);
bsp_regs.vcpu_regs.cs_base = bsp_regs.vcpu_regs.cs_sel << 4U;
/* real mode code segment */
bsp_regs.vcpu_regs.cs_ar = 0x009FU;
bsp_regs.vcpu_regs.cs_limit = 0xFFFFU;
bsp_regs.vcpu_regs.rip = 0x0U;
/* CR0_ET | CR0_NE */
bsp_regs.vcpu_regs.cr0 = 0x30;
/* real mode gdt */
bsp_regs.vcpu_regs.gdt.limit = 0xFFFFU;
bsp_regs.vcpu_regs.gdt.base = 0UL;
/* real mode idt */
bsp_regs.vcpu_regs.idt.limit = 0xFFFFU;
bsp_regs.vcpu_regs.idt.base = 0UL;
}
/* set the BSP init state */
vm_set_vcpu_regs(ctx, &ctx->bsp_regs);
vm_set_vcpu_regs(ctx, &bsp_regs);
vm_run(ctx);
}

Expand Down
16 changes: 16 additions & 0 deletions devicemodel/hw/platform/acpi/acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@
#define RTCT_OFFSET 0xF00
#define DSDT_OFFSET 0x1100

/* Define the byte offset and byte length in FACS table */
#define WAKING_VECTOR_OFFSET 12
#define WAKING_VECTOR_LEN 4

#define ASL_TEMPLATE "dm.XXXXXXX"
#define ASL_SUFFIX ".aml"

Expand Down Expand Up @@ -1112,6 +1116,18 @@ get_acpi_table_length(void)
return ACPI_LENGTH;
}

uint32_t
get_acpi_wakingvector_offset(void)
{
return basl_acpi_base + FACS_OFFSET + WAKING_VECTOR_OFFSET;
}

uint32_t
get_acpi_wakingvector_length(void)
{
return WAKING_VECTOR_LEN;
}

int
get_default_iasl_compiler(void)
{
Expand Down
2 changes: 2 additions & 0 deletions devicemodel/include/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ struct acpi_madt_local_apic {
void acpi_table_enable(int num);
uint32_t get_acpi_base(void);
uint32_t get_acpi_table_length(void);
uint32_t get_acpi_wakingvector_offset(void);
uint32_t get_acpi_wakingvector_length(void);

struct vmctx;

Expand Down

0 comments on commit 34ec27e

Please sign in to comment.