| /* Copyright (c) 2010-2011 The Regents of the University of California |
| * Barret Rhoden <brho@cs.berkeley.edu> |
| * See LICENSE for details. |
| * |
| * Kernel interface for event/notification delivery and preemption. */ |
| |
| #pragma once |
| |
| #include <ros/bits/event.h> |
| #include <ros/atomic.h> |
| #include <ros/trapframe.h> |
| |
| #include <ros/ucq.h> |
| #include <ros/evbitmap.h> |
| #include <ros/ceq.h> |
| |
| #define EV_MBOX_UCQ 1 |
| #define EV_MBOX_BITMAP 2 |
| #define EV_MBOX_CEQ 3 |
| |
| /* Structure for storing / receiving event messages. An overflow causes the |
| * bit of the event to get set in the bitmap. You can also have just the bit |
| * sent (and no message). */ |
| struct event_mbox { |
| int type; |
| union { |
| struct ucq ucq; |
| struct evbitmap evbm; |
| struct ceq ceq; |
| }; |
| }; |
| |
| /* The kernel sends messages to this structure, which describes how and where |
| * to receive messages, including optional IPIs. */ |
| struct event_queue { |
| struct event_mbox *ev_mbox; |
| int ev_flags; |
| bool ev_alert_pending; |
| uint32_t ev_vcore; |
| void (*ev_handler)(struct event_queue *); |
| void *ev_udata; |
| }; |
| |
| /* Big version, contains storage space for the ev_mbox. Never access the |
| * internal mbox directly. */ |
| struct event_queue_big { |
| struct event_mbox *ev_mbox; |
| int ev_flags; |
| bool ev_alert_pending; |
| uint32_t ev_vcore; |
| void (*ev_handler)(struct event_queue *); |
| void *ev_udata; |
| struct event_mbox ev_imbox; |
| }; |
| |
| /* Vcore state flags. K_LOCK means the kernel is writing */ |
| #define VC_K_LOCK 0x001 /* CASing with the kernel */ |
| #define VC_PREEMPTED 0x002 /* VC is preempted */ |
| #define VC_CAN_RCV_MSG 0x004 /* someone will get msg */ |
| #define VC_UTHREAD_STEALING 0x008 /* Uthread being stolen */ |
| #define VC_SCP_NOVCCTX 0x010 /* can't go into vc ctx */ |
| |
| /* Racy flags, where we don't need the atomics */ |
| #define VC_FPU_SAVED 0x1000 /* valid FPU state in anc */ |
| |
| /* Per-core data about preemptions and notifications */ |
| struct preempt_data { |
| struct user_context vcore_ctx; |
| struct ancillary_state preempt_anc; |
| struct user_context uthread_ctx; |
| uintptr_t vcore_entry; |
| uintptr_t vcore_stack; |
| uintptr_t vcore_tls_desc; |
| atomic_t flags; |
| int rflags; /* racy flags */ |
| bool notif_disabled; |
| bool notif_pending; |
| struct event_mbox ev_mbox_public; |
| struct event_mbox ev_mbox_private; |
| }; |