diff options
author | dfr <dfr@FreeBSD.org> | 2001-10-04 15:24:52 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2001-10-04 15:24:52 +0000 |
commit | 7ed4fe75282315f1dcd2a52c1bf47fda743592b1 (patch) | |
tree | 3035b6b5aa42d57b6380faa8866a5fb24a3d6f66 | |
parent | 7af6b8b2fae46e60652451af01571c5edfb2b1c9 (diff) | |
download | FreeBSD-src-7ed4fe75282315f1dcd2a52c1bf47fda743592b1.zip FreeBSD-src-7ed4fe75282315f1dcd2a52c1bf47fda743592b1.tar.gz |
Fake the EFI runtime call GetTime.
-rw-r--r-- | sys/ia64/ia64/ski.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/sys/ia64/ia64/ski.c b/sys/ia64/ia64/ski.c index f7703a3..5965f0d 100644 --- a/sys/ia64/ia64/ski.c +++ b/sys/ia64/ia64/ski.c @@ -36,18 +36,45 @@ #include <machine/sal.h> #include <machine/md_var.h> +struct ssc_time { + int year; + int month; + int day; + int hour; + int minute; + int second; + int msec; + int wday; +}; + +#define SSC_GET_RTC 65 + +static u_int64_t +ssc(u_int64_t in0, u_int64_t in1, u_int64_t in2, u_int64_t in3, int which) +{ + register u_int64_t ret0 __asm("r8"); + + __asm __volatile("mov r15=%1\n\t" + "break 0x80001" + : "=r"(ret0) + : "r"(which), "r"(in0), "r"(in1), "r"(in2), "r"(in3)); + return ret0; +} + extern u_int64_t ski_fake_pal[]; // *not* a function decl extern void ia64_ski_init(void); extern u_int64_t ia64_pal_entry; static EFI_STATUS ski_fake_efi_proc(void); +static EFI_STATUS ski_fake_efi_get_time(EFI_TIME *time, + EFI_TIME_CAPABILITIES *caps); static EFI_RUNTIME_SERVICES ski_fake_efi = { { EFI_RUNTIME_SERVICES_SIGNATURE, EFI_RUNTIME_SERVICES_REVISION, 0, 0, 0 }, - (EFI_GET_TIME) ski_fake_efi_proc, + (EFI_GET_TIME) ski_fake_efi_get_time, (EFI_SET_TIME) ski_fake_efi_proc, (EFI_GET_WAKEUP_TIME) ski_fake_efi_proc, (EFI_SET_WAKEUP_TIME) ski_fake_efi_proc, @@ -64,6 +91,23 @@ static EFI_RUNTIME_SERVICES ski_fake_efi = { }; static EFI_STATUS +ski_fake_efi_get_time(EFI_TIME *time, EFI_TIME_CAPABILITIES *caps) +{ + struct ssc_time ssctime; + + ssc(ia64_tpa((vm_offset_t) &ssctime), 0, 0, 0, SSC_GET_RTC); + + time->Second = ssctime.second; + time->Minute = ssctime.minute; + time->Hour = ssctime.hour; + time->Day = ssctime.day; + time->Month = ssctime.month + 1; + time->Year = ssctime.year + 1900; + + return EFI_SUCCESS; +} + +static EFI_STATUS ski_fake_efi_proc(void) { return EFI_UNSUPPORTED; |