Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F143098762
D11483.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D11483.id.diff
View Options
Index: head/sys/amd64/amd64/efirt.c
===================================================================
--- head/sys/amd64/amd64/efirt.c
+++ head/sys/amd64/amd64/efirt.c
@@ -46,6 +46,7 @@
#include <sys/sysctl.h>
#include <sys/systm.h>
#include <sys/vmmeter.h>
+#include <isa/rtc.h>
#include <machine/fpu.h>
#include <machine/efi.h>
#include <machine/metadata.h>
@@ -445,7 +446,7 @@
efi_status status;
int error;
- mtx_assert(&resettodr_lock, MA_OWNED);
+ mtx_assert(&atrtc_time_lock, MA_OWNED);
error = efi_enter();
if (error != 0)
return (error);
@@ -462,9 +463,9 @@
if (efi_runtime == NULL)
return (ENXIO);
- mtx_lock(&resettodr_lock);
+ mtx_lock(&atrtc_time_lock);
error = efi_get_time_locked(tm);
- mtx_unlock(&resettodr_lock);
+ mtx_unlock(&atrtc_time_lock);
return (error);
}
@@ -487,7 +488,7 @@
efi_status status;
int error;
- mtx_assert(&resettodr_lock, MA_OWNED);
+ mtx_assert(&atrtc_time_lock, MA_OWNED);
error = efi_enter();
if (error != 0)
return (error);
@@ -504,9 +505,9 @@
if (efi_runtime == NULL)
return (ENXIO);
- mtx_lock(&resettodr_lock);
+ mtx_lock(&atrtc_time_lock);
error = efi_set_time_locked(tm);
- mtx_unlock(&resettodr_lock);
+ mtx_unlock(&atrtc_time_lock);
return (error);
}
Index: head/sys/isa/rtc.h
===================================================================
--- head/sys/isa/rtc.h
+++ head/sys/isa/rtc.h
@@ -113,6 +113,7 @@
#ifdef _KERNEL
extern struct mtx clock_lock;
+extern struct mtx atrtc_time_lock;
extern int atrtcclock_disable;
int rtcin(int reg);
void atrtc_restore(void);
Index: head/sys/x86/isa/atrtc.c
===================================================================
--- head/sys/x86/isa/atrtc.c
+++ head/sys/x86/isa/atrtc.c
@@ -53,9 +53,17 @@
#include <machine/intr_machdep.h>
#include "clock_if.h"
+/*
+ * clock_lock protects low-level access to individual hardware registers.
+ * atrtc_time_lock protects the entire sequence of accessing multiple registers
+ * to read or write the date and time.
+ */
#define RTC_LOCK do { if (!kdb_active) mtx_lock_spin(&clock_lock); } while (0)
#define RTC_UNLOCK do { if (!kdb_active) mtx_unlock_spin(&clock_lock); } while (0)
+struct mtx atrtc_time_lock;
+MTX_SYSINIT(atrtc_lock_init, &atrtc_time_lock, "atrtc", MTX_DEF);
+
int atrtcclock_disable = 0;
static int rtc_reg = -1;
@@ -163,6 +171,8 @@
clock_ts_to_ct(ts, &ct);
+ mtx_lock(&atrtc_time_lock);
+
/* Disable RTC updates and interrupts. */
writertc(RTC_STATUSB, RTCSB_HALT | RTCSB_24HR);
@@ -181,6 +191,8 @@
/* Re-enable RTC updates and interrupts. */
writertc(RTC_STATUSB, rtc_statusb);
rtcin(RTC_INTR);
+
+ mtx_unlock(&atrtc_time_lock);
}
/**********************************************************************
@@ -352,6 +364,7 @@
* to make sure that no more than 240us pass after we start reading,
* and try again if so.
*/
+ mtx_lock(&atrtc_time_lock);
while (rtcin(RTC_STATUSA) & RTCSA_TUP)
continue;
critical_enter();
@@ -369,6 +382,7 @@
ct.year += (ct.year < 80 ? 2000 : 1900);
#endif
critical_exit();
+ mtx_unlock(&atrtc_time_lock);
/* Set dow = -1 because some clocks don't set it correctly. */
ct.dow = -1;
return (clock_ct_to_ts(&ct, ts));
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Jan 26, 11:41 PM (2 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28046194
Default Alt Text
D11483.id.diff (3 KB)
Attached To
Mode
D11483: Protect access to the AT realtime clock with its own mutex.
Attached
Detach File
Event Timeline
Log In to Comment