typedef Uint tUID;
typedef Uint tGID;
typedef Sint64 tTimestamp;
+typedef Sint64 tTime;
typedef struct sShortSpinlock tShortSpinlock;
-typedef struct sMutex tMutex;
-
-struct sMutex {
- tShortSpinlock Protector; //!< Protector for the lock strucure
- const char *Name; //!< Human-readable name
- struct sThread *volatile Owner; //!< Owner of the lock (set upon getting the lock)
- struct sThread *Waiting; //!< Waiting threads
- struct sThread *LastWaiting; //!< Waiting threads
-};
// --- Helper Macros ---
/**
*/
/**
- * \name Per-Process Configuration Settings
+ * \name Per-Thread Configuration Settings
* \{
*/
enum eConfigTypes {
CFG_VFS_CWD,
CFG_VFS_MAXFILES,
CFG_VFS_CHROOT,
+ CFG_ERRNO,
NUM_CFG_ENTRIES
};
#define CFGINT(id) (*Threads_GetCfgPtr(id))
#define CFGPTR(id) (*(void**)Threads_GetCfgPtr(id))
+
+#define errno (CFGINT(CFG_ERRNO))
/**
* \}
*/
// === FUNCTIONS ===
// --- IRQs ---
extern int IRQ_AddHandler(int Num, void (*Callback)(int));
+extern void IRQ_RemHandler(int Handle);
// --- Logging ---
extern void Log_KernelPanic(const char *Ident, const char *Message, ...);
* \return Reference count for the page
*/
extern int MM_GetRefCount(tPAddr PAddr);
+/**
+ * \brief Set the node associated with a page
+ * \param PAddr Physical address of page
+ * \param Node Node pointer (tVFS_Node)
+ * \return Boolean failure
+ * \retval 0 Success
+ * \retval 1 Page not allocated
+ */
+extern int MM_SetPageNode(tPAddr PAddr, void *Node);
+/**
+ * \brief Get the node associated with a page
+ * \param PAddr Physical address of page
+ * \param Node Node pointer (tVFS_Node) destination
+ * \return Boolean failure
+ * \retval 0 Success
+ * \retval 1 Page not allocated
+ */
+extern int MM_GetPageNode(tPAddr PAddr, void **Node);
/**
* \}
*/
* \name Endianness Swapping
* \{
*/
-extern Uint16 LittleEndian16(Uint16 Val);
-extern Uint16 BigEndian16(Uint16 Val);
-extern Uint32 LittleEndian32(Uint32 Val);
-extern Uint32 BigEndian32(Uint32 Val);
+#ifdef __BIG_ENDIAN__
+#define LittleEndian16(_val) SwapEndian16(_val)
+#define LittleEndian32(_val) SwapEndian32(_val)
+#define BigEndian16(_val) (_val)
+#define BigEndian32(_val) (_val)
+#else
+#define LittleEndian16(_val) (_val)
+#define LittleEndian32(_val) (_val)
+#define BigEndian16(_val) SwapEndian16(_val)
+#define BigEndian32(_val) SwapEndian32(_val)
+#endif
+extern Uint16 SwapEndian16(Uint16 Val);
+extern Uint32 SwapEndian32(Uint32 Val);
/**
* \}
*/
extern size_t strlen(const char *Str);
extern char *strcpy(char *__dest, const char *__src);
extern char *strncpy(char *__dest, const char *__src, size_t max);
+extern char *strcat(char *__dest, const char *__src);
+extern char *strncat(char *__dest, const char *__src, size_t n);
extern int strcmp(const char *__str1, const char *__str2);
extern int strncmp(const char *Str1, const char *Str2, size_t num);
extern int strucmp(const char *Str1, const char *Str2);
-//extern char *strdup(const char *Str);
-#define strdup(Str) _strdup(_MODULE_NAME_"/"__FILE__, __LINE__, (Str))
+// strdup macro is defined in heap.h
extern char *_strdup(const char *File, int Line, const char *Str);
extern char **str_split(const char *__str, char __ch);
extern char *strchr(const char *__s, int __c);
* \{
*/
extern int Proc_SpawnWorker(void);
-extern int Proc_Spawn(char *Path);
+extern int Proc_Spawn(const char *Path);
extern void Threads_Exit(int TID, int Status);
extern void Threads_Yield(void);
extern void Threads_Sleep(void);
extern int SpawnTask(tThreadFunction Function, void *Arg);
extern Uint *Threads_GetCfgPtr(int Id);
extern int Threads_SetName(const char *NewName);
-extern int Mutex_Acquire(tMutex *Mutex);
-extern void Mutex_Release(tMutex *Mutex);
-extern int Mutex_IsLocked(tMutex *Mutex);
/**
* \}
*/
#include <binary_ext.h>
#include <vfs_ext.h>
-#include <adt.h>
+#include <mutex.h>
#endif