Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/bhyve/rtc.c
Show All 34 Lines | |||||
#include <time.h> | #include <time.h> | ||||
#include <assert.h> | #include <assert.h> | ||||
#include <machine/vmm.h> | #include <machine/vmm.h> | ||||
#include <vmmapi.h> | #include <vmmapi.h> | ||||
#include "acpi.h" | #include "acpi.h" | ||||
#include "config.h" | |||||
#include "pci_lpc.h" | #include "pci_lpc.h" | ||||
#include "rtc.h" | #include "rtc.h" | ||||
#define IO_RTC 0x70 | #define IO_RTC 0x70 | ||||
#define RTC_LMEM_LSB 0x34 | #define RTC_LMEM_LSB 0x34 | ||||
#define RTC_LMEM_MSB 0x35 | #define RTC_LMEM_MSB 0x35 | ||||
#define RTC_HMEM_LSB 0x5b | #define RTC_HMEM_LSB 0x5b | ||||
#define RTC_HMEM_SB 0x5c | #define RTC_HMEM_SB 0x5c | ||||
#define RTC_HMEM_MSB 0x5d | #define RTC_HMEM_MSB 0x5d | ||||
#define m_64KB (64*1024) | #define m_64KB (64*1024) | ||||
#define m_16MB (16*1024*1024) | #define m_16MB (16*1024*1024) | ||||
#define m_4GB (4ULL*1024*1024*1024) | #define m_4GB (4ULL*1024*1024*1024) | ||||
/* | /* | ||||
* Returns the current RTC time as number of seconds since 00:00:00 Jan 1, 1970 | * Returns the current RTC time as number of seconds since 00:00:00 Jan 1, 1970 | ||||
*/ | */ | ||||
static time_t | static time_t | ||||
rtc_time(struct vmctx *ctx, int use_localtime) | rtc_time(struct vmctx *ctx) | ||||
{ | { | ||||
struct tm tm; | struct tm tm; | ||||
time_t t; | time_t t; | ||||
time(&t); | time(&t); | ||||
if (use_localtime) { | if (get_config_bool_default("rtc.use_localtime", true)) { | ||||
localtime_r(&t, &tm); | localtime_r(&t, &tm); | ||||
t = timegm(&tm); | t = timegm(&tm); | ||||
} | } | ||||
return (t); | return (t); | ||||
} | } | ||||
void | void | ||||
rtc_init(struct vmctx *ctx, int use_localtime) | rtc_init(struct vmctx *ctx) | ||||
{ | { | ||||
size_t himem; | size_t himem; | ||||
size_t lomem; | size_t lomem; | ||||
int err; | int err; | ||||
/* XXX init diag/reset code/equipment/checksum ? */ | /* XXX init diag/reset code/equipment/checksum ? */ | ||||
/* | /* | ||||
Show All 11 Lines | rtc_init(struct vmctx *ctx) | ||||
himem = vm_get_highmem_size(ctx) / m_64KB; | himem = vm_get_highmem_size(ctx) / m_64KB; | ||||
err = vm_rtc_write(ctx, RTC_HMEM_LSB, himem); | err = vm_rtc_write(ctx, RTC_HMEM_LSB, himem); | ||||
assert(err == 0); | assert(err == 0); | ||||
err = vm_rtc_write(ctx, RTC_HMEM_SB, himem >> 8); | err = vm_rtc_write(ctx, RTC_HMEM_SB, himem >> 8); | ||||
assert(err == 0); | assert(err == 0); | ||||
err = vm_rtc_write(ctx, RTC_HMEM_MSB, himem >> 16); | err = vm_rtc_write(ctx, RTC_HMEM_MSB, himem >> 16); | ||||
assert(err == 0); | assert(err == 0); | ||||
err = vm_rtc_settime(ctx, rtc_time(ctx, use_localtime)); | err = vm_rtc_settime(ctx, rtc_time(ctx)); | ||||
assert(err == 0); | assert(err == 0); | ||||
} | } | ||||
static void | static void | ||||
rtc_dsdt(void) | rtc_dsdt(void) | ||||
{ | { | ||||
dsdt_line(""); | dsdt_line(""); | ||||
Show All 19 Lines |