kernel: add equeue object
equeue is a way for the kernel to deliver events to userspace programs.
This commit is contained in:
34
include/kernel/equeue.h
Normal file
34
include/kernel/equeue.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#ifndef KERNEL_EQUEUE_H_
|
||||||
|
#define KERNEL_EQUEUE_H_
|
||||||
|
|
||||||
|
#include <kernel/locks.h>
|
||||||
|
#include <kernel/object.h>
|
||||||
|
#include <kernel/sched.h>
|
||||||
|
#include <mango/types.h>
|
||||||
|
|
||||||
|
#define EQUEUE_PACKET_MAX 100
|
||||||
|
|
||||||
|
enum equeue_flags {
|
||||||
|
EQUEUE_WAIT,
|
||||||
|
EQUEUE_DISCARD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct equeue {
|
||||||
|
struct object eq_base;
|
||||||
|
unsigned short eq_read_ptr, eq_write_ptr;
|
||||||
|
equeue_packet_t eq_packets[EQUEUE_PACKET_MAX];
|
||||||
|
struct waitqueue eq_wq;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern kern_status_t equeue_type_init(void);
|
||||||
|
extern struct equeue *equeue_cast(struct object *obj);
|
||||||
|
|
||||||
|
extern struct equeue *equeue_create(void);
|
||||||
|
|
||||||
|
extern kern_status_t equeue_enqueue(
|
||||||
|
struct equeue *q,
|
||||||
|
const equeue_packet_t *pkt,
|
||||||
|
enum equeue_flags flags);
|
||||||
|
extern kern_status_t equeue_dequeue(struct equeue *q, equeue_packet_t *out);
|
||||||
|
|
||||||
|
#endif
|
||||||
29
kernel/equeue.c
Normal file
29
kernel/equeue.c
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#include <kernel/equeue.h>
|
||||||
|
|
||||||
|
kern_status_t equeue_type_init(void)
|
||||||
|
{
|
||||||
|
return KERN_UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct equeue *equeue_cast(struct object *obj)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct equeue *equeue_create(void)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
kern_status_t equeue_enqueue(
|
||||||
|
struct equeue *q,
|
||||||
|
const equeue_packet_t *pkt,
|
||||||
|
enum equeue_flags flags)
|
||||||
|
{
|
||||||
|
return KERN_UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
kern_status_t equeue_dequeue(struct equeue *q, equeue_packet_t *out)
|
||||||
|
{
|
||||||
|
return KERN_UNIMPLEMENTED;
|
||||||
|
}
|
||||||
9
libmango/include-user/mango/equeue.h
Normal file
9
libmango/include-user/mango/equeue.h
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#ifndef MANGO_EQUEUE_H_
|
||||||
|
#define MANGO_EQUEUE_H_
|
||||||
|
|
||||||
|
#include <mango/types.h>
|
||||||
|
|
||||||
|
extern kern_status_t equeue_create(kern_handle_t *out);
|
||||||
|
extern kern_status_t equeue_dequeue(kern_handle_t eq, equeue_packet_t *out);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -18,11 +18,31 @@
|
|||||||
#define KERN_CFG_INVALID 0x00u
|
#define KERN_CFG_INVALID 0x00u
|
||||||
#define KERN_CFG_PAGE_SIZE 0x01u
|
#define KERN_CFG_PAGE_SIZE 0x01u
|
||||||
|
|
||||||
|
/* maximum number of handles that can be sent in a single message */
|
||||||
#define KERN_MSG_MAX_HANDLES 64
|
#define KERN_MSG_MAX_HANDLES 64
|
||||||
|
|
||||||
|
/* the corresponding handle should be ignored */
|
||||||
#define KERN_MSG_HANDLE_IGNORE 0
|
#define KERN_MSG_HANDLE_IGNORE 0
|
||||||
|
/* the corresponding handle should be moved to the recipient task. the handle
|
||||||
|
* will be closed. */
|
||||||
#define KERN_MSG_HANDLE_MOVE 1
|
#define KERN_MSG_HANDLE_MOVE 1
|
||||||
|
/* the corresponding handle should be copied to the recipient task. the handle
|
||||||
|
* will remain valid for the sending task. */
|
||||||
#define KERN_MSG_HANDLE_COPY 2
|
#define KERN_MSG_HANDLE_COPY 2
|
||||||
|
|
||||||
|
/* maximum number of objects that can be waited on in a single call to
|
||||||
|
* kern_object_wait */
|
||||||
|
#define KERN_WAIT_MAX_ITEMS 64
|
||||||
|
|
||||||
|
/* equeue packet types */
|
||||||
|
#define EQUEUE_PKT_PAGE_REQUEST 0x01u
|
||||||
|
#define EQUEUE_PKT_ASYNC_SIGNAL 0x02u
|
||||||
|
|
||||||
|
/* page request types */
|
||||||
|
#define PAGE_REQUEST_READ 0x01u
|
||||||
|
#define PAGE_REQUEST_DIRTY 0x02u
|
||||||
|
#define PAGE_REQUEST_DETACH 0x03u
|
||||||
|
|
||||||
#define IOVEC(p, len) \
|
#define IOVEC(p, len) \
|
||||||
{ \
|
{ \
|
||||||
.io_base = (virt_addr_t)(p), \
|
.io_base = (virt_addr_t)(p), \
|
||||||
@@ -46,13 +66,17 @@ typedef uintptr_t virt_addr_t;
|
|||||||
typedef uint64_t msgid_t;
|
typedef uint64_t msgid_t;
|
||||||
typedef uint64_t off_t;
|
typedef uint64_t off_t;
|
||||||
typedef uint64_t koid_t;
|
typedef uint64_t koid_t;
|
||||||
|
typedef uintptr_t equeue_key_t;
|
||||||
typedef unsigned int tid_t;
|
typedef unsigned int tid_t;
|
||||||
|
typedef unsigned int vm_controller_packet_type_t;
|
||||||
typedef unsigned int kern_status_t;
|
typedef unsigned int kern_status_t;
|
||||||
typedef uint32_t kern_handle_t;
|
typedef uint32_t kern_handle_t;
|
||||||
typedef uint32_t kern_config_key_t;
|
typedef uint32_t kern_config_key_t;
|
||||||
typedef uint32_t vm_prot_t;
|
typedef uint32_t vm_prot_t;
|
||||||
typedef int64_t ssize_t;
|
typedef int64_t ssize_t;
|
||||||
|
|
||||||
|
typedef unsigned short equeue_packet_type_t;
|
||||||
|
|
||||||
typedef unsigned int umode_t;
|
typedef unsigned int umode_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -60,6 +84,12 @@ typedef struct {
|
|||||||
size_t io_len;
|
size_t io_len;
|
||||||
} kern_iovec_t;
|
} kern_iovec_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
kern_handle_t w_handle;
|
||||||
|
uint32_t w_waitfor;
|
||||||
|
uint32_t w_observed;
|
||||||
|
} kern_wait_item_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned int hnd_mode;
|
unsigned int hnd_mode;
|
||||||
kern_handle_t hnd_value;
|
kern_handle_t hnd_value;
|
||||||
@@ -84,4 +114,36 @@ typedef struct {
|
|||||||
size_t msg_handles_count;
|
size_t msg_handles_count;
|
||||||
} kern_msg_t;
|
} kern_msg_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t s_observed;
|
||||||
|
} equeue_packet_async_signal_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* the key of the vm-object for which the page request relates, as
|
||||||
|
* specified when the vm-object was created */
|
||||||
|
equeue_key_t req_vmo;
|
||||||
|
/* page request type. one of PAGE_REQUEST_* */
|
||||||
|
unsigned short req_type;
|
||||||
|
/* of the offset into the vm-object for which pages are being requested
|
||||||
|
*/
|
||||||
|
off_t req_offset;
|
||||||
|
/* the length in bytes of the region being requested */
|
||||||
|
size_t req_length;
|
||||||
|
} equeue_packet_page_request_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* the type of packet. one of EQUEUE_PKT_* */
|
||||||
|
equeue_packet_type_t p_type;
|
||||||
|
/* the key of the object that is responsible for the event, as specified
|
||||||
|
* when the event was first subscribed to */
|
||||||
|
equeue_key_t p_key;
|
||||||
|
|
||||||
|
union {
|
||||||
|
/* p_type = EQUEUE_PKT_PAGE_REQUEST */
|
||||||
|
equeue_packet_page_request_t page_request;
|
||||||
|
/* p_type = EQUEUE_PKT_ASYNC_SIGNAL */
|
||||||
|
equeue_packet_async_signal_t async_signal;
|
||||||
|
};
|
||||||
|
} equeue_packet_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user