Message ID | 1579117007-7565-5-git-send-email-Filip.Bozuta@rt-rk.com |
---|---|
State | New |
Headers | show |
Series | linux-user: Add support for real time clock and | expand |
Le 15/01/2020 à 20:36, Filip Bozuta a écrit : > This patch implements functionalities of following ioctls: > > RTC_WKALM_SET, RTC_WKALM_GET - Getting/Setting wakeup alarm > > Some RTCs support a more powerful alarm interface, using these > ioctls to read or write the RTC's alarm time (respectively) > with this structure: > > struct rtc_wkalrm { > unsigned char enabled; > unsigned char pending; > struct rtc_time time; > }; > > The enabled flag is used to enable or disable the alarm > interrupt, or to read its current status; when using these > calls, RTC_AIE_ON and RTC_AIE_OFF are not used. The pending > flag is used by RTC_WKALM_RD to report a pending interrupt > (so it's mostly useless on Linux, except when talking to the > RTC managed by EFI firmware). The time field is as used with > RTC_ALM_READ and RTC_ALM_SET except that the tm_mday, tm_mon, > and tm_year fields are also valid. A pointer to this structure > should be passed as the third ioctl's argument. > > Implementation notes: > > All ioctls in this patch have a pointer to a structure > rtc_wkalrm as their third argument. That is the reason why > corresponding definition is added in linux-user/syscall_types.h. > Since all elements of this structure are either of type > 'unsigned char' or 'struct rtc_time' (that was covered in one > of previous patches), the rest of the implementation is > straightforward. > > Reviewed-by: Laurent Vivier <laurent@vivier.eu> > Signed-off-by: Filip Bozuta <Filip.Bozuta@rt-rk.com> > --- > linux-user/ioctls.h | 2 ++ > linux-user/syscall_defs.h | 2 ++ > linux-user/syscall_types.h | 5 +++++ > 3 files changed, 9 insertions(+) > > diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h > index accbdee..b09396e 100644 > --- a/linux-user/ioctls.h > +++ b/linux-user/ioctls.h > @@ -85,6 +85,8 @@ > IOCTL(RTC_IRQP_SET, IOC_W, TYPE_ULONG) > IOCTL(RTC_EPOCH_READ, IOC_R, MK_PTR(TYPE_ULONG)) > IOCTL(RTC_EPOCH_SET, IOC_W, TYPE_ULONG) > + IOCTL(RTC_WKALM_RD, IOC_R, MK_PTR(MK_STRUCT(STRUCT_rtc_wkalrm))) > + IOCTL(RTC_WKALM_SET, IOC_W, MK_PTR(MK_STRUCT(STRUCT_rtc_wkalrm))) > > IOCTL(BLKROSET, IOC_W, MK_PTR(TYPE_INT)) > IOCTL(BLKROGET, IOC_R, MK_PTR(TYPE_INT)) > diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h > index bbfa935..37504a2 100644 > --- a/linux-user/syscall_defs.h > +++ b/linux-user/syscall_defs.h > @@ -780,6 +780,8 @@ struct target_pollfd { > #define TARGET_RTC_IRQP_SET TARGET_IOW('p', 0x0c, abi_ulong) > #define TARGET_RTC_EPOCH_READ TARGET_IOR('p', 0x0d, abi_ulong) > #define TARGET_RTC_EPOCH_SET TARGET_IOW('p', 0x0e, abi_ulong) > +#define TARGET_RTC_WKALM_RD TARGET_IOR('p', 0x10, struct rtc_wkalrm) > +#define TARGET_RTC_WKALM_SET TARGET_IOW('p', 0x0f, struct rtc_wkalrm) > > #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_SH4) || \ > defined(TARGET_XTENSA) > diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h > index a35072a..820bc8e 100644 > --- a/linux-user/syscall_types.h > +++ b/linux-user/syscall_types.h > @@ -266,6 +266,11 @@ STRUCT(rtc_time, > TYPE_INT, /* tm_yday */ > TYPE_INT) /* tm_isdst */ > > +STRUCT(rtc_wkalrm, > + TYPE_CHAR, /* enabled */ > + TYPE_CHAR, /* pending */ > + MK_STRUCT(STRUCT_rtc_time)) /* time */ > + > STRUCT(blkpg_ioctl_arg, > TYPE_INT, /* op */ > TYPE_INT, /* flags */ > Applied to my linux-user branch. Thanks, Laurent
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h index accbdee..b09396e 100644 --- a/linux-user/ioctls.h +++ b/linux-user/ioctls.h @@ -85,6 +85,8 @@ IOCTL(RTC_IRQP_SET, IOC_W, TYPE_ULONG) IOCTL(RTC_EPOCH_READ, IOC_R, MK_PTR(TYPE_ULONG)) IOCTL(RTC_EPOCH_SET, IOC_W, TYPE_ULONG) + IOCTL(RTC_WKALM_RD, IOC_R, MK_PTR(MK_STRUCT(STRUCT_rtc_wkalrm))) + IOCTL(RTC_WKALM_SET, IOC_W, MK_PTR(MK_STRUCT(STRUCT_rtc_wkalrm))) IOCTL(BLKROSET, IOC_W, MK_PTR(TYPE_INT)) IOCTL(BLKROGET, IOC_R, MK_PTR(TYPE_INT)) diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index bbfa935..37504a2 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -780,6 +780,8 @@ struct target_pollfd { #define TARGET_RTC_IRQP_SET TARGET_IOW('p', 0x0c, abi_ulong) #define TARGET_RTC_EPOCH_READ TARGET_IOR('p', 0x0d, abi_ulong) #define TARGET_RTC_EPOCH_SET TARGET_IOW('p', 0x0e, abi_ulong) +#define TARGET_RTC_WKALM_RD TARGET_IOR('p', 0x10, struct rtc_wkalrm) +#define TARGET_RTC_WKALM_SET TARGET_IOW('p', 0x0f, struct rtc_wkalrm) #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_SH4) || \ defined(TARGET_XTENSA) diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h index a35072a..820bc8e 100644 --- a/linux-user/syscall_types.h +++ b/linux-user/syscall_types.h @@ -266,6 +266,11 @@ STRUCT(rtc_time, TYPE_INT, /* tm_yday */ TYPE_INT) /* tm_isdst */ +STRUCT(rtc_wkalrm, + TYPE_CHAR, /* enabled */ + TYPE_CHAR, /* pending */ + MK_STRUCT(STRUCT_rtc_time)) /* time */ + STRUCT(blkpg_ioctl_arg, TYPE_INT, /* op */ TYPE_INT, /* flags */