lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250226-m68k-rtc-v1-1-404641ec62e6@igalia.com>
Date: Wed, 26 Feb 2025 09:26:27 -0300
From: Thadeu Lima de Souza Cascardo <cascardo@...lia.com>
To: Geert Uytterhoeven <geert@...ux-m68k.org>
Cc: linux-m68k@...ts.linux-m68k.org, linux-kernel@...r.kernel.org, 
 Alexandre Belloni <alexandre.belloni@...tlin.com>, 
 linux-rtc@...r.kernel.org, 
 Thadeu Lima de Souza Cascardo <cascardo@...lia.com>, kernel-dev@...lia.com
Subject: [PATCH 1/2] m68k: rtc: dp8570a: split read_time and set_time

Give each ioctl cmd its own function. There should be no other functional
changes.

Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@...lia.com>
---
 arch/m68k/bvme6000/rtc.c | 148 ++++++++++++++++++++++++++---------------------
 1 file changed, 83 insertions(+), 65 deletions(-)

diff --git a/arch/m68k/bvme6000/rtc.c b/arch/m68k/bvme6000/rtc.c
index b43eeef0982c117fdb39f63a6feab59e18e99502..a84996bd1491da3c1d9bd8dae7e1a92805c735e0 100644
--- a/arch/m68k/bvme6000/rtc.c
+++ b/arch/m68k/bvme6000/rtc.c
@@ -36,43 +36,103 @@ static unsigned char days_in_mo[] =
 
 static atomic_t rtc_status = ATOMIC_INIT(1);
 
-static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+static int dp8570a_rtc_read_time(struct rtc_time *wtime)
+{
+	volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE;
+	unsigned char msr;
+	unsigned long flags;
+
+	local_irq_save(flags);
+	/* Ensure clock and real-time-mode-register are accessible */
+	msr = rtc->msr & 0xc0;
+	rtc->msr = 0x40;
+	memset(wtime, 0, sizeof(struct rtc_time));
+	do {
+		wtime->tm_sec =  bcd2bin(rtc->bcd_sec);
+		wtime->tm_min =  bcd2bin(rtc->bcd_min);
+		wtime->tm_hour = bcd2bin(rtc->bcd_hr);
+		wtime->tm_mday =  bcd2bin(rtc->bcd_dom);
+		wtime->tm_mon =  bcd2bin(rtc->bcd_mth)-1;
+		wtime->tm_year = bcd2bin(rtc->bcd_year);
+		if (wtime->tm_year < 70)
+			wtime->tm_year += 100;
+		wtime->tm_wday = bcd2bin(rtc->bcd_dow)-1;
+	} while (wtime->tm_sec != bcd2bin(rtc->bcd_sec));
+	rtc->msr = msr;
+	local_irq_restore(flags);
+	return 0;
+}
+
+static int dp8570a_rtc_set_time(struct rtc_time *rtc_tm)
 {
 	volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE;
 	unsigned char msr;
 	unsigned long flags;
-	struct rtc_time wtime;
+	unsigned char mon, day, hrs, min, sec, leap_yr;
+	unsigned int yrs;
+
+	yrs = rtc_tm->tm_year;
+	if (yrs < 1900)
+		yrs += 1900;
+	mon = rtc_tm->tm_mon + 1;   /* tm_mon starts at zero */
+	day = rtc_tm->tm_mday;
+	hrs = rtc_tm->tm_hour;
+	min = rtc_tm->tm_min;
+	sec = rtc_tm->tm_sec;
+
+	leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400));
+
+	if ((mon > 12) || (mon < 1) || (day == 0))
+		return -EINVAL;
+
+	if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr)))
+		return -EINVAL;
+
+	if ((hrs >= 24) || (min >= 60) || (sec >= 60))
+		return -EINVAL;
+
+	if (yrs >= 2070)
+		return -EINVAL;
+
+	local_irq_save(flags);
+	/* Ensure clock and real-time-mode-register are accessible */
+	msr = rtc->msr & 0xc0;
+	rtc->msr = 0x40;
+
+	rtc->t0cr_rtmr = yrs%4;
+	rtc->bcd_tenms = 0;
+	rtc->bcd_sec   = bin2bcd(sec);
+	rtc->bcd_min   = bin2bcd(min);
+	rtc->bcd_hr    = bin2bcd(hrs);
+	rtc->bcd_dom   = bin2bcd(day);
+	rtc->bcd_mth   = bin2bcd(mon);
+	rtc->bcd_year  = bin2bcd(yrs%100);
+	if (rtc_tm->tm_wday >= 0)
+		rtc->bcd_dow = bin2bcd(rtc_tm->tm_wday+1);
+	rtc->t0cr_rtmr = yrs%4 | 0x08;
+
+	rtc->msr = msr;
+	local_irq_restore(flags);
+
+	return 0;
+}
+
+static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
 	void __user *argp = (void __user *)arg;
 
 	switch (cmd) {
 	case RTC_RD_TIME:	/* Read the time/date from RTC	*/
 	{
-		local_irq_save(flags);
-		/* Ensure clock and real-time-mode-register are accessible */
-		msr = rtc->msr & 0xc0;
-		rtc->msr = 0x40;
-		memset(&wtime, 0, sizeof(struct rtc_time));
-		do {
-			wtime.tm_sec =  bcd2bin(rtc->bcd_sec);
-			wtime.tm_min =  bcd2bin(rtc->bcd_min);
-			wtime.tm_hour = bcd2bin(rtc->bcd_hr);
-			wtime.tm_mday =  bcd2bin(rtc->bcd_dom);
-			wtime.tm_mon =  bcd2bin(rtc->bcd_mth)-1;
-			wtime.tm_year = bcd2bin(rtc->bcd_year);
-			if (wtime.tm_year < 70)
-				wtime.tm_year += 100;
-			wtime.tm_wday = bcd2bin(rtc->bcd_dow)-1;
-		} while (wtime.tm_sec != bcd2bin(rtc->bcd_sec));
-		rtc->msr = msr;
-		local_irq_restore(flags);
+		struct rtc_time wtime;
+
+		dp8570a_rtc_read_time(&wtime);
 		return copy_to_user(argp, &wtime, sizeof wtime) ?
 								-EFAULT : 0;
 	}
 	case RTC_SET_TIME:	/* Set the RTC */
 	{
 		struct rtc_time rtc_tm;
-		unsigned char mon, day, hrs, min, sec, leap_yr;
-		unsigned int yrs;
 
 		if (!capable(CAP_SYS_ADMIN))
 			return -EACCES;
@@ -80,49 +140,7 @@ static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 		if (copy_from_user(&rtc_tm, argp, sizeof(struct rtc_time)))
 			return -EFAULT;
 
-		yrs = rtc_tm.tm_year;
-		if (yrs < 1900)
-			yrs += 1900;
-		mon = rtc_tm.tm_mon + 1;   /* tm_mon starts at zero */
-		day = rtc_tm.tm_mday;
-		hrs = rtc_tm.tm_hour;
-		min = rtc_tm.tm_min;
-		sec = rtc_tm.tm_sec;
-
-		leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400));
-
-		if ((mon > 12) || (mon < 1) || (day == 0))
-			return -EINVAL;
-
-		if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr)))
-			return -EINVAL;
-
-		if ((hrs >= 24) || (min >= 60) || (sec >= 60))
-			return -EINVAL;
-
-		if (yrs >= 2070)
-			return -EINVAL;
-
-		local_irq_save(flags);
-		/* Ensure clock and real-time-mode-register are accessible */
-		msr = rtc->msr & 0xc0;
-		rtc->msr = 0x40;
-
-		rtc->t0cr_rtmr = yrs%4;
-		rtc->bcd_tenms = 0;
-		rtc->bcd_sec   = bin2bcd(sec);
-		rtc->bcd_min   = bin2bcd(min);
-		rtc->bcd_hr    = bin2bcd(hrs);
-		rtc->bcd_dom   = bin2bcd(day);
-		rtc->bcd_mth   = bin2bcd(mon);
-		rtc->bcd_year  = bin2bcd(yrs%100);
-		if (rtc_tm.tm_wday >= 0)
-			rtc->bcd_dow = bin2bcd(rtc_tm.tm_wday+1);
-		rtc->t0cr_rtmr = yrs%4 | 0x08;
-
-		rtc->msr = msr;
-		local_irq_restore(flags);
-		return 0;
+		return dp8570a_rtc_set_time(&rtc_tm);
 	}
 	default:
 		return -EINVAL;

-- 
2.47.2


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ