X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Finclude%2Facess.h;h=1c645c255af8285a35ca1f3b4e839d3e705c2c02;hb=7536e8afcc3018c4ca2a4aa8f8422cf86a6c188c;hp=79c5062b2173d23928beebfb95f1fda75404cdc8;hpb=3764c294f21229bdf700f436fa4884f5e76e0d3a;p=tpg%2Facess2.git diff --git a/Kernel/include/acess.h b/Kernel/include/acess.h index 79c5062b..1c645c25 100644 --- a/Kernel/include/acess.h +++ b/Kernel/include/acess.h @@ -4,24 +4,45 @@ */ #ifndef _ACESS_H #define _ACESS_H +/** + * \file acess.h + * \brief Acess2 Kernel API Core + */ +//! NULL Pointer #define NULL ((void*)0) +//! Pack a structure #define PACKED __attribute__((packed)) +//! Mark a function as not returning +#define NORETURN __attribute__((noreturn)) +//! Mark a parameter as unused #define UNUSED(x) UNUSED_##x __attribute__((unused)) +//! Get the offset of a member in a structure #define offsetof(st, m) ((Uint)((char *)&((st *)(0))->m - (char *)0 )) +/** + * \name Boolean constants + * \{ + */ +#define TRUE 1 +#define FALSE 0 +/** + * \} + */ + #include #include #include "errno.h" // --- Types --- -typedef int tPID; -typedef int tTID; -typedef Uint tUID; -typedef Uint tGID; -typedef Sint64 tTimestamp; -typedef Sint64 tTime; -typedef struct sShortSpinlock tShortSpinlock; +typedef Uint32 tPID; //!< Process ID type +typedef Uint32 tTID; //!< Thread ID Type +typedef Uint32 tUID; //!< User ID Type +typedef Uint32 tGID; //!< Group ID Type +typedef Sint64 tTimestamp; //!< Timestamp (miliseconds since 00:00 1 Jan 1970) +typedef Sint64 tTime; //!< Same again +typedef struct sShortSpinlock tShortSpinlock; //!< Opaque (kinda) spinlock +typedef int bool; //!< Boolean type // --- Helper Macros --- /** @@ -33,32 +54,17 @@ typedef struct sShortSpinlock tShortSpinlock; #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 - * \{ - */ -enum eConfigTypes { - CFGT_NULL, - CFGT_INT, - CFGT_HEAPSTR, - CFGT_PTR -}; -enum eConfigs { - CFG_VFS_CWD, - CFG_VFS_MAXFILES, - CFG_VFS_CHROOT, - NUM_CFG_ENTRIES -}; -#define CFGINT(id) (*Threads_GetCfgPtr(id)) -#define CFGPTR(id) (*(void**)Threads_GetCfgPtr(id)) -/** - * \} - */ +//! \brief Error number +#define errno (*Threads_GetErrno()) // === CONSTANTS === // --- Memory Flags -- @@ -76,22 +82,42 @@ enum eConfigs { * \} */ // --- Interface Flags & Macros +/** + * \name Flags for Proc_Clone + * \{ + */ +//! Clone the entire process #define CLONE_VM 0x10 +//! Don't copy user pages +#define CLONE_NOUSER 0x20 +/** + * \} + */ // === Types === +/** + * \brief Thread root function + * + * Function pointer prototype of a thread entrypoint. When it + * returns, Threads_Exit is called + */ typedef void (*tThreadFunction)(void*); // === Kernel Export Macros === /** - * \name Kernel Function + * \name Kernel exports * \{ */ +//! Kernel symbol definition typedef struct sKernelSymbol { - const char *Name; - tVAddr Value; + const char *Name; //!< Symbolic name + tVAddr Value; //!< Value of the symbol } tKernelSymbol; +//! Export a pointer symbol (function/array) #define EXPORT(_name) tKernelSymbol _kexp_##_name __attribute__((section ("KEXPORT"),unused))={#_name, (tVAddr)_name} +//! Export a variable #define EXPORTV(_name) tKernelSymbol _kexp_##_name __attribute__((section ("KEXPORT"),unused))={#_name, (tVAddr)&_name} +//! Export a symbol under another name #define EXPORTAS(_sym,_name) tKernelSymbol _kexp_##_name __attribute__((section ("KEXPORT"),unused))={#_name, (tVAddr)_sym} /** * \} @@ -99,9 +125,21 @@ typedef struct sKernelSymbol { // === FUNCTIONS === // --- IRQs --- -extern int IRQ_AddHandler(int Num, void (*Callback)(int)); +/** + * \name IRQ hander registration + * \{ + */ +extern int IRQ_AddHandler(int Num, void (*Callback)(int, void*), void *Ptr); +extern void IRQ_RemHandler(int Handle); +/** + * \} + */ // --- Logging --- +/** + * \name Logging to kernel ring buffer + * \{ + */ extern void Log_KernelPanic(const char *Ident, const char *Message, ...); extern void Log_Panic(const char *Ident, const char *Message, ...); extern void Log_Error(const char *Ident, const char *Message, ...); @@ -109,6 +147,9 @@ extern void Log_Warning(const char *Ident, const char *Message, ...); extern void Log_Notice(const char *Ident, const char *Message, ...); extern void Log_Log(const char *Ident, const char *Message, ...); extern void Log_Debug(const char *Ident, const char *Message, ...); +/** + * \} + */ // --- Debug --- /** @@ -150,6 +191,16 @@ extern void Debug_HexDump(const char *Header, const void *Data, Uint Length); */ // --- IO --- +#if NO_IO_BUS +#define inb(a) (Log_Panic("Arch", STR(ARCHDIR)" 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 * \{ @@ -165,7 +216,7 @@ extern Uint64 inq(Uint16 Port); /** * \} */ - +#endif // --- Memory Management --- /** * \name Memory Management @@ -243,7 +294,7 @@ extern tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number); extern tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr); /** * \brief Unmaps an allocated hardware range - * \param VAddr Virtual address allocate by ::MM_MapHWPage or ::MM_AllocDMA + * \param VAddr Virtual address allocate by ::MM_MapHWPages or ::MM_AllocDMA * \param Number Number of pages to free */ extern void MM_UnmapHWPages(tVAddr VAddr, Uint Number); @@ -275,6 +326,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); /** * \} */ @@ -285,10 +354,11 @@ 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 *memmove(void *dest, const void *src, size_t len); +extern void *memset(void *dest, int val, size_t count); +extern void *memsetd(void *dest, Uint32 val, size_t count); /** * \} */ @@ -307,10 +377,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); /** * \} */ @@ -325,6 +404,8 @@ 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); @@ -336,22 +417,40 @@ extern int strpos(const char *Str, char Ch); extern int strpos8(const char *str, Uint32 search); extern void itoa(char *buf, Uint64 num, int base, int minLength, char pad); extern int atoi(const char *string); +extern int ParseInt(const char *string, int *Val); extern int ReadUTF8(const Uint8 *str, Uint32 *Val); extern int WriteUTF8(Uint8 *str, Uint32 Val); extern int ModUtil_SetIdent(char *Dest, const char *Value); extern int ModUtil_LookupString(const char **Array, const char *Needle); extern Uint8 ByteSum(const void *Ptr, int Size); +extern int Hex(char *Dest, size_t Size, const Uint8 *SourceData); extern int UnHex(Uint8 *Dest, size_t DestSize, const char *SourceString); /** * \} */ +/** + * \brief Get a random number + * \return Random number + * \note Current implementation is a linear congruency + */ extern int rand(void); +/** + * \brief Call a function with a variable number of arguments + * \param Function Function address + * \param NArgs Number of entries in \a Args + * \param Args Array of arguments + * \return Integer from called Function + */ extern int CallWithArgArray(void *Function, int NArgs, Uint *Args); // --- Heap --- #include +/** + * \brief Magic heap allocation function + */ +extern void *alloca(size_t Size); // --- Modules --- /** @@ -405,8 +504,10 @@ 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 int Proc_SysSpawn(const char *Binary, const char **ArgV, const char **EnvP, int nFD, int *FDs); +extern int Proc_Execve(const char *File, const char **ArgV, const char **EnvP, int DataSize); extern void Threads_Exit(int TID, int Status); extern void Threads_Yield(void); extern void Threads_Sleep(void); @@ -416,18 +517,23 @@ extern tTID Threads_GetTID(void); extern tUID Threads_GetUID(void); extern tGID Threads_GetGID(void); extern int SpawnTask(tThreadFunction Function, void *Arg); -extern Uint *Threads_GetCfgPtr(int Id); +extern int *Threads_GetErrno(void); extern int Threads_SetName(const char *NewName); /** * \} */ // --- Simple Math --- +//! Divide and round up extern int DivUp(int num, int dem); +//! Divide and Modulo 64-bit unsigned integer +extern Uint64 DivMod64U(Uint64 Num, Uint64 Den, Uint64 *Rem); + +static inline int MIN(int a, int b) { return a < b ? a : b; } +static inline int MAX(int a, int b) { return a > b ? a : b; } #include #include -#include #include #endif