mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 21:05:08 +00:00
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:
parent
95b948c1d1
commit
4dfa329f48
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue