X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Finclude%2Facess.h;h=5df49c121568b50a9d8981c7e0d107b10df5d309;hb=62747dec23ae7ee6531ebf8e3f307726e810e84c;hp=a2d406b55e02ba816a571c08229c5c6e39244283;hpb=e573d30162c179edc6de7b7c8364a617d9f25f77;p=tpg%2Facess2.git diff --git a/Kernel/include/acess.h b/Kernel/include/acess.h index a2d406b5..5df49c12 100644 --- a/Kernel/include/acess.h +++ b/Kernel/include/acess.h @@ -7,9 +7,13 @@ #define NULL ((void*)0) #define PACKED __attribute__((packed)) +#define NORETURN __attribute__((noreturn)) #define UNUSED(x) UNUSED_##x __attribute__((unused)) #define offsetof(st, m) ((Uint)((char *)&((st *)(0))->m - (char *)0 )) +#define TRUE 1 +#define FALSE 0 + #include #include #include "errno.h" @@ -22,15 +26,7 @@ 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 -}; +typedef int bool; // --- Helper Macros --- /** @@ -42,13 +38,17 @@ struct sMutex { #define STR(x) #x #define EXPAND_STR(x) STR(x) +extern char __buildnum[]; +#define BUILD_NUM ((int)(Uint)&__buildnum) +extern const char gsGitHash[]; + #define VER2(major,minor) ((((major)&0xFF)<<8)|((minor)&0xFF)) /** * \} */ /** - * \name Per-Process Configuration Settings + * \name Per-Thread Configuration Settings * \{ */ enum eConfigTypes { @@ -61,10 +61,13 @@ enum eConfigs { 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)) /** * \} */ @@ -108,7 +111,8 @@ typedef struct sKernelSymbol { // === FUNCTIONS === // --- IRQs --- -extern int IRQ_AddHandler(int Num, void (*Callback)(int)); +extern int IRQ_AddHandler(int Num, void (*Callback)(int, void*), void *Ptr); +extern void IRQ_RemHandler(int Handle); // --- Logging --- extern void Log_KernelPanic(const char *Ident, const char *Message, ...); @@ -159,6 +163,16 @@ extern void Debug_HexDump(const char *Header, const void *Data, Uint Length); */ // --- IO --- +#if NO_IO_BUS +#define inb(a) (Log_Panic("Arch", "ARMv7 does not support in*/out* (%s:%i)", __FILE__, __LINE__),0) +#define inw(a) inb(a) +#define ind(a) inb(a) +#define inq(a) inb(a) +#define outb(a,b) inb(a) +#define outw(a,b) inb(a) +#define outd(a,b) inb(a) +#define outq(a,b) inb(a) +#else /** * \name I/O Memory Access * \{ @@ -174,7 +188,7 @@ extern Uint64 inq(Uint16 Port); /** * \} */ - +#endif // --- Memory Management --- /** * \name Memory Management @@ -284,6 +298,24 @@ extern void MM_DerefPhys(tPAddr PAddr); * \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); /** * \} */ @@ -294,10 +326,10 @@ extern int MM_GetRefCount(tPAddr PAddr); * \{ */ extern int memcmp(const void *m1, const void *m2, size_t count); -extern void *memcpy(void *dest, const void *src, size_t count); -extern void *memcpyd(void *dest, const void *src, size_t count); -extern void *memset(void *dest, int val, size_t count); -extern void *memsetd(void *dest, Uint32 val, size_t count); +extern void *memcpy(void *dest, const void *src, size_t count); +extern void *memcpyd(void *dest, const void *src, size_t count); +extern void *memset(void *dest, int val, size_t count); +extern void *memsetd(void *dest, Uint32 val, size_t count); /** * \} */ @@ -316,10 +348,19 @@ extern int CheckMem(const void *Mem, int Num); * \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); /** * \} */ @@ -334,11 +375,12 @@ extern int sprintf(char *__s, const char *__format, ...); 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); @@ -415,8 +457,8 @@ extern void Time_Delay(int Delay); * \name Threads and Processes * \{ */ -extern int Proc_SpawnWorker(void); -extern int Proc_Spawn(char *Path); +extern int Proc_SpawnWorker(void (*Fcn)(void*), void *Data); +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); @@ -428,18 +470,16 @@ extern tGID Threads_GetGID(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); /** * \} */ // --- Simple Math --- extern int DivUp(int num, int dem); +extern Uint64 DivMod64U(Uint64 Num, Uint64 Den, Uint64 *Rem); #include #include -#include +#include #endif