bhyve: Extend mevent to support updating timers

This will be used by a new PL031 implementation to provide an RTC for
arm64 guests.

Reviewed by:	jhb
MFC after:	2 weeks
Obtained from:	CheriBSD
This commit is contained in:
Jessica Clarke 2024-02-21 22:42:19 +00:00 committed by Mark Johnston
parent 95b948c1d1
commit 4dfa329f48
2 changed files with 25 additions and 10 deletions

View file

@ -80,6 +80,12 @@ struct mevent {
LIST_ENTRY(mevent) me_list;
};
enum mevent_update_type {
UPDATE_ENABLE,
UPDATE_DISABLE,
UPDATE_TIMER,
};
static LIST_HEAD(listhead, mevent) global_head, change_head;
static void
@ -237,7 +243,6 @@ mevent_build(struct kevent *kev)
*/
close(mevp->me_fd);
} else {
assert((mevp->me_state & EV_ADD) == 0);
mevent_populate(mevp, &kev[i]);
i++;
}
@ -375,30 +380,35 @@ mevent_add_disabled(int tfd, enum ev_type type,
}
static int
mevent_update(struct mevent *evp, bool enable)
mevent_update(struct mevent *evp, enum mevent_update_type type, int msecs)
{
int newstate;
mevent_qlock();
/*
* It's not possible to enable/disable a deleted event
* It's not possible to update a deleted event
*/
assert((evp->me_state & EV_DELETE) == 0);
newstate = evp->me_state;
if (enable) {
if (type == UPDATE_ENABLE) {
newstate |= EV_ENABLE;
newstate &= ~EV_DISABLE;
} else {
} else if (type == UPDATE_DISABLE) {
newstate |= EV_DISABLE;
newstate &= ~EV_ENABLE;
} else {
assert(type == UPDATE_TIMER);
assert(evp->me_type == EVF_TIMER);
newstate |= EV_ADD;
evp->me_msecs = msecs;
}
/*
* No update needed if state isn't changing
* No update needed if enable/disable had no effect
*/
if (evp->me_state != newstate) {
if (evp->me_state != newstate || type == UPDATE_TIMER) {
evp->me_state = newstate;
/*
@ -421,15 +431,19 @@ mevent_update(struct mevent *evp, bool enable)
int
mevent_enable(struct mevent *evp)
{
return (mevent_update(evp, true));
return (mevent_update(evp, UPDATE_ENABLE, -1));
}
int
mevent_disable(struct mevent *evp)
{
return (mevent_update(evp, UPDATE_DISABLE, -1));
}
return (mevent_update(evp, false));
int
mevent_timer_update(struct mevent *evp, int msecs)
{
return (mevent_update(evp, UPDATE_TIMER, msecs));
}
static int

View file

@ -55,6 +55,7 @@ int mevent_enable(struct mevent *evp);
int mevent_disable(struct mevent *evp);
int mevent_delete(struct mevent *evp);
int mevent_delete_close(struct mevent *evp);
int mevent_timer_update(struct mevent *evp, int msecs);
void mevent_dispatch(void);