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 | |||||