mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
Both ROMBIOS and SeaBIOS (with CONFIG_QEMU=y, as we build it) blindly
assume availability of this field (at its conventional index 0x32); OVMF
at least has code to inspect FADT. Hence we ought to have supported it
virtually forever.
As the index is beyond RTC_CMOS_SIZE, leverage the padding field in
struct hvm_hw_rtc to hold its value. Update the field only when involved
values are valid BCD century specifiers. Otherwise (for VMs migrated in
from an older hypervisor) leave handling to the DM.
This makes the Linux rtc-cmos driver report y3k compatibility.
In the new rtc_check(), besides checking the new fields also check the
pre-existing pad0 field.
While extending xen-hvmctx.c:dump_rtc() also add RTC offset there.
Fixes: 4ca1612143 ("[HVM] Move RTC emulation into the hypervisor")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Roger Pau Monné <roger@xenproject.org>
165 lines
4.9 KiB
C
165 lines
4.9 KiB
C
/* SPDX-License-Identifier: LGPL-2.1-only */
|
|
/*
|
|
* Copyright (c) 2004, Intel Corporation.
|
|
* Copyright (c) 2006, Keir Fraser, XenSource Inc.
|
|
*/
|
|
|
|
#include "acpi2_0.h"
|
|
#include "../config.h"
|
|
|
|
/*
|
|
* Firmware ACPI Control Structure (FACS).
|
|
*/
|
|
|
|
struct acpi_20_facs Facs = {
|
|
.signature = ACPI_2_0_FACS_SIGNATURE,
|
|
.length = sizeof(struct acpi_20_facs),
|
|
.version = ACPI_2_0_FACS_VERSION
|
|
};
|
|
|
|
|
|
/*
|
|
* Fixed ACPI Description Table (FADT).
|
|
*/
|
|
|
|
/*
|
|
* These values must match register definitions in struct hvm_hw_acpi
|
|
* (in xen/include/public/arch-x86/hvm/save.h).
|
|
*/
|
|
#define ACPI_PM1A_EVT_BLK_BIT_WIDTH 0x20
|
|
#define ACPI_PM1A_EVT_BLK_BIT_OFFSET 0x00
|
|
#define ACPI_PM1A_CNT_BLK_BIT_WIDTH 0x10
|
|
#define ACPI_PM1A_CNT_BLK_BIT_OFFSET 0x00
|
|
#define ACPI_PM_TMR_BLK_BIT_WIDTH 0x20
|
|
#define ACPI_PM_TMR_BLK_BIT_OFFSET 0x00
|
|
|
|
#define CMOS_CENTURY 0x32 /* Conventional index used also without ACPI */
|
|
|
|
struct acpi_fadt Fadt = {
|
|
.header = {
|
|
.signature = ACPI_FADT_SIGNATURE,
|
|
.oem_id = ACPI_OEM_ID,
|
|
.oem_table_id = ACPI_OEM_TABLE_ID,
|
|
.oem_revision = ACPI_OEM_REVISION,
|
|
.creator_id = ACPI_CREATOR_ID,
|
|
.creator_revision = ACPI_CREATOR_REVISION
|
|
},
|
|
|
|
.sci_int = 9,
|
|
|
|
.pm1a_evt_blk = ACPI_PM1A_EVT_BLK_ADDRESS_V1,
|
|
.pm1a_cnt_blk = ACPI_PM1A_CNT_BLK_ADDRESS_V1,
|
|
.pm_tmr_blk = ACPI_PM_TMR_BLK_ADDRESS_V1,
|
|
.gpe0_blk = ACPI_GPE0_BLK_ADDRESS_V1,
|
|
.pm1_evt_len = ACPI_PM1A_EVT_BLK_BIT_WIDTH / 8,
|
|
.pm1_cnt_len = ACPI_PM1A_CNT_BLK_BIT_WIDTH / 8,
|
|
.pm_tmr_len = ACPI_PM_TMR_BLK_BIT_WIDTH / 8,
|
|
.gpe0_blk_len = ACPI_GPE0_BLK_LEN_V1,
|
|
|
|
.p_lvl2_lat = 0x0fff, /* >100, means we do not support C2 state */
|
|
.p_lvl3_lat = 0x0fff, /* >1000, means we do not support C3 state */
|
|
.flags = (ACPI_PROC_C1 |
|
|
ACPI_WBINVD |
|
|
ACPI_FIX_RTC | ACPI_TMR_VAL_EXT |
|
|
ACPI_USE_PLATFORM_CLOCK),
|
|
|
|
.reset_reg = {
|
|
.address_space_id = ACPI_SYSTEM_IO,
|
|
.register_bit_width = 8, /* *must* be 8 */
|
|
.register_bit_offset = 0, /* *must* be 0 */
|
|
.address = 0xcf9
|
|
},
|
|
.reset_value = 6,
|
|
|
|
.x_pm1a_evt_blk = {
|
|
.address_space_id = ACPI_SYSTEM_IO,
|
|
.register_bit_width = ACPI_PM1A_EVT_BLK_BIT_WIDTH,
|
|
.register_bit_offset = ACPI_PM1A_EVT_BLK_BIT_OFFSET,
|
|
.address = ACPI_PM1A_EVT_BLK_ADDRESS_V1,
|
|
},
|
|
|
|
.x_pm1a_cnt_blk = {
|
|
.address_space_id = ACPI_SYSTEM_IO,
|
|
.register_bit_width = ACPI_PM1A_CNT_BLK_BIT_WIDTH,
|
|
.register_bit_offset = ACPI_PM1A_CNT_BLK_BIT_OFFSET,
|
|
.address = ACPI_PM1A_CNT_BLK_ADDRESS_V1,
|
|
},
|
|
|
|
.x_pm_tmr_blk = {
|
|
.address_space_id = ACPI_SYSTEM_IO,
|
|
.register_bit_width = ACPI_PM_TMR_BLK_BIT_WIDTH,
|
|
.register_bit_offset = ACPI_PM_TMR_BLK_BIT_OFFSET,
|
|
.address = ACPI_PM_TMR_BLK_ADDRESS_V1,
|
|
},
|
|
|
|
.century = CMOS_CENTURY,
|
|
};
|
|
|
|
struct acpi_20_rsdt Rsdt = {
|
|
.header = {
|
|
.signature = ACPI_2_0_RSDT_SIGNATURE,
|
|
.length = sizeof(struct acpi_header),
|
|
.revision = ACPI_2_0_RSDT_REVISION,
|
|
.oem_id = ACPI_OEM_ID,
|
|
.oem_table_id = ACPI_OEM_TABLE_ID,
|
|
.oem_revision = ACPI_OEM_REVISION,
|
|
.creator_id = ACPI_CREATOR_ID,
|
|
.creator_revision = ACPI_CREATOR_REVISION
|
|
}
|
|
};
|
|
|
|
struct acpi_20_xsdt Xsdt = {
|
|
.header = {
|
|
.signature = ACPI_2_0_XSDT_SIGNATURE,
|
|
.length = sizeof(struct acpi_header),
|
|
.revision = ACPI_2_0_XSDT_REVISION,
|
|
.oem_id = ACPI_OEM_ID,
|
|
.oem_table_id = ACPI_OEM_TABLE_ID,
|
|
.oem_revision = ACPI_OEM_REVISION,
|
|
.creator_id = ACPI_CREATOR_ID,
|
|
.creator_revision = ACPI_CREATOR_REVISION
|
|
}
|
|
};
|
|
|
|
|
|
struct acpi_20_rsdp Rsdp = {
|
|
.signature = ACPI_2_0_RSDP_SIGNATURE,
|
|
.oem_id = ACPI_OEM_ID,
|
|
.revision = ACPI_2_0_RSDP_REVISION,
|
|
.length = sizeof(struct acpi_20_rsdp)
|
|
};
|
|
|
|
#define ACPI_WAET_RTC_NO_ACK (1<<0) /* RTC requires no int acknowledge */
|
|
#define ACPI_WAET_TIMER_ONE_READ (1<<1) /* PM timer requires only one read */
|
|
|
|
/*
|
|
* The state of the RTC flag getting passed to the guest must be in
|
|
* sync with the mode selection in the hypervisor RTC emulation code.
|
|
*/
|
|
#define ACPI_WAET_FLAGS (ACPI_WAET_RTC_NO_ACK | \
|
|
ACPI_WAET_TIMER_ONE_READ)
|
|
|
|
struct acpi_20_waet Waet = {
|
|
.header = {
|
|
.signature = ACPI_2_0_WAET_SIGNATURE,
|
|
.length = sizeof(struct acpi_20_waet),
|
|
.revision = ACPI_2_0_WAET_REVISION,
|
|
.oem_id = ACPI_OEM_ID,
|
|
.oem_table_id = ACPI_OEM_TABLE_ID,
|
|
.oem_revision = ACPI_OEM_REVISION,
|
|
.creator_id = ACPI_CREATOR_ID,
|
|
.creator_revision = ACPI_CREATOR_REVISION
|
|
},
|
|
.flags = ACPI_WAET_FLAGS
|
|
};
|
|
|
|
/*
|
|
* Local variables:
|
|
* mode: C
|
|
* c-file-style: "BSD"
|
|
* c-basic-offset: 4
|
|
* tab-width: 4
|
|
* indent-tabs-mode: nil
|
|
* End:
|
|
*/
|