diff --git a/include/kernel/equeue.h b/include/kernel/equeue.h new file mode 100644 index 0000000..8304548 --- /dev/null +++ b/include/kernel/equeue.h @@ -0,0 +1,34 @@ +#ifndef KERNEL_EQUEUE_H_ +#define KERNEL_EQUEUE_H_ + +#include +#include +#include +#include + +#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 diff --git a/kernel/equeue.c b/kernel/equeue.c new file mode 100644 index 0000000..16e600d --- /dev/null +++ b/kernel/equeue.c @@ -0,0 +1,29 @@ +#include + +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; +} diff --git a/libmango/include-user/mango/equeue.h b/libmango/include-user/mango/equeue.h new file mode 100644 index 0000000..5090a5f --- /dev/null +++ b/libmango/include-user/mango/equeue.h @@ -0,0 +1,9 @@ +#ifndef MANGO_EQUEUE_H_ +#define MANGO_EQUEUE_H_ + +#include + +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 diff --git a/libmango/include/mango/types.h b/libmango/include/mango/types.h index f337311..bbd55cd 100644 --- a/libmango/include/mango/types.h +++ b/libmango/include/mango/types.h @@ -4,24 +4,44 @@ #include #include -#define VM_PROT_READ 0x01u -#define VM_PROT_WRITE 0x02u -#define VM_PROT_EXEC 0x04u -#define VM_PROT_USER 0x08u -#define VM_PROT_SVR 0x10u -#define VM_PROT_NOCACHE 0x10u -#define VM_PROT_MAP_SPECIFIC 0x40u +#define VM_PROT_READ 0x01u +#define VM_PROT_WRITE 0x02u +#define VM_PROT_EXEC 0x04u +#define VM_PROT_USER 0x08u +#define VM_PROT_SVR 0x10u +#define VM_PROT_NOCACHE 0x10u +#define VM_PROT_MAP_SPECIFIC 0x40u -#define VM_REGION_ANY_OFFSET ((off_t) - 1) -#define KERN_HANDLE_INVALID ((kern_handle_t)0xFFFFFFFF) +#define VM_REGION_ANY_OFFSET ((off_t) - 1) +#define KERN_HANDLE_INVALID ((kern_handle_t)0xFFFFFFFF) -#define KERN_CFG_INVALID 0x00u -#define KERN_CFG_PAGE_SIZE 0x01u +#define KERN_CFG_INVALID 0x00u +#define KERN_CFG_PAGE_SIZE 0x01u -#define KERN_MSG_MAX_HANDLES 64 -#define KERN_MSG_HANDLE_IGNORE 0 -#define KERN_MSG_HANDLE_MOVE 1 -#define KERN_MSG_HANDLE_COPY 2 +/* maximum number of handles that can be sent in a single message */ +#define KERN_MSG_MAX_HANDLES 64 + +/* the corresponding handle should be ignored */ +#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 +/* 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 + +/* 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) \ { \ @@ -46,13 +66,17 @@ typedef uintptr_t virt_addr_t; typedef uint64_t msgid_t; typedef uint64_t off_t; typedef uint64_t koid_t; +typedef uintptr_t equeue_key_t; typedef unsigned int tid_t; +typedef unsigned int vm_controller_packet_type_t; typedef unsigned int kern_status_t; typedef uint32_t kern_handle_t; typedef uint32_t kern_config_key_t; typedef uint32_t vm_prot_t; typedef int64_t ssize_t; +typedef unsigned short equeue_packet_type_t; + typedef unsigned int umode_t; typedef struct { @@ -60,6 +84,12 @@ typedef struct { size_t io_len; } kern_iovec_t; +typedef struct { + kern_handle_t w_handle; + uint32_t w_waitfor; + uint32_t w_observed; +} kern_wait_item_t; + typedef struct { unsigned int hnd_mode; kern_handle_t hnd_value; @@ -84,4 +114,36 @@ typedef struct { size_t msg_handles_count; } 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