From 301dc9a238658b902d9d394b6e930d1ec4832190 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Mon, 16 Sep 2013 12:45:12 +0800 Subject: [PATCH] Modules/UDI - Implimenting UDI support, can load udi_dpt from udiref --- KernelLand/Modules/Interfaces/UDI/Makefile | 15 +- KernelLand/Modules/Interfaces/UDI/channels.c | 47 ++++ .../Interfaces/UDI/include/physio/dma.h | 57 +++++ .../Interfaces/UDI/include/physio/dma_const.h | 27 +++ .../Interfaces/UDI/include/physio/meta_intr.h | 4 +- .../Interfaces/UDI/include/physio/pio.h | 92 ++++++- .../Modules/Interfaces/UDI/include/udi.h | 18 ++ .../Modules/Interfaces/UDI/include/udi/cb.h | 2 +- .../Modules/Interfaces/UDI/include/udi/init.h | 16 -- .../Modules/Interfaces/UDI/include/udi/log.h | 50 ++++ .../Interfaces/UDI/include/udi/meta_mgmt.h | 6 + .../Interfaces/UDI/include/udi/queues.h | 24 ++ .../Interfaces/UDI/include/udi/strmem.h | 1 + .../Modules/Interfaces/UDI/include/udi/time.h | 22 ++ .../Interfaces/UDI/include/udi_physio.h | 23 +- .../Modules/Interfaces/UDI/include/udi_scsi.h | 134 ++++++++++ KernelLand/Modules/Interfaces/UDI/logging.c | 18 -- KernelLand/Modules/Interfaces/UDI/main.c | 229 ++++++++++++++---- KernelLand/Modules/Interfaces/UDI/strmem.c | 22 -- .../Modules/Interfaces/UDI/udi_internal.h | 98 ++++++++ .../Interfaces/UDI/{ => udi_lib}/buf.c | 0 .../Modules/Interfaces/UDI/{ => udi_lib}/cb.c | 0 .../Interfaces/UDI/{ => udi_lib}/imc.c | 0 .../Modules/Interfaces/UDI/udi_lib/logging.c | 62 +++++ .../Interfaces/UDI/{ => udi_lib}/mem.c | 0 .../Interfaces/UDI/{ => udi_lib}/meta_gio.c | 0 .../Interfaces/UDI/{ => udi_lib}/meta_mgmt.c | 53 +++- .../Interfaces/UDI/{ => udi_lib}/physio.c | 9 + .../Interfaces/UDI/udi_lib/physio/dma.c | 71 ++++++ .../UDI/{ => udi_lib}/physio/meta_bus.c | 0 .../UDI/{ => udi_lib}/physio/meta_intr.c | 22 +- .../Interfaces/UDI/udi_lib/physio/pio.c | 55 +++++ .../UDI/{ => udi_lib}/physio_main.c | 0 .../Modules/Interfaces/UDI/udi_lib/queues.c | 27 +++ .../Modules/Interfaces/UDI/udi_lib/scsi.c | 78 ++++++ .../Modules/Interfaces/UDI/udi_lib/strmem.c | 75 ++++++ .../Modules/Interfaces/UDI/udi_lib/time.c | 45 ++++ 37 files changed, 1255 insertions(+), 147 deletions(-) create mode 100644 KernelLand/Modules/Interfaces/UDI/channels.c create mode 100644 KernelLand/Modules/Interfaces/UDI/include/physio/dma.h create mode 100644 KernelLand/Modules/Interfaces/UDI/include/physio/dma_const.h create mode 100644 KernelLand/Modules/Interfaces/UDI/include/udi/queues.h create mode 100644 KernelLand/Modules/Interfaces/UDI/include/udi/time.h create mode 100644 KernelLand/Modules/Interfaces/UDI/include/udi_scsi.h delete mode 100644 KernelLand/Modules/Interfaces/UDI/logging.c delete mode 100644 KernelLand/Modules/Interfaces/UDI/strmem.c create mode 100644 KernelLand/Modules/Interfaces/UDI/udi_internal.h rename KernelLand/Modules/Interfaces/UDI/{ => udi_lib}/buf.c (100%) rename KernelLand/Modules/Interfaces/UDI/{ => udi_lib}/cb.c (100%) rename KernelLand/Modules/Interfaces/UDI/{ => udi_lib}/imc.c (100%) create mode 100644 KernelLand/Modules/Interfaces/UDI/udi_lib/logging.c rename KernelLand/Modules/Interfaces/UDI/{ => udi_lib}/mem.c (100%) rename KernelLand/Modules/Interfaces/UDI/{ => udi_lib}/meta_gio.c (100%) rename KernelLand/Modules/Interfaces/UDI/{ => udi_lib}/meta_mgmt.c (60%) rename KernelLand/Modules/Interfaces/UDI/{ => udi_lib}/physio.c (60%) create mode 100644 KernelLand/Modules/Interfaces/UDI/udi_lib/physio/dma.c rename KernelLand/Modules/Interfaces/UDI/{ => udi_lib}/physio/meta_bus.c (100%) rename KernelLand/Modules/Interfaces/UDI/{ => udi_lib}/physio/meta_intr.c (67%) create mode 100644 KernelLand/Modules/Interfaces/UDI/udi_lib/physio/pio.c rename KernelLand/Modules/Interfaces/UDI/{ => udi_lib}/physio_main.c (100%) create mode 100644 KernelLand/Modules/Interfaces/UDI/udi_lib/queues.c create mode 100644 KernelLand/Modules/Interfaces/UDI/udi_lib/scsi.c create mode 100644 KernelLand/Modules/Interfaces/UDI/udi_lib/strmem.c create mode 100644 KernelLand/Modules/Interfaces/UDI/udi_lib/time.c diff --git a/KernelLand/Modules/Interfaces/UDI/Makefile b/KernelLand/Modules/Interfaces/UDI/Makefile index 4c199f18..9613127c 100644 --- a/KernelLand/Modules/Interfaces/UDI/Makefile +++ b/KernelLand/Modules/Interfaces/UDI/Makefile @@ -2,9 +2,18 @@ # CPPFLAGS = -I./include -OBJ = main.o logging.o strmem.o imc.o mem.o buf.o cb.o -OBJ += meta_mgmt.o meta_gio.o -OBJ += physio.o physio/meta_bus.o physio/meta_intr.o + +# - UDI Library Files +LIB_OBJS := logging.o strmem.o imc.o mem.o buf.o cb.o +LIB_OBJS += queues.o time.o +LIB_OBJS += meta_mgmt.o meta_gio.o +LIB_OBJS += physio.o physio/meta_bus.o physio/meta_intr.o physio/pio.o physio/dma.o +LIB_OBJS += scsi.o +# - UDI->Acess Translation Layer +TRANS_OBJS := + +OBJ = main.o channels.o +OBJ += $(LIB_OBJS:%=udi_lib/%) $(TRANS_OBJS:%=trans/%) NAME = UDI -include ../Makefile.tpl diff --git a/KernelLand/Modules/Interfaces/UDI/channels.c b/KernelLand/Modules/Interfaces/UDI/channels.c new file mode 100644 index 00000000..e173747e --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/channels.c @@ -0,0 +1,47 @@ +/* + * Acess2 UDI Layer + * - By John Hodge (thePowersGang) + */ +#define DEBUG 0 +#include +#include +#include "udi_internal.h" + +struct sUDI_ChannelSide { + struct sUDI_Channel *BackPtr; + const void *Ops; + void *Context; +}; + +typedef struct sUDI_Channel +{ + enum eUDI_MetaLang MetaLang; + struct sUDI_ChannelSide Side[2]; +} tUDI_Channel; + +// === CODE === +udi_channel_t UDI_CreateChannel(enum eUDI_MetaLang metalang, udi_index_t meta_ops_num, + tUDI_DriverInstance *ThisEnd, udi_index_t ThisOpsIndex, + tUDI_DriverInstance *OtherEnd, udi_index_t OtherOpsIndex) +{ + tUDI_Channel *ret = NEW(tUDI_Channel,); + ret->MetaLang = metalang; + ret->Side[0].BackPtr = ret; +// ret->Side[0].Ops = ThisEnd->Module->InitInfo->Op; + ret->Side[1].BackPtr = ret; + return (udi_channel_t)&ret->Side[0].BackPtr; +} + +const void *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, enum eUDI_MetaLang metalang) +{ + tUDI_Channel *ch = *(tUDI_Channel**)(gcb->channel); + ASSERTCR(ch->MetaLang, ==, metalang, NULL); + + struct sUDI_ChannelSide *newside = (gcb->channel == (udi_channel_t)&ch->Side[0].BackPtr ? &ch->Side[1] : &ch->Side[0]); + +// gcb->initiator_context = gcb->context; + gcb->channel = (udi_channel_t)&newside->BackPtr; + gcb->context = newside->Context; + return newside->Ops; +} + diff --git a/KernelLand/Modules/Interfaces/UDI/include/physio/dma.h b/KernelLand/Modules/Interfaces/UDI/include/physio/dma.h new file mode 100644 index 00000000..90976343 --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/include/physio/dma.h @@ -0,0 +1,57 @@ +/* + */ +#ifndef _UDI_PHYSIO_DMA_H_ +#define _UDI_PHYSIO_DMA_H_ + +//typedef struct udi_dma_handle_s *udi_dma_handle_t; +//#define UDI_NULL_DMA_HANDLE NULL + +extern void udi_dma_limits(udi_dma_limits_t *dma_limits); + +typedef void udi_dma_prepare_call_t(udi_cb_t *gcb, udi_dma_handle_t new_dma_handle); +typedef void udi_dma_buf_map_call_t(udi_cb_t *gcb, udi_scgth_t *scgth, udi_boolean_t complete, udi_status_t status); +typedef void udi_dma_mem_alloc_call_t(udi_cb_t *gcb, udi_dma_handle_t new_dma_handle, void *mem_ptr, udi_size_t actual_gap, udi_boolean_t single_element, udi_scgth_t *scgth, udi_boolean_t must_swap); +typedef void udi_dma_sync_call_t(udi_cb_t *gcb); +typedef void udi_dma_scgth_sync_call_t(udi_cb_t *gcb); +typedef void udi_dma_mem_to_buf_call_t(udi_cb_t *gcb, udi_buf_t *new_dst_buf); + +/** + * \name Values for flags (udi_dma_prepare, udi_dma_buf_map) + * \{ + */ +#define UDI_DMA_OUT (1U<<2) +#define UDI_DMA_IN (1U<<3) +#define UDI_DMA_REWIND (1U<<4) +#define UDI_DMA_BIG_ENDIAN (1U<<5) +#define UDI_DMA_LITTLE_ENDIAN (1U<<6) +#define UDI_DMA_NEVERSWAP (1U<<7) +/** + * \} + */ + +extern void udi_dma_prepare(udi_dma_prepare_call_t *callback, udi_cb_t *gcb, + udi_dma_constraints_t constraints, udi_ubit8_t flags); + +extern void udi_dma_buf_map(udi_dma_buf_map_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle, + udi_buf_t *buf, udi_size_t offset, udi_size_t len, udi_ubit8_t flags); + +extern udi_buf_t *udi_dma_buf_unmap(udi_dma_handle_t dma_handle, udi_size_t new_buf_size); + +extern void udi_dma_mem_alloc(udi_dma_mem_alloc_call_t *callback, udi_cb_t *gcb, + udi_dma_constraints_t constraints, udi_ubit8_t flags, + udi_ubit16_t nelements, udi_size_t element_size, udi_size_t max_gap); + +extern void udi_dma_sync(udi_dma_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle, + udi_size_t offset, udi_size_t len, udi_ubit8_t flags); + +extern void udi_dma_scgth_sync(udi_dma_scgth_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle); + +extern void udi_dma_mem_barrier(udi_dma_handle_t dma_handle); + +extern void udi_dma_free(udi_dma_handle_t dma_handle); + +extern void udi_dma_mem_to_buf(udi_dma_mem_to_buf_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle, + udi_size_t src_off, udi_size_t src_len, udi_buf_t *dst_buf); + +#endif + diff --git a/KernelLand/Modules/Interfaces/UDI/include/physio/dma_const.h b/KernelLand/Modules/Interfaces/UDI/include/physio/dma_const.h new file mode 100644 index 00000000..85da58a5 --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/include/physio/dma_const.h @@ -0,0 +1,27 @@ +/* + * + */ +#ifndef _UDI_DMA_CONST_H_ +#define _UDI_DMA_CONST_H_ + +typedef void udi_dma_constraints_attr_set_call_t(udi_cb_t *gcb, udi_dma_constraints_t new_constraints, udi_status_t status); + +/** + * \name Flags for udi_dma_constraints_attr_set + * \{ + */ +#define UDI_DMA_CONSTRAINTS_COPY (1U<<0) +/** + * \} + */ + +extern void udi_dma_constraints_attr_set(udi_dma_constraints_attr_set_call_t *callback, udi_cb_t *gcb, + udi_dma_constraints_t src_constraints, + const udi_dma_constraints_attr_spec_t *attr_list, udi_ubit16_t list_length, + udi_ubit8_t flags); + +extern void udi_dma_constraints_attr_reset(udi_dma_constraints_t constraints, udi_dma_constraints_attr_t attr_type); + +extern void udi_dma_constraints_free(udi_dma_constraints_t constraints); + +#endif diff --git a/KernelLand/Modules/Interfaces/UDI/include/physio/meta_intr.h b/KernelLand/Modules/Interfaces/UDI/include/physio/meta_intr.h index d5dd3941..506eb0c8 100644 --- a/KernelLand/Modules/Interfaces/UDI/include/physio/meta_intr.h +++ b/KernelLand/Modules/Interfaces/UDI/include/physio/meta_intr.h @@ -74,11 +74,11 @@ struct udi_intr_event_cb_s extern void udi_intr_attach_req(udi_intr_attach_cb_t *intr_attach_cb); extern void udi_intr_attach_ack(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status); -extern void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status); +//extern void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status); extern void udi_intr_detach_req(udi_intr_detach_cb_t *intr_detach_cb); extern void udi_intr_detach_ack(udi_intr_detach_cb_t *intr_detach_cb); -extern void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb); +//extern void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb); extern void udi_intr_event_ind(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags); diff --git a/KernelLand/Modules/Interfaces/UDI/include/physio/pio.h b/KernelLand/Modules/Interfaces/UDI/include/physio/pio.h index 1ce305f2..cbb054bb 100644 --- a/KernelLand/Modules/Interfaces/UDI/include/physio/pio.h +++ b/KernelLand/Modules/Interfaces/UDI/include/physio/pio.h @@ -6,10 +6,98 @@ #include #include - - typedef _udi_handle_t udi_pio_handle_t; /* Null handle value for udi_pio_handle_t */ #define UDI_NULL_PIO_HANDLE _NULL_HANDLE +typedef void udi_pio_map_call_t(udi_cb_t *gcb, udi_pio_handle_t new_pio_handle); + +typedef const struct { + udi_ubit8_t pio_op; + udi_ubit8_t tran_size; + udi_ubit16_t operand; +} udi_pio_trans_t; + +/** + * \brief Values for tran_size + */ +enum { + UDI_PIO_1BYTE, + UDI_PIO_2BYTE, + UDI_PIO_4BYTE, + UDI_PIO_8BYTE, + UDI_PIO_16BYTE, + UDI_PIO_32BYTE, +}; + +//! \brief PIO Handle Layout Element Type Code +#define UDI_DL_PIO_HANDLE_T 200 + +/** + * \name PIO Handle Allocation and Initialisation + * \{ + */ + +/** + * \name Values for pio_attributes of udi_pio_map + * \{ + */ +#define UDI_PIO_STRICTORDER (1U<<0) +#define UDI_PIO_UNORDERED_OK (1U<<1) +#define UDI_PIO_MERGING_OK (1U<<2) +#define UDI_PIO_LOADCACHING_OK (1U<<3) +#define UDI_PIO_STORECACHING_OK (1U<<4) +#define UDI_PIO_BIG_ENDIAN (1U<<5) +#define UDI_PIO_LITTLE_ENDIAN (1U<<6) +#define UDI_PIO_NEVERSWAP (1U<<7) +#define UDI_PIO_UNALIGNED (1U<<8) +/** + * \} + */ + +extern void udi_pio_map(udi_pio_map_call_t *callback, udi_cb_t *gcb, + udi_ubit32_t regset_idx, udi_ubit32_t base_offset, udi_ubit32_t length, + udi_pio_trans_t *trans_list, udi_ubit16_t list_length, + udi_ubit16_t pio_attributes, udi_ubit32_t pace, udi_index_t serialization_domain); + +extern void udi_pio_unmap(udi_pio_handle_t pio_handle); + +extern udi_ubit32_t udi_pio_atmic_sizes(udi_pio_handle_t pio_handle); + +extern void udi_pio_abort_sequence(udi_pio_handle_t pio_handle, udi_size_t scratch_requirement); + +/** + * \} + */ + +/** + * \name PIO Access Service Calls + * \{ + */ +typedef void udi_pio_trans_call_t(udi_cb_t *gcb, udi_buf_t *new_buf, udi_status_t status, udi_ubit16_t result); + +extern void udi_pio_trans(udi_pio_trans_call_t *callback, udi_cb_t *gcb, + udi_pio_handle_t pio_handle, udi_index_t start_label, + udi_buf_t *buf, void *mem_ptr); + +typedef void udi_pio_probe_call_t(udi_cb_t *gcb, udi_status_t status); + +/** + * \name Values for direction + * \{ + */ +#define UDI_PIO_IN 0x00 +#define UDI_PIO_OUT 0x20 +/** + * \} + */ + +extern void udi_pio_probe(udi_pio_probe_call_t *callback, udi_cb_t *gcb, + udi_pio_handle_t pio_handle, void *mem_ptr, udi_ubit32_t pio_offset, + udi_ubit8_t tran_size, udi_ubit8_t direction); + +/** + * \} + */ + #endif diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi.h b/KernelLand/Modules/Interfaces/UDI/include/udi.h index 53953c07..28f3497e 100644 --- a/KernelLand/Modules/Interfaces/UDI/include/udi.h +++ b/KernelLand/Modules/Interfaces/UDI/include/udi.h @@ -79,11 +79,29 @@ typedef const udi_ubit8_t udi_layout_t; */ +typedef struct udi_init_s udi_init_t; +typedef struct udi_primary_init_s udi_primary_init_t; +typedef struct udi_secondary_init_s udi_secondary_init_t; +typedef struct udi_ops_init_s udi_ops_init_t; +typedef struct udi_cb_init_s udi_cb_init_t; +typedef struct udi_cb_select_s udi_cb_select_t; +typedef struct udi_gcb_init_s udi_gcb_init_t; + +typedef struct udi_init_context_s udi_init_context_t; +typedef struct udi_limits_s udi_limits_t; +typedef struct udi_chan_context_s udi_chan_context_t; +typedef struct udi_child_chan_context_s udi_child_chan_context_t; + +typedef void udi_op_t(void); +typedef udi_op_t * const udi_ops_vector_t; + // === INCLUDE SUB-SECTIONS === #include "udi/cb.h" // Control Blocks +#include "udi/time.h" // Timer Services #include "udi/log.h" // Logging #include "udi/attr.h" // Attributes #include "udi/strmem.h" // String/Memory +#include "udi/queues.h" // Queues #include "udi/buf.h" // Buffers #include "udi/mem.h" // Memory Management #include "udi/imc.h" // Inter-module Communication diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi/cb.h b/KernelLand/Modules/Interfaces/UDI/include/udi/cb.h index 76db5c6e..cd8ea1b1 100644 --- a/KernelLand/Modules/Interfaces/UDI/include/udi/cb.h +++ b/KernelLand/Modules/Interfaces/UDI/include/udi/cb.h @@ -32,7 +32,7 @@ struct udi_cb_s */ void *scratch; /** - * \brief ??? + * \brief Source-usable value */ void *initiator_context; /** diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi/init.h b/KernelLand/Modules/Interfaces/UDI/include/udi/init.h index a6d5bb48..6189e8dc 100644 --- a/KernelLand/Modules/Interfaces/UDI/include/udi/init.h +++ b/KernelLand/Modules/Interfaces/UDI/include/udi/init.h @@ -4,22 +4,6 @@ #ifndef _UDI_INIT_H_ #define _UDI_INIT_H_ -typedef struct udi_init_s udi_init_t; -typedef struct udi_primary_init_s udi_primary_init_t; -typedef struct udi_secondary_init_s udi_secondary_init_t; -typedef struct udi_ops_init_s udi_ops_init_t; -typedef struct udi_cb_init_s udi_cb_init_t; -typedef struct udi_cb_select_s udi_cb_select_t; -typedef struct udi_gcb_init_s udi_gcb_init_t; - -typedef struct udi_init_context_s udi_init_context_t; -typedef struct udi_limits_s udi_limits_t; -typedef struct udi_chan_context_s udi_chan_context_t; -typedef struct udi_child_chan_context_s udi_child_chan_context_t; - -typedef void udi_op_t(void); -typedef udi_op_t * const udi_ops_vector_t; - /** * \brief UDI Initialisation Structure * diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi/log.h b/KernelLand/Modules/Interfaces/UDI/include/udi/log.h index dccb1246..bc28735e 100644 --- a/KernelLand/Modules/Interfaces/UDI/include/udi/log.h +++ b/KernelLand/Modules/Interfaces/UDI/include/udi/log.h @@ -9,6 +9,43 @@ */ typedef udi_ubit32_t udi_trevent_t; +/** + * \name Values for udi_trevent_t + * \note Taken from UDI Spec 1.01 + * \{ + */ +/* Common Trace Events */ +#define UDI_TREVENT_LOCAL_PROC_ENTRY (1U<<0) +#define UDI_TREVENT_LOCAL_PROC_EXIT (1U<<1) +#define UDI_TREVENT_EXTERNAL_ERROR (1U<<2) +/* Common Metalanguage-Selectable Trace Events */ +#define UDI_TREVENT_IO_SCHEDULED (1U<<6) +#define UDI_TREVENT_IO_COMPLETED (1U<<7) +/* Metalanguage-Specific Trace Events */ +#define UDI_TREVENT_META_SPECIFIC_1 (1U<<11) +#define UDI_TREVENT_META_SPECIFIC_2 (1U<<12) +#define UDI_TREVENT_META_SPECIFIC_3 (1U<<13) +#define UDI_TREVENT_META_SPECIFIC_4 (1U<<14) +#define UDI_TREVENT_META_SPECIFIC_5 (1U<<15) +/* Driver-Specific Trace Events */ +#define UDI_TREVENT_INTERNAL_1 (1U<<16) +#define UDI_TREVENT_INTERNAL_2 (1U<<17) +#define UDI_TREVENT_INTERNAL_3 (1U<<18) +#define UDI_TREVENT_INTERNAL_4 (1U<<19) +#define UDI_TREVENT_INTERNAL_5 (1U<<20) +#define UDI_TREVENT_INTERNAL_6 (1U<<21) +#define UDI_TREVENT_INTERNAL_7 (1U<<22) +#define UDI_TREVENT_INTERNAL_8 (1U<<23) +#define UDI_TREVENT_INTERNAL_9 (1U<<24) +#define UDI_TREVENT_INTERNAL_10 (1U<<25) +#define UDI_TREVENT_INTERNAL_11 (1U<<26) +#define UDI_TREVENT_INTERNAL_12 (1U<<27) +#define UDI_TREVENT_INTERNAL_13 (1U<<28) +#define UDI_TREVENT_INTERNAL_14 (1U<<29) +#define UDI_TREVENT_INTERNAL_15 (1U<<30) +/* Logging Event */ +#define UDI_TREVENT_LOG (1U<<31) + /** * \brief Log Callback */ @@ -27,5 +64,18 @@ typedef void udi_log_write_call_t(udi_cb_t *gcb, udi_status_t correlated_status) * \} */ +extern void udi_trace_write(udi_init_context_t *init_context, + udi_trevent_t trace_event, udi_index_t meta_idx, + udi_ubit32_t msgnum, ...); + +extern void udi_log_write( udi_log_write_call_t *callback, udi_cb_t *gcb, + udi_trevent_t trace_event, udi_ubit8_t severity, udi_index_t meta_idx, udi_status_t original_status, + udi_ubit32_t msgnum, ... ); + +extern void udi_assert(udi_boolean_t expr); + +extern void udi_debug_break(udi_init_context_t *init_context, const char *message); + +extern void udi_debug_printf(const char *format, ...); #endif diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi/meta_mgmt.h b/KernelLand/Modules/Interfaces/UDI/include/udi/meta_mgmt.h index 97eccf2d..a913552a 100644 --- a/KernelLand/Modules/Interfaces/UDI/include/udi/meta_mgmt.h +++ b/KernelLand/Modules/Interfaces/UDI/include/udi/meta_mgmt.h @@ -22,17 +22,22 @@ typedef void udi_usage_ind_op_t(udi_usage_cb_t *cb, udi_ubit8_t resource_level); #define UDI_RESOURCES_PLENTIFUL 4 /* Proxy */ extern void udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level); + +extern void udi_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level); /** * \} */ typedef void udi_usage_res_op_t(udi_usage_cb_t *cb); +extern void udi_usage_res(udi_usage_cb_t *cb); + /** * \name Enumerate this driver * \{ */ typedef void udi_enumerate_req_op_t(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level); +extern void udi_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level); /* Values for enumeration_level */ #define UDI_ENUMERATE_START 1 #define UDI_ENUMERATE_START_RESCAN 2 @@ -60,6 +65,7 @@ typedef void udi_enumerate_ack_op_t(udi_enumerate_cb_t *cb, udi_ubit8_t enumerat #define UDI_ENUMERATE_REMOVED_SELF 5 #define UDI_ENUMERATE_RELEASED 6 #define UDI_ENUMERATE_FAILED 255 +extern void udi_enumerate_ack(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx); /** * \} */ diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi/queues.h b/KernelLand/Modules/Interfaces/UDI/include/udi/queues.h new file mode 100644 index 00000000..c19ec952 --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/include/udi/queues.h @@ -0,0 +1,24 @@ +/** + * \file udi_queues.h + * \brief Queue Management Utility Functions + */ +#ifndef _UDI_QUEUES_H_ +#define _UDI_QUEUES_H_ + +typedef struct udi_queue udi_queue_t; + +struct udi_queue +{ + struct udi_queue *next; + struct udi_queue *prev; +}; + +extern void udi_enqueue(udi_queue_t *new_el, udi_queue_t *old_el); +extern udi_queue_t *udi_dequeue(udi_queue_t *element); + +#define UDI_QUEUE_INIT(listhead) ((listhead)->next = (listhead)->prev = (listhead)) +#define UDI_QUEUE_EMPTY(listhead) ((listhead)->next == (listhead)->prev) +// TODO: other queue macros + +#endif + diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi/strmem.h b/KernelLand/Modules/Interfaces/UDI/include/udi/strmem.h index f540a3ea..b5de131c 100644 --- a/KernelLand/Modules/Interfaces/UDI/include/udi/strmem.h +++ b/KernelLand/Modules/Interfaces/UDI/include/udi/strmem.h @@ -38,6 +38,7 @@ extern udi_ubit32_t udi_strtou32(const char *s, char **endptr, int base); extern udi_size_t udi_snprintf(char *s, udi_size_t max_bytes, const char *format, ...); +extern udi_size_t udi_vsnprintf(char *s, udi_size_t max_bytes, const char *format, va_list ap); diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi/time.h b/KernelLand/Modules/Interfaces/UDI/include/udi/time.h new file mode 100644 index 00000000..2654ce84 --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/include/udi/time.h @@ -0,0 +1,22 @@ + +#ifndef _UDI_TIME_H_ +#define _UDI_TIME_H_ + +typedef struct { + udi_ubit32_t seconds; + udi_ubit32_t nanoseconds; +} udi_time_t; + +typedef void udi_timer_expired_call_t(udi_cb_t *gcb); +typedef void udi_timer_tick_call_t(udi_cb_t *gcb, udi_ubit32_t missed); + +extern void udi_timer_start(udi_timer_expired_call_t *callback, udi_cb_t *gcb, udi_time_t interval); +extern void udi_timer_start_repeating(udi_timer_tick_call_t *callback, udi_cb_t *gcb, udi_time_t interval); +extern void udi_timer_cancel(udi_cb_t *gcb); + +extern udi_timestamp_t udi_time_current(void); +extern udi_time_t udi_time_between(udi_timestamp_t start_time, udi_timestamp_t end_time); +extern udi_time_t udi_time_since(udi_timestamp_t start_time); + +#endif + diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi_physio.h b/KernelLand/Modules/Interfaces/UDI/include/udi_physio.h index 1397b1c0..818257e0 100644 --- a/KernelLand/Modules/Interfaces/UDI/include/udi_physio.h +++ b/KernelLand/Modules/Interfaces/UDI/include/udi_physio.h @@ -118,27 +118,10 @@ struct udi_scgth_s // === FUNCTIONS === -// --- DMA Constraints Management --- -extern void udi_dma_constraints_attr_set( - udi_dma_constraints_attr_set_call_t *callback, - udi_cb_t *gcb, - udi_dma_constraints_t src_constraints, - const udi_dma_constraints_attr_spec_t *attr_list, - udi_ubit16_t list_length, - udi_ubit8_t flags - ); -/* Constraints Flags */ -#define UDI_DMA_CONSTRAINTS_COPY (1U<<0) - -extern void udi_dma_constraints_attr_reset( - udi_dma_constraints_t constraints, - udi_dma_constraints_attr_t attr_type - ); - -extern void udi_dma_constraints_free(udi_dma_constraints_t constraints); - +#include +#include #include #include - +#include #endif diff --git a/KernelLand/Modules/Interfaces/UDI/include/udi_scsi.h b/KernelLand/Modules/Interfaces/UDI/include/udi_scsi.h new file mode 100644 index 00000000..234ab857 --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/include/udi_scsi.h @@ -0,0 +1,134 @@ +/** + * \file udi_scsi.h + * \brief UDI SCSI Bindings + */ +#ifndef _UDI_SCSI_H_ +#define _UDI_SCSI_H_ + +typedef struct { + udi_cb_t gcb; + udi_ubit16_t events; +} udi_scsi_bind_cb_t; + +#define UDI_SCSI_BIND_CB_NUM 1 + +/* SCSI Events */ +#define UDI_SCSI_EVENT_AEN (1U<<0) +#define UDI_SCSI_EVENT_TGT_RESET (1U<<1) +#define UDI_SCSI_EVENT_BUS_RESET (1U<<2) +#define UDI_SCSI_EVENT_UNSOLICITED_RESELECT (1U<<3) + +typedef struct { + udi_cb_t gcb; + udi_buf_t *data_buf; + udi_ubit32_t timeout; + udi_ubit16_t flags; + udi_ubit8_t attribute; + udi_ubit8_t cdb_len; + udi_ubit8_t *cdb_ptr; +} udi_scsi_io_cb_t; +/* Control Block Group Number */ +#define UDI_SCSI_IO_CB_NUM 2 +/* I/O Request Flags */ +#define UDI_SCSI_DATA_IN (1U<<0) +#define UDI_SCSI_DATA_OUT (1U<<1) +#define UDI_SCSI_NO_DISCONNECT (1U<<2) +/* SCSI Task Attributes */ +#define UDI_SCSI_SIMPLE_TASK 1 +#define UDI_SCSI_ORDERED_TASK 2 +#define UDI_SCSI_HEAD_OF_Q_TASK 3 +#define UDI_SCSI_ACA_TASK 4 +#define UDI_SCSI_UNTAGGED_TASK 5 + +typedef struct { + udi_status_t req_status; + udi_ubit8_t scsi_status; + udi_ubit8_t sense_status; +} udi_scsi_status_t; + +typedef struct { + udi_cb_t gcb; + udi_ubit8_t ctrl_func; + udi_ubit16_t queue_depth; +} udi_scsi_ctl_cb_t; +/* Values for ctrl_func */ +#define UDI_SCSI_CTL_ABORT_TASK_SET 1 +#define UDI_SCSI_CTL_CLEAR_TASK_SET 2 +#define UDI_SCSI_CTL_LUN_RESET 3 +#define UDI_SCSI_CTL_TGT_RESET 4 +#define UDI_SCSI_CTL_BUS_RESET 5 +#define UDI_SCSI_CTL_CLEAR_ACA 6 +#define UDI_SCSI_CTL_SET_QUEUE_DEPTH 7 +/* Control Block Group Number */ +#define UDI_SCSI_CTL_CB_NUM 3 + +typedef struct { + udi_cb_t gcb; + udi_ubit8_t event; + udi_buf_t *aen_data_buf; +} udi_scsi_event_cb_t; +/* Control Block Group Number */ +#define UDI_SCSI_EVENT_CB_NUM 4 + +typedef void udi_scsi_bind_ack_op_t(udi_scsi_bind_cb_t *cb, udi_ubit32_t hd_timeout_increase, udi_status_t status); +typedef void udi_scsi_unbind_ack_op_t(udi_scsi_bind_cb_t *cb); +typedef void udi_scsi_io_ack_op_t(udi_scsi_io_cb_t *cb); +typedef void udi_scsi_io_nak_op_t(udi_scsi_io_cb_t *cb); +typedef void udi_scsi_ctl_ack_op_t(udi_scsi_ctl_cb_t *cb, udi_status_t status); +typedef void udi_scsi_event_ind_op_t(udi_scsi_event_cb_t *cb); + +typedef void udi_scsi_bind_req_op_t(udi_scsi_bind_cb_t *cb, + udi_ubit16_t bind_flags, udi_ubit16_t queue_depth, + udi_ubit16_t max_sense_len, udi_ubit16_t aen_buf_size); +typedef void udi_scsi_unbind_req_op_t(udi_scsi_bind_cb_t *cb); +typedef void udi_scsi_io_req_op_t(udi_scsi_io_cb_t *cb); +typedef void udi_scsi_ctl_req_op_t(udi_scsi_ctl_cb_t *cb); +typedef void udi_scsi_event_res_op_t(udi_scsi_event_cb_t *cb); + +typedef const struct { + udi_channel_event_ind_op_t *channel_event_ind_op; + udi_scsi_bind_ack_op_t *bind_ack_op; + udi_scsi_unbind_ack_op_t *unbind_ack_op; + udi_scsi_io_ack_op_t *io_ack_op; + udi_scsi_io_nak_op_t *io_nak_op; + udi_scsi_ctl_ack_op_t *ctl_ack_op; + udi_scsi_event_ind_op_t *event_ind_op; +} udi_scsi_pd_ops_t; + +#define UDI_SCSI_PD_OPS_NUM 1 + +typedef const struct { + udi_channel_event_ind_op_t *channel_event_ind_op; + udi_scsi_bind_req_op_t *bind_req_op; + udi_scsi_unbind_req_op_t *unbind_req_op; + udi_scsi_io_req_op_t *io_req_op; + udi_scsi_ctl_req_op_t *ctl_req_op; + udi_scsi_event_res_op_t *event_res_op; +} udi_scsi_hd_ops_t; + +#define UDI_SCSI_HD_OPS_NUM 2 + +/* Bind Flags */ +#define UDI_SCSI_BIND_EXCLUSIVE (1U<<0) +#define UDI_SCSI_TEMP_BIND_EXCLUSIVE (1U<<1) + +extern void udi_scsi_bind_req(udi_scsi_bind_cb_t *cb, + udi_ubit16_t bind_flags, udi_ubit16_t queue_depth, + udi_ubit16_t max_sense_len, udi_ubit16_t aen_buf_size); +extern void udi_scsi_bind_ack(udi_scsi_bind_cb_t *cb, udi_ubit32_t hd_timeout_increase, udi_status_t status); +extern void udi_scsi_unbind_req(udi_scsi_bind_cb_t *cb); +extern void udi_scsi_unbind_ack(udi_scsi_bind_cb_t *cb); + +extern void udi_scsi_io_req(udi_scsi_io_cb_t *cb); +extern void udi_scsi_io_ack(udi_scsi_io_cb_t *cb); +extern void udi_scsi_io_nak(udi_scsi_io_cb_t *cb, udi_scsi_status_t status, udi_buf_t *sense_buf); +extern void udi_scsi_ctl_req(udi_scsi_ctl_cb_t *cb); +extern void udi_scsi_ctl_ack(udi_scsi_ctl_cb_t *cb, udi_status_t status); +extern void udi_scsi_event_ind(udi_scsi_event_cb_t *cb); +extern udi_scsi_event_ind_op_t udi_scsi_event_ind_unused; +extern void udi_scsi_event_res(udi_scsi_event_cb_t *cb); +extern void udi_scsi_inquiry_to_string(const udi_ubit8_t *inquiry_data, udi_size_t inquiry_len, char *str); + + +#endif + diff --git a/KernelLand/Modules/Interfaces/UDI/logging.c b/KernelLand/Modules/Interfaces/UDI/logging.c deleted file mode 100644 index 2e58e373..00000000 --- a/KernelLand/Modules/Interfaces/UDI/logging.c +++ /dev/null @@ -1,18 +0,0 @@ -/** - * \file logging.c - * \author John Hodge (thePowersGang) - */ -#include -#include - -// === PROTOTYPES === - -// === CODE === -void udi_log_write( udi_log_write_call_t *callback, udi_cb_t *gcb, - udi_trevent_t trace_event, udi_ubit8_t severity, udi_index_t meta_idx, - udi_status_t original_status, udi_ubit32_t msgnum, ... ) -{ - Log("UDI Log"); -} - -EXPORT(udi_log_write); diff --git a/KernelLand/Modules/Interfaces/UDI/main.c b/KernelLand/Modules/Interfaces/UDI/main.c index 05aa566b..7b36de96 100644 --- a/KernelLand/Modules/Interfaces/UDI/main.c +++ b/KernelLand/Modules/Interfaces/UDI/main.c @@ -6,12 +6,16 @@ #include #include #include +#include "udi_internal.h" // === PROTOTYPES === int UDI_Install(char **Arguments); int UDI_DetectDriver(void *Base); int UDI_LoadDriver(void *Base); +tUDI_DriverInstance *UDI_CreateInstance(tUDI_DriverModule *DriverModule); +tUDI_DriverRegion *UDI_InitRegion(tUDI_DriverInstance *Inst, udi_ubit16_t Index, udi_ubit16_t Type, size_t RDataSize); + // === GLOBALS === MODULE_DEFINE(0, VERSION, UDI, UDI_Install, NULL, NULL); tModuleLoader gUDI_Loader = { @@ -34,7 +38,17 @@ int UDI_Install(char **Arguments) */ int UDI_DetectDriver(void *Base) { - if( Binary_FindSymbol(Base, "udi_init_info", NULL) == 0) { + Uint unused; + + if( Binary_FindSymbol(Base, "udi_init_info", &unused) == 0) { + return 0; + } + if( Binary_FindSymbol(Base, "_udiprops", &unused) == 0 ) { + Log_Warning("UDI", "Driver has udi_init_info, but no _udiprops symbol"); + return 0; + } + if( Binary_FindSymbol(Base, "_udiprops_end", &unused) == 0) { + Log_Warning("UDI", "Driver has udi_init_info, but no _udiprops_end symbol"); return 0; } @@ -48,9 +62,7 @@ int UDI_LoadDriver(void *Base) { udi_init_t *info; char *udiprops = NULL; - Uint udiprops_size = 0; - int i; - // int j; + char *udiprops_end = 0; ENTER("pBase", Base); @@ -60,44 +72,10 @@ int UDI_LoadDriver(void *Base) return 0; } - if( Binary_FindSymbol(Base, "_udiprops", (Uint*)&udiprops) == 0 ) { - Log_Warning("UDI", "_udiprops is not defined, this is usually bad"); - } - else if( Binary_FindSymbol(Base, "_udiprops_size", &udiprops_size) == 0) { - Log_Warning("UDI", "_udiprops_size is not defined"); - } - else { - int i, j, nLines; - char **udipropsptrs; - - Log_Debug("UDI", "udiprops = %p, udiprops_size = 0x%x", udiprops, udiprops_size); - - Debug_HexDump("UDI_LoadDriver", udiprops, udiprops_size); - - nLines = 1; - for( i = 0; i < udiprops_size; i++ ) - { - if( udiprops[i] == '\0' ) - nLines ++; - } - - Log_Debug("UDI", "nLines = %i", nLines); - - udipropsptrs = malloc( sizeof(char*)*nLines ); - udipropsptrs[0] = udiprops; - j = 0; - for( i = 0; i < udiprops_size; i++ ) - { - if( udiprops[i] == '\0' ) { - //Log_Debug("UDI", "udipropsptrs[%i] = '%s'", j, udipropsptrs[j]); - udipropsptrs[j++] = &udiprops[i+1]; - } - } - Log_Debug("UDI", "udipropsptrs[%i] = '%s'", j, udipropsptrs[j]); - Log_Debug("UDI", "udiprops = \"%s\"", udiprops); - } - - + Binary_FindSymbol(Base, "_udiprops", (Uint*)&udiprops); + Binary_FindSymbol(Base, "_udiprops_end", (Uint*)&udiprops_end); + + #if 0 Log("primary_init_info = %p = {", info->primary_init_info); { Log(" .mgmt_ops = %p = {", info->primary_init_info->mgmt_ops); @@ -125,10 +103,16 @@ int UDI_LoadDriver(void *Base) Log(" .per_parent_paths = 0x%x", info->primary_init_info->per_parent_paths); } Log("}"); - Log("secondary_init_list = %p", info->secondary_init_list); + Log("secondary_init_list = %p {", info->secondary_init_list); + for( int i = 0; info->secondary_init_list && info->secondary_init_list[i].region_idx; i ++ ) + { + Log(" [%i] = { .region_idx=%i, .rdata_size=0x%x }", + info->secondary_init_list[i].region_idx, info->secondary_init_list[i].rdata_size); + } + LOG("}"); Log("ops_init_list = %p", info->ops_init_list); - for( i = 0; info->ops_init_list[i].ops_idx; i++ ) + for( int i = 0; info->ops_init_list[i].ops_idx; i++ ) { Log("info->ops_init_list[%i] = {", i); Log(" .ops_idx = 0x%x", info->ops_init_list[i].ops_idx); @@ -139,6 +123,163 @@ int UDI_LoadDriver(void *Base) // Log(" .op_flags = %p", info->ops_init_list[i].op_flags); Log("}"); } + #endif + + + // TODO: Multiple modules? + tUDI_DriverModule *driver_module = NEW(tUDI_DriverModule,); + driver_module->InitInfo = info; + + // - Parse udiprops + { + char **udipropsptrs; + + Log_Debug("UDI", "udiprops = %p, udiprops_end = %p", udiprops, udiprops_end); + size_t udiprops_size = udiprops_end - udiprops; + + int nLines = 1; + for( int i = 0; i < udiprops_size; i++ ) + { + if( udiprops[i] == '\0' ) + nLines ++; + } + + Log_Debug("UDI", "nLines = %i", nLines); + + udipropsptrs = NEW(char*,*nLines); + int line = 0; + udipropsptrs[line++] = udiprops; + for( int i = 0; i < udiprops_size; i++ ) + { + if( udiprops[i] == '\0' ) { + udipropsptrs[line++] = &udiprops[i+1]; + } + } + if(udipropsptrs[line-1] == &udiprops[udiprops_size]) + nLines --; + + for( int i = 0; i < nLines; i ++ ) + { + } + + // Parse out: + // 'message' into driver_module->Messages + // 'region' into driver_module->RegionTypes + // 'module' into driver_module->ModuleName + + int nMessages = 0; + int nLocales = 1; + int nRegionTypes = 0; + for( int i = 0; i < nLines; i ++ ) + { + const char *str = udipropsptrs[i]; + if( strncmp("module ", str, 7) == 0 ) { + driver_module->ModuleName = str + 7; + } + else if( strncmp("message ", str, 8) == 0 ) { + nMessages ++; + } + else if( strncmp("locale ", str, 7) == 0 ) { + nLocales ++; + } + else if( strncmp("region ", str, 7) == 0 ) { + nRegionTypes ++; + } + } + + // Allocate structures + driver_module->nMessages = nMessages; + driver_module->Messages = NEW(tUDI_PropMessage, *nMessages); + driver_module->nRegionTypes = nRegionTypes; + driver_module->RegionTypes = NEW(tUDI_PropRegion, *nRegionTypes); + + // Populate + int cur_locale = 0; + int msg_index = 0; + for( int i = 0; i < nLines; i ++ ) + { + const char *str = udipropsptrs[i]; + if( strncmp("module ", str, 7) == 0 ) { + driver_module->ModuleName = str + 7; + } + else if( strncmp("message ", str, 8) == 0 ) { + tUDI_PropMessage *msg = &driver_module->Messages[msg_index++]; + char *end; + msg->locale = cur_locale; + msg->index = strtoul(str+8, &end, 10); + if( *end != ' ' && *end != '\t' ) { + // Oops. + continue ; + } + while( isspace(*end) ) + end ++; + msg->string = end; + + Log_Debug("UDI", "Message %i/%i: '%s'", msg->locale, msg->index, msg->string); + } + else if( strncmp("locale ", str, 7) == 0 ) { + // TODO: Set locale + cur_locale = 1; + } + else if( strncmp("region ", str, 7) == 0 ) { + nRegionTypes ++; + } + else { + Log_Debug("UDI", "udipropsptrs[%i] = '%s'", i, udipropsptrs[i]); + } + } + + // Sort message list + // TODO: Sort message list + } + + int nSecondaryRgns = 0; + for( int i = 0; info->secondary_init_list && info->secondary_init_list[i].region_idx; i ++ ) + nSecondaryRgns ++; + driver_module->nSecondaryRegions = nSecondaryRgns; + + // Create initial driver instance + tUDI_DriverInstance *inst = UDI_CreateInstance(driver_module); + + for( int i = 0; i < 1+driver_module->nSecondaryRegions; i ++ ) + Log("Rgn %i: %p", i, inst->Regions[i]); + + // Send usage indication + udi_usage_cb_t ucb; + memset(&ucb, 0, sizeof(ucb)); + ucb.gcb.channel = inst->ManagementChannel; + udi_usage_ind(&ucb, UDI_RESOURCES_NORMAL); return 0; } + +tUDI_DriverInstance *UDI_CreateInstance(tUDI_DriverModule *DriverModule) +{ + tUDI_DriverInstance *inst = NEW_wA(tUDI_DriverInstance, Regions, (1+DriverModule->nSecondaryRegions)); + inst->Module = DriverModule; + inst->Regions[0] = UDI_InitRegion(inst, 0, 0, DriverModule->InitInfo->primary_init_info->rdata_size); + udi_secondary_init_t *sec_init = DriverModule->InitInfo->secondary_init_list; + if( sec_init ) + { + for( int i = 0; sec_init[i].region_idx; i ++ ) + { + inst->Regions[1+i] = UDI_InitRegion(inst, i, sec_init[i].region_idx, sec_init[i].rdata_size); + } + } + + inst->ManagementChannel = UDI_CreateChannel(METALANG_MGMT, 0, NULL, 0, inst, 0); + + return inst; +} + +tUDI_DriverRegion *UDI_InitRegion(tUDI_DriverInstance *Inst, udi_ubit16_t Index, udi_ubit16_t Type, size_t RDataSize) +{ +// ASSERTCR( RDataSize, <=, UDI_MIN_ALLOC_LIMIT, NULL ); + ASSERTCR( RDataSize, >, sizeof(udi_init_context_t), NULL ); + tUDI_DriverRegion *rgn = NEW(tUDI_DriverRegion,+RDataSize); + rgn->InitContext = (void*)(rgn+1); + rgn->InitContext->region_idx = Type; +// rgn->InitContext->limits + return rgn; +} + diff --git a/KernelLand/Modules/Interfaces/UDI/strmem.c b/KernelLand/Modules/Interfaces/UDI/strmem.c deleted file mode 100644 index 53cc933f..00000000 --- a/KernelLand/Modules/Interfaces/UDI/strmem.c +++ /dev/null @@ -1,22 +0,0 @@ -/** - * \file strmem.c - * \author John Hodge (thePowersGang) - */ -#include -#include - -// === EXPORTS === -EXPORT(udi_snprintf); - -// === CODE === -udi_size_t udi_snprintf(char *s, udi_size_t max_bytes, const char *format, ...) -{ - udi_size_t ret; - va_list args; - va_start(args, format); - - ret = vsnprintf(s, max_bytes, format, args); - - va_end(args); - return ret; -} diff --git a/KernelLand/Modules/Interfaces/UDI/udi_internal.h b/KernelLand/Modules/Interfaces/UDI/udi_internal.h new file mode 100644 index 00000000..3b49225e --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/udi_internal.h @@ -0,0 +1,98 @@ +/* + * Acess2 UDI Layer + * - By John Hodge (thePowersGang) + * + * udi_internal.h + * - Definitions for opaque structures + */ +#ifndef _UDI_INTERNAL_H_ +#define _UDI_INTERNAL_H_ + +#define NEW(type,extra) (type*)calloc(sizeof(type)extra,1) +#define NEW_wA(type,fld,cnt) NEW(type,+(sizeof(((type*)NULL)->fld[0])*cnt)) + +typedef struct sUDI_PropMessage tUDI_PropMessage; +typedef struct sUDI_PropRegion tUDI_PropRegion; + +typedef struct sUDI_DriverModule tUDI_DriverModule; +typedef struct sUDI_DriverInstance tUDI_DriverInstance; +typedef struct sUDI_DriverRegion tUDI_DriverRegion; + +struct sUDI_PropMessage +{ + int locale; + udi_ubit16_t index; + const char *string; +}; + +struct sUDI_PropRegion +{ + enum { + UDI_REGIONTYPE_NORMAL, + UDI_REGIONTYPE_FP, + } Type; + enum { + UDI_REGIONBINDING_STATIC, + UDI_REGIONBINDING_DYNAMIC, + } Binding; + enum { + UDI_REGIONPRIO_MED, + UDI_REGIONPRIO_LO, + UDI_REGIONPRIO_HI, + } Priority; + enum { + UDI_REGIONLATENCY_NONOVERRRUNABLE, + UDI_REGIONLATENCY_POWERFAIL, + UDI_REGIONLATENCY_OVERRUNNABLE, + UDI_REGIONLATENCY_RETRYABLE, + // non_overrunable + UDI_REGIONLATENCY_NONCTRITICAL, + } Latency; + udi_ubit32_t OverrunTime; + + +}; + +struct sUDI_DriverModule +{ + tUDI_DriverModule *Next; + void *Base; + + udi_init_t *InitInfo; + + const char *ModuleName; + int nMessages; + tUDI_PropMessage *Messages; // Sorted list + + int nRegionTypes; + tUDI_PropRegion *RegionTypes; + + int nSecondaryRegions; +}; + +struct sUDI_DriverInstance +{ + tUDI_DriverModule *Module; + udi_channel_t ManagementChannel; + tUDI_DriverRegion *Regions[]; +}; + +struct sUDI_DriverRegion +{ + udi_init_context_t *InitContext; +}; + +enum eUDI_MetaLang +{ + METALANG_MGMT, + METALANG_BUS +}; + +extern udi_channel_t UDI_CreateChannel(enum eUDI_MetaLang metalang, udi_index_t meta_ops_num, + tUDI_DriverInstance *ThisEnd, udi_index_t ThisOpsIndex, + tUDI_DriverInstance *OtherEnd, udi_index_t OtherOpsIndex); + +extern const void *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, enum eUDI_MetaLang metalang); + +#endif + diff --git a/KernelLand/Modules/Interfaces/UDI/buf.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/buf.c similarity index 100% rename from KernelLand/Modules/Interfaces/UDI/buf.c rename to KernelLand/Modules/Interfaces/UDI/udi_lib/buf.c diff --git a/KernelLand/Modules/Interfaces/UDI/cb.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/cb.c similarity index 100% rename from KernelLand/Modules/Interfaces/UDI/cb.c rename to KernelLand/Modules/Interfaces/UDI/udi_lib/cb.c diff --git a/KernelLand/Modules/Interfaces/UDI/imc.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/imc.c similarity index 100% rename from KernelLand/Modules/Interfaces/UDI/imc.c rename to KernelLand/Modules/Interfaces/UDI/udi_lib/imc.c diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/logging.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/logging.c new file mode 100644 index 00000000..4d91c624 --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/logging.c @@ -0,0 +1,62 @@ +/** + * \file logging.c + * \author John Hodge (thePowersGang) + * + * \brief UDI Tracing, Logging and Debug + */ +#include +#include + +void __udi_assert(const char *expr, const char *file, int line); + +// === EXPORTS === +EXPORT(udi_trace_write); +EXPORT(udi_log_write); +EXPORT(__udi_assert); +//EXPORT(udi_assert); +EXPORT(udi_debug_break); +EXPORT(udi_debug_printf); + +// === PROTOTYPES === + +// === CODE === +void udi_trace_write(udi_init_context_t *init_context, udi_trevent_t trace_event, udi_index_t meta_idx, udi_ubit32_t msgnum, ...) +{ + ENTER("pinit_context itrace_event imeta_idx imsgnum", + init_context, trace_event, meta_idx, msgnum); +// const char *format = UDI_GetMessage(init_context, msgnum); +// LOG("format = \"%s\"", format); + LEAVE('-'); +} + +void udi_log_write( udi_log_write_call_t *callback, udi_cb_t *gcb, + udi_trevent_t trace_event, udi_ubit8_t severity, udi_index_t meta_idx, + udi_status_t original_status, udi_ubit32_t msgnum, ... ) +{ + Log("UDI Log"); +} + +void __udi_assert(const char *expr, const char *file, int line) +{ + Log("UDI Assertion failure: %s:%i - %s", file, line, expr); + UNIMPLEMENTED(); +} + +void udi_assert(udi_boolean_t bool) +{ + UNIMPLEMENTED(); +} + +void udi_debug_break( udi_init_context_t *init_context, const char *message) +{ + UNIMPLEMENTED(); +} + +void udi_debug_printf( const char *format, ... ) +{ + va_list args; + va_start(args, format); + LogF("udi_debug_printf: "); + LogFV(format, args); + va_end(args); +} diff --git a/KernelLand/Modules/Interfaces/UDI/mem.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/mem.c similarity index 100% rename from KernelLand/Modules/Interfaces/UDI/mem.c rename to KernelLand/Modules/Interfaces/UDI/udi_lib/mem.c diff --git a/KernelLand/Modules/Interfaces/UDI/meta_gio.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_gio.c similarity index 100% rename from KernelLand/Modules/Interfaces/UDI/meta_gio.c rename to KernelLand/Modules/Interfaces/UDI/udi_lib/meta_gio.c diff --git a/KernelLand/Modules/Interfaces/UDI/meta_mgmt.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c similarity index 60% rename from KernelLand/Modules/Interfaces/UDI/meta_mgmt.c rename to KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c index 45a02c46..e34e3d9c 100644 --- a/KernelLand/Modules/Interfaces/UDI/meta_mgmt.c +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/meta_mgmt.c @@ -4,16 +4,56 @@ */ #include #include +#include "../udi_internal.h" // === EXPORTS === +EXPORT(udi_usage_ind); +EXPORT(udi_static_usage); +EXPORT(udi_usage_res); +EXPORT(udi_enumerate_req); +EXPORT(udi_enumerate_no_children); +EXPORT(udi_enumerate_ack); EXPORT(udi_devmgmt_req); EXPORT(udi_devmgmt_ack); EXPORT(udi_final_cleanup_req); EXPORT(udi_final_cleanup_ack); -EXPORT(udi_static_usage); -EXPORT(udi_enumerate_no_children); // === CODE === +void udi_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level) +{ + const udi_mgmt_ops_t *ops; + if( !(ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), METALANG_MGMT )) ) { + return ; + } + + ops->usage_ind_op(cb, resource_level); +} + +void udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level) +{ + UNIMPLEMENTED(); +} + +void udi_usage_res(udi_usage_cb_t *cb) +{ + UNIMPLEMENTED(); +} + +void udi_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level) +{ + UNIMPLEMENTED(); +} + +void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level) +{ + UNIMPLEMENTED(); +} + +void udi_enumerate_ack(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx) +{ + UNIMPLEMENTED(); +} + void udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID ) { ENTER("pcb imgmt_op iparent_ID", cb, mgmt_op, parent_ID); @@ -38,12 +78,3 @@ void udi_final_cleanup_ack(udi_mgmt_cb_t *cb) LEAVE('-'); } -void udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level) -{ - UNIMPLEMENTED(); -} - -void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level) -{ - UNIMPLEMENTED(); -} diff --git a/KernelLand/Modules/Interfaces/UDI/physio.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio.c similarity index 60% rename from KernelLand/Modules/Interfaces/UDI/physio.c rename to KernelLand/Modules/Interfaces/UDI/udi_lib/physio.c index 881c9f40..5d136a14 100644 --- a/KernelLand/Modules/Interfaces/UDI/physio.c +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio.c @@ -7,10 +7,19 @@ #include // === EXPORTS === +EXPORT(udi_dma_constraints_attr_set); EXPORT(udi_dma_constraints_attr_reset); EXPORT(udi_dma_constraints_free); // === CODE === +void udi_dma_constraints_attr_set(udi_dma_constraints_attr_set_call_t *callback, udi_cb_t *gcb, + udi_dma_constraints_t src_constraints, + const udi_dma_constraints_attr_spec_t *attr_list, udi_ubit16_t list_length, + udi_ubit8_t flags) +{ + UNIMPLEMENTED(); +} + void udi_dma_constraints_attr_reset( udi_dma_constraints_t constraints, udi_dma_constraints_attr_t attr_type diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/dma.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/dma.c new file mode 100644 index 00000000..1b1eecdb --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/dma.c @@ -0,0 +1,71 @@ +/** + * \file physio/dma.c + * \author John Hodge (thePowersGang) + */ +#include +#include +#include + +// === EXPORTS === +EXPORT(udi_dma_prepare); +EXPORT(udi_dma_buf_map); +EXPORT(udi_dma_buf_unmap); +EXPORT(udi_dma_mem_alloc); +EXPORT(udi_dma_sync); +EXPORT(udi_dma_scgth_sync); +EXPORT(udi_dma_mem_barrier); +EXPORT(udi_dma_free); +EXPORT(udi_dma_mem_to_buf); + +// === CODE === +void udi_dma_prepare(udi_dma_prepare_call_t *callback, udi_cb_t *gcb, + udi_dma_constraints_t constraints, udi_ubit8_t flags) +{ + UNIMPLEMENTED(); +} + +void udi_dma_buf_map(udi_dma_buf_map_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle, + udi_buf_t *buf, udi_size_t offset, udi_size_t len, udi_ubit8_t flags) +{ + UNIMPLEMENTED(); +} + +udi_buf_t *udi_dma_buf_unmap(udi_dma_handle_t dma_handle, udi_size_t new_buf_size) +{ + UNIMPLEMENTED(); + return NULL; +} + +void udi_dma_mem_alloc(udi_dma_mem_alloc_call_t *callback, udi_cb_t *gcb, + udi_dma_constraints_t constraints, udi_ubit8_t flags, + udi_ubit16_t nelements, udi_size_t element_size, udi_size_t max_gap) +{ + UNIMPLEMENTED(); +} + +void udi_dma_sync(udi_dma_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle, + udi_size_t offset, udi_size_t len, udi_ubit8_t flags) +{ + UNIMPLEMENTED(); +} + +void udi_dma_scgth_sync(udi_dma_scgth_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle) +{ + UNIMPLEMENTED(); +} + +void udi_dma_mem_barrier(udi_dma_handle_t dma_handle) +{ + UNIMPLEMENTED(); +} + +void udi_dma_free(udi_dma_handle_t dma_handle) +{ + UNIMPLEMENTED(); +} + +void udi_dma_mem_to_buf(udi_dma_mem_to_buf_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle, + udi_size_t src_off, udi_size_t src_len, udi_buf_t *dst_buf) +{ + UNIMPLEMENTED(); +} diff --git a/KernelLand/Modules/Interfaces/UDI/physio/meta_bus.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_bus.c similarity index 100% rename from KernelLand/Modules/Interfaces/UDI/physio/meta_bus.c rename to KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_bus.c diff --git a/KernelLand/Modules/Interfaces/UDI/physio/meta_intr.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_intr.c similarity index 67% rename from KernelLand/Modules/Interfaces/UDI/physio/meta_intr.c rename to KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_intr.c index f4f50961..0c0ef6cb 100644 --- a/KernelLand/Modules/Interfaces/UDI/physio/meta_intr.c +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/meta_intr.c @@ -9,11 +9,12 @@ // === EXPORTS === EXPORT(udi_intr_attach_req); EXPORT(udi_intr_attach_ack); -EXPORT(udi_intr_attach_ack_unused); +//EXPORT(udi_intr_attach_ack_unused); EXPORT(udi_intr_detach_req); EXPORT(udi_intr_detach_ack); -EXPORT(udi_intr_detach_ack_unused); +//EXPORT(udi_intr_detach_ack_unused); EXPORT(udi_intr_event_ind); +EXPORT(udi_intr_event_rdy); // === CODE === void udi_intr_attach_req(udi_intr_attach_cb_t *intr_attach_cb) @@ -24,10 +25,10 @@ void udi_intr_attach_ack(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t stat { UNIMPLEMENTED(); } -void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status) -{ - UNIMPLEMENTED(); -} +//void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status) +//{ +// UNIMPLEMENTED(); +//} void udi_intr_detach_req(udi_intr_detach_cb_t *intr_detach_cb) { @@ -37,12 +38,17 @@ void udi_intr_detach_ack(udi_intr_detach_cb_t *intr_detach_cb) { UNIMPLEMENTED(); } -void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb) +//void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb) +//{ +// UNIMPLEMENTED(); +//} + +void udi_intr_event_ind(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags) { UNIMPLEMENTED(); } -void udi_intr_event_ind(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags) +void udi_intr_event_rdy(udi_intr_event_cb_t *intr_event_cb) { UNIMPLEMENTED(); } diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/pio.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/pio.c new file mode 100644 index 00000000..03849ae1 --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio/pio.c @@ -0,0 +1,55 @@ +/** + * \file physio/pio.c + * \author John Hodge (thePowersGang) + */ +#include +#include +#include + +// === EXPORTS === +EXPORT(udi_pio_map); +EXPORT(udi_pio_unmap); +EXPORT(udi_pio_atmic_sizes); +EXPORT(udi_pio_abort_sequence); +EXPORT(udi_pio_trans); +EXPORT(udi_pio_probe); + +// === CODE === +void udi_pio_map(udi_pio_map_call_t *callback, udi_cb_t *gcb, + udi_ubit32_t regset_idx, udi_ubit32_t base_offset, udi_ubit32_t length, + udi_pio_trans_t *trans_list, udi_ubit16_t list_length, + udi_ubit16_t pio_attributes, udi_ubit32_t pace, udi_index_t serialization_domain) +{ + UNIMPLEMENTED(); +} + +void udi_pio_unmap(udi_pio_handle_t pio_handle) +{ + UNIMPLEMENTED(); +} + +udi_ubit32_t udi_pio_atmic_sizes(udi_pio_handle_t pio_handle) +{ + UNIMPLEMENTED(); + return 0; +} + +void udi_pio_abort_sequence(udi_pio_handle_t pio_handle, udi_size_t scratch_requirement) +{ + UNIMPLEMENTED(); +} + +void udi_pio_trans(udi_pio_trans_call_t *callback, udi_cb_t *gcb, + udi_pio_handle_t pio_handle, udi_index_t start_label, + udi_buf_t *buf, void *mem_ptr) +{ + UNIMPLEMENTED(); +} + +void udi_pio_probe(udi_pio_probe_call_t *callback, udi_cb_t *gcb, + udi_pio_handle_t pio_handle, void *mem_ptr, udi_ubit32_t pio_offset, + udi_ubit8_t tran_size, udi_ubit8_t direction) +{ + UNIMPLEMENTED(); +} + diff --git a/KernelLand/Modules/Interfaces/UDI/physio_main.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/physio_main.c similarity index 100% rename from KernelLand/Modules/Interfaces/UDI/physio_main.c rename to KernelLand/Modules/Interfaces/UDI/udi_lib/physio_main.c diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/queues.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/queues.c new file mode 100644 index 00000000..9e32fd7d --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/queues.c @@ -0,0 +1,27 @@ +/** + * \file queues.c + * \author John Hodge (thePowersGang) + * + * \brief UDI Queue Primatives + */ +#include +#include + +// === EXPORTS === +EXPORT(udi_enqueue); +EXPORT(udi_dequeue); + +// === CODE === +void udi_enqueue(udi_queue_t *new_el, udi_queue_t *old_el) +{ + new_el->next = old_el->next; + new_el->prev = old_el; + old_el->next = new_el; + old_el->next->prev = new_el; +} +udi_queue_t *udi_dequeue(udi_queue_t *element) +{ + element->next->prev = element->prev; + element->prev->next = element->next; + return element; +} diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/scsi.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/scsi.c new file mode 100644 index 00000000..0e8a8ab2 --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/scsi.c @@ -0,0 +1,78 @@ +/* + */ +#include +#include +#include + +// === EXPORTS === +EXPORT(udi_scsi_bind_req); +EXPORT(udi_scsi_bind_ack); +EXPORT(udi_scsi_unbind_req); +EXPORT(udi_scsi_unbind_ack); +EXPORT(udi_scsi_io_req); +EXPORT(udi_scsi_io_ack); +EXPORT(udi_scsi_io_nak); +EXPORT(udi_scsi_ctl_req); +EXPORT(udi_scsi_ctl_ack); +EXPORT(udi_scsi_event_ind); +EXPORT(udi_scsi_event_ind_unused); +EXPORT(udi_scsi_event_res); +EXPORT(udi_scsi_inquiry_to_string); + +// === CODE === +void udi_scsi_bind_req(udi_scsi_bind_cb_t *cb, + udi_ubit16_t bind_flags, udi_ubit16_t queue_depth, + udi_ubit16_t max_sense_len, udi_ubit16_t aen_buf_size) +{ + UNIMPLEMENTED(); +} +void udi_scsi_bind_ack(udi_scsi_bind_cb_t *cb, udi_ubit32_t hd_timeout_increase, udi_status_t status) +{ + UNIMPLEMENTED(); +} +void udi_scsi_unbind_req(udi_scsi_bind_cb_t *cb) +{ + UNIMPLEMENTED(); +} +void udi_scsi_unbind_ack(udi_scsi_bind_cb_t *cb) +{ + UNIMPLEMENTED(); +} + +void udi_scsi_io_req(udi_scsi_io_cb_t *cb) +{ + UNIMPLEMENTED(); +} +void udi_scsi_io_ack(udi_scsi_io_cb_t *cb) +{ + UNIMPLEMENTED(); +} +void udi_scsi_io_nak(udi_scsi_io_cb_t *cb, udi_scsi_status_t status, udi_buf_t *sense_buf) +{ + UNIMPLEMENTED(); +} +void udi_scsi_ctl_req(udi_scsi_ctl_cb_t *cb) +{ + UNIMPLEMENTED(); +} +void udi_scsi_ctl_ack(udi_scsi_ctl_cb_t *cb, udi_status_t status) +{ + UNIMPLEMENTED(); +} +void udi_scsi_event_ind(udi_scsi_event_cb_t *cb) +{ + UNIMPLEMENTED(); +} +void udi_scsi_event_ind_unused(udi_scsi_event_cb_t *cb) +{ + UNIMPLEMENTED(); + udi_scsi_event_res(cb); +} +void udi_scsi_event_res(udi_scsi_event_cb_t *cb) +{ + UNIMPLEMENTED(); +} +void udi_scsi_inquiry_to_string(const udi_ubit8_t *inquiry_data, udi_size_t inquiry_len, char *str) +{ + UNIMPLEMENTED(); +} diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/strmem.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/strmem.c new file mode 100644 index 00000000..870191d7 --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/strmem.c @@ -0,0 +1,75 @@ +/** + * \file strmem.c + * \author John Hodge (thePowersGang) + */ +#include +#include + +// === EXPORTS === +EXPORTAS(strlen, udi_strlen); +EXPORTAS(strcat, udi_strcat); +EXPORTAS(strncat, udi_strncat); +EXPORTAS(strcmp, udi_strcmp); +EXPORTAS(strncmp, udi_strncmp); +EXPORTAS(memcmp, udi_memcmp); +EXPORTAS(strcpy, udi_strcpy); +EXPORTAS(strncpy, udi_strncpy); +EXPORTAS(memcpy, udi_memcpy); +EXPORTAS(memmove, udi_memmove); +EXPORT(udi_strncpy_rtrim); +EXPORTAS(strchr, udi_strchr); +EXPORTAS(strrchr, udi_strrchr); +EXPORT(udi_memchr); +EXPORTAS(memset, udi_memset); +EXPORT(udi_strtou32); +EXPORT(udi_snprintf); +EXPORT(udi_vsnprintf); + +// === CODE === +char *udi_strncpy_rtrim(char *s1, const char *s2, udi_size_t n) +{ + char *dst = s1; + while( n-- ) + { + *dst++ = *s2++; + } + while( dst > s1 && isspace(*--dst) ) + ; + dst ++; + *dst = '\0'; + return s1; +} + +void *udi_memchr(const void *s, udi_ubit8_t c, udi_size_t n) +{ + const udi_ubit8_t *p = s; + while(n--) + { + if( *p == c ) + return (void*)p; + p ++; + } + return NULL; +} + +udi_ubit32_t udi_strtou32(const char *s, char **endptr, int base) +{ + return strtoul(s, endptr, base); +} + +udi_size_t udi_snprintf(char *s, udi_size_t max_bytes, const char *format, ...) +{ + udi_size_t ret; + va_list args; + va_start(args, format); + + ret = udi_vsnprintf(s, max_bytes, format, args); + + va_end(args); + return ret; +} +udi_size_t udi_vsnprintf(char *s, udi_size_t max_bytes, const char *format, va_list ap) +{ + // TODO: This should support some stuff Acess doesn't + return vsnprintf(s, max_bytes, format, ap); +} diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/time.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/time.c new file mode 100644 index 00000000..3d82c14e --- /dev/null +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/time.c @@ -0,0 +1,45 @@ +/** + * \file time.c + * \author John Hodge (thePowersGang) + */ +#include +#include + +// === EXPORTS === +EXPORT(udi_timer_start); +EXPORT(udi_timer_start_repeating); +EXPORT(udi_timer_cancel); +EXPORT(udi_time_current); +EXPORT(udi_time_between); +EXPORT(udi_time_since); + +// === CODE === +void udi_timer_start(udi_timer_expired_call_t *callback, udi_cb_t *gcb, udi_time_t interval) +{ + UNIMPLEMENTED(); +} +void udi_timer_start_repeating(udi_timer_tick_call_t *callback, udi_cb_t *gcb, udi_time_t interval) +{ + UNIMPLEMENTED(); +} +void udi_timer_cancel(udi_cb_t *gcb) +{ + UNIMPLEMENTED(); +} + +udi_timestamp_t udi_time_current(void) +{ + return now(); +} +udi_time_t udi_time_between(udi_timestamp_t start_time, udi_timestamp_t end_time) +{ + udi_time_t ret; + tTime delta = end_time - start_time; + ret.seconds = delta / 1000; + ret.nanoseconds = (delta % 1000) * 1000 * 1000; + return ret; +} +udi_time_t udi_time_since(udi_timestamp_t start_time) +{ + return udi_time_between(start_time, udi_time_current()); +} -- 2.20.1