Use separate mutexes for atrtc and i8254 locking. Change all the strange

un-function-like RTC_LOCK/UNLOCK macro usage into normal function calls.
Since there is no longer any need to handle register access from a debugger
context, those function calls can just be regular mutex lock/unlock calls.

Requested by:  bde
This commit is contained in:
ian 2018-03-11 18:20:49 +00:00
parent 1629f3ec27
commit 95221efb08
3 changed files with 13 additions and 14 deletions

View File

@ -114,7 +114,6 @@
#define RTC_CENTURY 0x32 /* current century */ #define RTC_CENTURY 0x32 /* current century */
#ifdef _KERNEL #ifdef _KERNEL
extern struct mtx clock_lock;
extern struct mtx atrtc_time_lock; extern struct mtx atrtc_time_lock;
extern int atrtcclock_disable; extern int atrtcclock_disable;
int rtcin(int reg); int rtcin(int reg);

View File

@ -56,15 +56,15 @@ __FBSDID("$FreeBSD$");
#include "clock_if.h" #include "clock_if.h"
/* /*
* clock_lock protects low-level access to individual hardware registers. * atrtc_lock protects low-level access to individual hardware registers.
* atrtc_time_lock protects the entire sequence of accessing multiple registers * atrtc_time_lock protects the entire sequence of accessing multiple registers
* to read or write the date and time. * to read or write the date and time.
*/ */
#define RTC_LOCK do { if (!kdb_active) mtx_lock_spin(&clock_lock); } while (0) static struct mtx atrtc_lock;
#define RTC_UNLOCK do { if (!kdb_active) mtx_unlock_spin(&clock_lock); } while (0) MTX_SYSINIT(atrtc_lock_init, &atrtc_lock, "atrtc", MTX_SPIN | MTX_NOPROFILE);
struct mtx atrtc_time_lock; struct mtx atrtc_time_lock;
MTX_SYSINIT(atrtc_lock_init, &atrtc_time_lock, "atrtc", MTX_DEF); MTX_SYSINIT(atrtc_time_lock_init, &atrtc_time_lock, "atrtc", MTX_DEF);
int atrtcclock_disable = 0; int atrtcclock_disable = 0;
@ -108,9 +108,9 @@ rtcin(int reg)
{ {
u_char val; u_char val;
RTC_LOCK; mtx_lock_spin(&atrtc_lock);
val = rtcin_locked(reg); val = rtcin_locked(reg);
RTC_UNLOCK; mtx_unlock_spin(&atrtc_lock);
return (val); return (val);
} }
@ -118,9 +118,9 @@ void
writertc(int reg, u_char val) writertc(int reg, u_char val)
{ {
RTC_LOCK; mtx_lock_spin(&atrtc_lock);
rtcout_locked(reg, val); rtcout_locked(reg, val);
RTC_UNLOCK; mtx_unlock_spin(&atrtc_lock);
} }
static void static void
@ -321,7 +321,7 @@ atrtc_settime(device_t dev __unused, struct timespec *ts)
clock_dbgprint_bcd(dev, CLOCK_DBG_WRITE, &bct); clock_dbgprint_bcd(dev, CLOCK_DBG_WRITE, &bct);
mtx_lock(&atrtc_time_lock); mtx_lock(&atrtc_time_lock);
RTC_LOCK; mtx_lock_spin(&atrtc_lock);
/* Disable RTC updates and interrupts. */ /* Disable RTC updates and interrupts. */
rtcout_locked(RTC_STATUSB, RTCSB_HALT | RTCSB_24HR); rtcout_locked(RTC_STATUSB, RTCSB_HALT | RTCSB_24HR);
@ -344,7 +344,7 @@ atrtc_settime(device_t dev __unused, struct timespec *ts)
rtcout_locked(RTC_STATUSB, rtc_statusb); rtcout_locked(RTC_STATUSB, rtc_statusb);
rtcin_locked(RTC_INTR); rtcin_locked(RTC_INTR);
RTC_UNLOCK; mtx_unlock_spin(&atrtc_lock);
mtx_unlock(&atrtc_time_lock); mtx_unlock(&atrtc_time_lock);
return (0); return (0);
@ -371,7 +371,7 @@ atrtc_gettime(device_t dev, struct timespec *ts)
mtx_lock(&atrtc_time_lock); mtx_lock(&atrtc_time_lock);
while (rtcin(RTC_STATUSA) & RTCSA_TUP) while (rtcin(RTC_STATUSA) & RTCSA_TUP)
continue; continue;
RTC_LOCK; mtx_lock_spin(&atrtc_lock);
bct.sec = rtcin_locked(RTC_SEC); bct.sec = rtcin_locked(RTC_SEC);
bct.min = rtcin_locked(RTC_MIN); bct.min = rtcin_locked(RTC_MIN);
bct.hour = rtcin_locked(RTC_HRS); bct.hour = rtcin_locked(RTC_HRS);
@ -381,7 +381,7 @@ atrtc_gettime(device_t dev, struct timespec *ts)
#ifdef USE_RTC_CENTURY #ifdef USE_RTC_CENTURY
bct.year |= rtcin_locked(RTC_CENTURY) << 8; bct.year |= rtcin_locked(RTC_CENTURY) << 8;
#endif #endif
RTC_UNLOCK; mtx_unlock_spin(&atrtc_lock);
mtx_unlock(&atrtc_time_lock); mtx_unlock(&atrtc_time_lock);
/* dow is unused in timespec conversion and we have no nsec info. */ /* dow is unused in timespec conversion and we have no nsec info. */
bct.dow = 0; bct.dow = 0;

View File

@ -83,7 +83,7 @@ TUNABLE_INT("hw.i8254.freq", &i8254_freq);
int i8254_max_count; int i8254_max_count;
static int i8254_timecounter = 1; static int i8254_timecounter = 1;
struct mtx clock_lock; static struct mtx clock_lock;
static struct intsrc *i8254_intsrc; static struct intsrc *i8254_intsrc;
static uint16_t i8254_lastcount; static uint16_t i8254_lastcount;
static uint16_t i8254_offset; static uint16_t i8254_offset;