On Tue, 4 Dec 2018 11:14:28 +0000 Julien Thierry <julien.thierry@xxxxxxx> wrote: > From: Sami Mujawar <sami.mujawar@xxxxxxx> > > Some software drivers check the VRT bit (BIT7) of Register D before > using the MC146818 RTC. Initialized the VRT bit in rtc__init() to > indicate that the RAM and time contents are valid. > > Signed-off-by: Sami Mujawar <sami.mujawar@xxxxxxx> > Signed-off-by: Julien Thierry <julien.thierry@xxxxxxx> Checked against the data sheet. Reviewed-by: Andre Przywara <andre.przywara@xxxxxxx> This is quite interesting: we build the RTC emulation unconditionally for every architecture, but don't expose it in the DT (for arm/arm64). The Linux driver can't even be configured for arm64. Interestingly it works if one pokes 0x70 and 0x71 directly in memory from a guest. Which sounds hackish (do we want that?), but fits more a less the firmware use case. We would just need to make sure it actually works correctly on ARM, since nobody tested this properly before. I guess EDK2 would just hardcode the address? Cheers, Andre. > --- > hw/rtc.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/hw/rtc.c b/hw/rtc.c > index 0649b5d..c1fa72f 100644 > --- a/hw/rtc.c > +++ b/hw/rtc.c > @@ -25,6 +25,11 @@ > #define RTC_REG_C 0x0C > #define RTC_REG_D 0x0D > > +/* > + * Register D Bits > + */ > +#define RTC_REG_D_VRT (1 << 7) > + > struct rtc_device { > u8 cmos_idx; > u8 cmos_data[128]; > @@ -140,6 +145,9 @@ int rtc__init(struct kvm *kvm) > return r; > } > > + /* Set the VRT bit in Register D to indicate valid RAM and > time */ > + rtc.cmos_data[RTC_REG_D] = RTC_REG_D_VRT; > + > return r; > } > dev_init(rtc__init);