Le 09/01/2020 à 13:59, 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. > > Signed-off-by: Filip Bozuta <filip.boz...@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 */ >
Reviewed-by: Laurent Vivier <laur...@vivier.eu>