summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2001-10-04 15:24:52 +0000
committerdfr <dfr@FreeBSD.org>2001-10-04 15:24:52 +0000
commit7ed4fe75282315f1dcd2a52c1bf47fda743592b1 (patch)
tree3035b6b5aa42d57b6380faa8866a5fb24a3d6f66
parent7af6b8b2fae46e60652451af01571c5edfb2b1c9 (diff)
downloadFreeBSD-src-7ed4fe75282315f1dcd2a52c1bf47fda743592b1.zip
FreeBSD-src-7ed4fe75282315f1dcd2a52c1bf47fda743592b1.tar.gz
Fake the EFI runtime call GetTime.
-rw-r--r--sys/ia64/ia64/ski.c46
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;
OpenPOWER on IntegriCloud