From c11bc9811d2856f6da9319e1a2a0c244332b861a Mon Sep 17 00:00:00 2001 From: John Hodge Date: Thu, 14 Jan 2010 23:03:44 +0800 Subject: [PATCH] More work on UDI support, still doesn't load pseudud yet - Also fixed the FAT ReadDir bug (bad treatment of SPC==1) --- Kernel/Makefile.BuildNum | 2 +- Kernel/vfs/fs/fat.c | 6 +- Modules/UDI/Makefile | 3 +- Modules/UDI/imc.c | 72 ++++++++++++++++++++++ Modules/UDI/include/udi_imc.h | 92 +++++++++++++++++++++++++++++ Modules/UDI/include/udi_meta_mgmt.h | 38 ++++++++---- Modules/UDI/include/udi_strmem.h | 44 ++++++++++++++ Modules/UDI/meta_mgmt.c | 38 ++++++++++++ Modules/UDI/strmem.c | 17 ++++++ 9 files changed, 295 insertions(+), 17 deletions(-) create mode 100644 Modules/UDI/imc.c create mode 100644 Modules/UDI/include/udi_imc.h create mode 100644 Modules/UDI/include/udi_strmem.h create mode 100644 Modules/UDI/meta_mgmt.c create mode 100644 Modules/UDI/strmem.c diff --git a/Kernel/Makefile.BuildNum b/Kernel/Makefile.BuildNum index cd91d84c..740bcb0c 100644 --- a/Kernel/Makefile.BuildNum +++ b/Kernel/Makefile.BuildNum @@ -1 +1 @@ -BUILD_NUM = 1315 +BUILD_NUM = 1321 diff --git a/Kernel/vfs/fs/fat.c b/Kernel/vfs/fs/fat.c index 984c9b4f..c840bdde 100644 --- a/Kernel/vfs/fs/fat.c +++ b/Kernel/vfs/fs/fat.c @@ -648,14 +648,12 @@ char *FAT_ReadDir(tVFS_Node *dirNode, int dirpos) offset += (cluster - 2) * disk->bootsect.spc; } // Sector in cluster - if(disk->bootsect.spc == 1) - offset += (dirpos / 16); - else + if(disk->bootsect.spc != 1) offset += (dirpos / 16) % disk->bootsect.spc; // Offset in sector a = dirpos % 16; - LOG("offset=%i, a=%i", (Uint)offset, a); + LOG("offset=%i, a=%i", offset, a); // Read Sector VFS_ReadAt(disk->fileHandle, offset*512, 512, fileinfo); // Read Dir Data diff --git a/Modules/UDI/Makefile b/Modules/UDI/Makefile index 5f9bd7ce..f553ad96 100644 --- a/Modules/UDI/Makefile +++ b/Modules/UDI/Makefile @@ -2,7 +2,8 @@ # CPPFLAGS = -I./include -OBJ = main.o logging.o +OBJ = main.o logging.o strmem.o imc.o +OBJ += meta_mgmt.o NAME = UDI -include ../Makefile.tpl diff --git a/Modules/UDI/imc.c b/Modules/UDI/imc.c new file mode 100644 index 00000000..2691260d --- /dev/null +++ b/Modules/UDI/imc.c @@ -0,0 +1,72 @@ +/** + * \file imc.c + * \author John Hodge (thePowersGang) + */ +#include +#include +#include + +// === CODE === +/** + */ +void udi_channel_anchor( + udi_channel_anchor_call_t *callback, udi_cb_t *gcb, + udi_channel_t channel, udi_index_t ops_idx, void *channel_context + ) +{ + Warning("%s Unimplemented", __func__); +} + +/** + */ +extern void udi_channel_spawn( + udi_channel_spawn_call_t *callback, udi_cb_t *gcb, + udi_channel_t channel, udi_index_t spawn_idx, + udi_index_t ops_idx, void *channel_context + ) +{ + Warning("%s Unimplemented", __func__); +} + +/** + * + */ +void udi_channel_set_context( + udi_channel_t target_channel, void *channel_context + ) +{ + Warning("%s Unimplemented", __func__); +} + +void udi_channel_op_abort( + udi_channel_t target_channel, udi_cb_t *orig_cb + ) +{ + Warning("%s Unimplemented", __func__); +} + +void udi_channel_close(udi_channel_t channel) +{ + Warning("%s Unimplemented", __func__); +} + +void udi_channel_event_ind(udi_channel_event_cb_t *cb) +{ + udi_channel_event_complete(cb, UDI_OK); +} + +void udi_channel_event_complete( + udi_channel_event_cb_t *cb, udi_status_t status + ) +{ + Warning("%s Unimplemented", __func__); +} + +// === EXPORTS === +EXPORT(udi_channel_anchor); +EXPORT(udi_channel_spawn); +EXPORT(udi_channel_set_context); +EXPORT(udi_channel_op_abort); +EXPORT(udi_channel_close); +EXPORT(udi_channel_event_ind); +EXPORT(udi_channel_event_complete); diff --git a/Modules/UDI/include/udi_imc.h b/Modules/UDI/include/udi_imc.h new file mode 100644 index 00000000..e5b3f3bb --- /dev/null +++ b/Modules/UDI/include/udi_imc.h @@ -0,0 +1,92 @@ +/** + * \file udi_imc.h + * \brief Inter-Module Communication + */ +#ifndef _UDI_IMC_H_ +#define _UDI_IMC_H_ + +typedef void udi_channel_anchor_call_t(udi_cb_t *gcb, udi_channel_t anchored_channel); +typedef void udi_channel_spawn_call_t(udi_cb_t *gcb, udi_channel_t new_channel); + +typedef struct udi_channel_event_cb_s udi_channel_event_cb_t; + +typedef void udi_channel_event_ind_op_t(udi_channel_event_cb_t *cb); + +/** + * \brief Anchors a channel end to the current region + */ +extern void udi_channel_anchor( + udi_channel_anchor_call_t *callback, udi_cb_t *gcb, + udi_channel_t channel, udi_index_t ops_idx, void *channel_context + ); + +/** + * \brief Created a new channel between two regions + */ +extern void udi_channel_spawn( + udi_channel_spawn_call_t *callback, + udi_cb_t *gcb, + udi_channel_t channel, + udi_index_t spawn_idx, + udi_index_t ops_idx, + void *channel_context + ); + +/** + * \brief Attaches a new context pointer to the current channel + */ +extern void udi_channel_set_context( + udi_channel_t target_channel, + void *channel_context + ); +/** + * \brief + */ +extern void udi_channel_op_abort( + udi_channel_t target_channel, + udi_cb_t *orig_cb + ); + +/** + * \brief Closes an open channel + */ +extern void udi_channel_close(udi_channel_t channel); + +/** + * \brief Describes a channel event + */ +struct udi_channel_event_cb_s +{ + udi_cb_t gcb; + udi_ubit8_t event; + union { + struct { + udi_cb_t *bind_cb; + } internal_bound; + struct { + udi_cb_t *bind_cb; + udi_ubit8_t parent_ID; + udi_buf_path_t *path_handles; + } parent_bound; + udi_cb_t *orig_cb; + } params; +}; +/* Channel event types */ +#define UDI_CHANNEL_CLOSED 0 +#define UDI_CHANNEL_BOUND 1 +#define UDI_CHANNEL_OP_ABORTED 2 + +/** + * \brief Proxy function + */ +extern void udi_channel_event_ind(udi_channel_event_cb_t *cb); + +/** + * \brief Called when channel event is completed + */ +extern void udi_channel_event_complete( + udi_channel_event_cb_t *cb, udi_status_t status + ); + + +#endif diff --git a/Modules/UDI/include/udi_meta_mgmt.h b/Modules/UDI/include/udi_meta_mgmt.h index 320f0eb1..f524bea6 100644 --- a/Modules/UDI/include/udi_meta_mgmt.h +++ b/Modules/UDI/include/udi_meta_mgmt.h @@ -69,19 +69,8 @@ typedef void udi_enumerate_ack_op_t(udi_enumerate_cb_t *cb, udi_ubit8_t enumerat * \{ */ typedef void udi_devmgmt_req_op_t(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID); -/* Values for mgmt_op */ -#define UDI_DMGMT_PREPARE_TO_SUSPEND 1 -#define UDI_DMGMT_SUSPEND 2 -#define UDI_DMGMT_SHUTDOWN 3 -#define UDI_DMGMT_PARENT_SUSPENDED 4 -#define UDI_DMGMT_RESUME 5 -#define UDI_DMGMT_UNBIND 6 typedef void udi_devmgmt_ack_op_t(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status); -/* Values for flags */ -#define UDI_DMGMT_NONTRANSPARENT (1U<<0) -/* Meta-Specific Status Codes */ -#define UDI_DMGMT_STAT_ROUTING_CHANGE (UDI_STAT_META_SPECIFIC|1) /** * \} */ @@ -137,4 +126,31 @@ struct udi_enumerate_cb_s /* Special parent_ID filter values */ #define UDI_ANY_PARENT_ID 0 +/** + * \brief + */ +extern void udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID ); +/** + * \brief Values for ::udi_devmgmt_req \a mgmt_op + */ +enum eDMGMT +{ + UDI_DMGMT_PREPARE_TO_SUSPEND = 1, + UDI_DMGMT_SUSPEND, + UDI_DMGMT_SHUTDOWN, + UDI_DMGMT_PARENT_SUSPENDED, + UDI_DMGMT_RESUME, + UDI_DMGMT_UNBIND +}; + +extern void udi_devmgmt_ack(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status); +//!\brief Values for flags +#define UDI_DMGMT_NONTRANSPARENT (1U<<0) +//!\brief Meta-Specific Status Codes +#define UDI_DMGMT_STAT_ROUTING_CHANGE (UDI_STAT_META_SPECIFIC|1) + +extern void udi_final_cleanup_req(udi_mgmt_cb_t *cb); +extern void udi_final_cleanup_ack(udi_mgmt_cb_t *cb); + + #endif diff --git a/Modules/UDI/include/udi_strmem.h b/Modules/UDI/include/udi_strmem.h new file mode 100644 index 00000000..f540a3ea --- /dev/null +++ b/Modules/UDI/include/udi_strmem.h @@ -0,0 +1,44 @@ +/** + * \file udi_strmem.h + */ +#ifndef _UDI_STRMEM_H_ +#define _UDI_STRMEM_H_ + +/** + * \brief Gets the length of a C style string + */ +extern udi_size_t udi_strlen(const char *s); + +/** + * \brief Appends to a string + */ +extern char *udi_strcat(char *s1, const char *s2); +extern char *udi_strncat(char *s1, const char *s2, udi_size_t n); + +/** + * \brief Compares Strings/Memory + */ +extern udi_sbit8_t udi_strcmp(const char *s1, const char *s2); +extern udi_sbit8_t udi_strncmp(const char *s1, const char *s2, udi_size_t n); +extern udi_sbit8_t udi_memcmp(const void *s1, const void *s2, udi_size_t n); + +extern char *udi_strcpy(char *s1, const char *s2); +extern char *udi_strncpy(char *s1, const char *s2, udi_size_t n); +extern void *udi_memcpy(void *s1, const void *s2, udi_size_t n); +extern void *udi_memmove(void *s1, const void *s2, udi_size_t n); + +extern char *udi_strncpy_rtrim(char *s1, const char *s2, udi_size_t n); + +extern char *udi_strchr(const char *s, char c); +extern char *udi_strrchr(const char *s, char c); +extern void *udi_memchr (const void *s, udi_ubit8_t c, udi_size_t n); + +extern void *udi_memset(void *s, udi_ubit8_t c, udi_size_t n); +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, ...); + + + +#endif diff --git a/Modules/UDI/meta_mgmt.c b/Modules/UDI/meta_mgmt.c new file mode 100644 index 00000000..44531ddc --- /dev/null +++ b/Modules/UDI/meta_mgmt.c @@ -0,0 +1,38 @@ +/** + * \file meta_mgmt.c + * \author John Hodge (thePowersGang) + */ +#include +#include +#include + +// === CODE === +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); + LEAVE('-'); +} + +void udi_devmgmt_ack(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status) +{ + ENTER("pcb xflags istatus", cb, flags, status); + LEAVE('-'); +} + +void udi_final_cleanup_req(udi_mgmt_cb_t *cb) +{ + ENTER("pcb", cb); + LEAVE('-'); +} + +void udi_final_cleanup_ack(udi_mgmt_cb_t *cb) +{ + ENTER("pcb", cb); + LEAVE('-'); +} + +// === EXPORTS === +EXPORT(udi_devmgmt_req); +EXPORT(udi_devmgmt_ack); +EXPORT(udi_final_cleanup_req); +EXPORT(udi_final_cleanup_ack); diff --git a/Modules/UDI/strmem.c b/Modules/UDI/strmem.c new file mode 100644 index 00000000..23785d6a --- /dev/null +++ b/Modules/UDI/strmem.c @@ -0,0 +1,17 @@ +/** + * \file strmem.c + * \author John Hodge (thePowersGang) + */ +#include +#include +#include + +// === CODE === +udi_size_t udi_snprintf(char *s, udi_size_t max_bytes, const char *format, ...) +{ + s[0] = '\0'; + return 0; +} + +// === EXPORTS === +EXPORT(udi_snprintf); -- 2.20.1