mirror of
https://github.com/clearlinux/kvmtool.git
synced 2026-09-05 13:11:44 +00:00
kvm tools: Fix reported RTC century and year
Commit 13d5097 ("kvm tools: Fix reported year in RTC emulation)
attempted to fix wrongly reported RTC year. However, as pointed out by
hpa the proper way to deal with this is to support the RTC century
field.
Suggested-by: H. Peter Anvin <hpa@zytor.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Ron Minnich <rminnich@gmail.com>
Cc: Asias He <asias.hejun@gmail.com>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Sasha Levin <levinsasha928@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
This commit is contained in:
committed by
Will Deacon
parent
f804841867
commit
97ed48382e
@@ -18,6 +18,7 @@
|
||||
#define RTC_DAY_OF_MONTH 0x07
|
||||
#define RTC_MONTH 0x08
|
||||
#define RTC_YEAR 0x09
|
||||
#define RTC_CENTURY 0x32
|
||||
|
||||
#define RTC_REG_A 0x0A
|
||||
#define RTC_REG_B 0x0B
|
||||
@@ -40,7 +41,6 @@ static bool cmos_ram_data_in(struct ioport *ioport, struct kvm *kvm, u16 port, v
|
||||
{
|
||||
struct tm *tm;
|
||||
time_t ti;
|
||||
int year;
|
||||
|
||||
time(&ti);
|
||||
|
||||
@@ -65,18 +65,24 @@ static bool cmos_ram_data_in(struct ioport *ioport, struct kvm *kvm, u16 port, v
|
||||
case RTC_MONTH:
|
||||
ioport__write8(data, bin2bcd(tm->tm_mon + 1));
|
||||
break;
|
||||
case RTC_YEAR:
|
||||
/*
|
||||
* The gmtime() function returns time since 1900. The CMOS
|
||||
* standard is time since 2000. If the year is < 100, do
|
||||
* nothing; if it is > 100, subtract 100; this is the best fit
|
||||
* with the twisted CMOS logic.
|
||||
*/
|
||||
year = tm->tm_year;
|
||||
if (year > 99)
|
||||
year -= 100;
|
||||
ioport__write8(data, bin2bcd(year));
|
||||
case RTC_YEAR: {
|
||||
int year;
|
||||
|
||||
year = tm->tm_year + 1900;
|
||||
|
||||
ioport__write8(data, bin2bcd(year % 100));
|
||||
|
||||
break;
|
||||
}
|
||||
case RTC_CENTURY: {
|
||||
int year;
|
||||
|
||||
year = tm->tm_year + 1900;
|
||||
|
||||
ioport__write8(data, bin2bcd(year / 100));
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ioport__write8(data, rtc.cmos_data[rtc.cmos_idx]);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user