X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Finclude%2Facess.h;h=83611bb6851b31fc2d9aaa9e29f88d75d98e378d;hb=2015e19b71476d1fee2480aef4de60d22ed5438d;hp=c1cc80de13f27ba1f2ff73a4c758422efe6f1a36;hpb=001546477549f71fd1af08e13c60e0a39397532a;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/include/acess.h b/KernelLand/Kernel/include/acess.h index c1cc80de..83611bb6 100644 --- a/KernelLand/Kernel/include/acess.h +++ b/KernelLand/Kernel/include/acess.h @@ -10,8 +10,13 @@ */ #include +#include #include +#ifndef HALT_CPU +# define HALT_CPU() for(;;); +#endif + //! Pack a structure #define PACKED __attribute__((packed)) //! Mark a function as not returning @@ -22,6 +27,8 @@ #define DEPRECATED __attribute__((deprecated)) //! Mark a parameter as unused #define UNUSED(x) UNUSED_##x __attribute__((unused)) +//! Apply alignment to a variable +#define ALIGN(x) __attribute__((aligned(x))) /** * \name Boolean constants @@ -45,8 +52,8 @@ 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 typedef Uint64 off_t; //!< VFS Offset +typedef struct { char _[PAGE_SIZE];} tPage; // Representation of a page for pointer arithmatic // --- Helper Macros --- /** @@ -78,11 +85,11 @@ extern const char gsBuildInfo[]; * \{ * \todo Move to mm_virt.h */ -#define MM_PFLAG_RO 0x01 // Writes disallowed -#define MM_PFLAG_EXEC 0x02 // Allow execution -#define MM_PFLAG_NOPAGE 0x04 // Prevent from being paged out -#define MM_PFLAG_COW 0x08 // Copy-On-Write -#define MM_PFLAG_KERNEL 0x10 // Kernel-Only (Ring0) +#define MM_PFLAG_RO 0x01 //!< Writes disallowed +#define MM_PFLAG_EXEC 0x02 //!< Allow execution +#define MM_PFLAG_NOPAGE 0x04 //!< Prevent from being paged out +#define MM_PFLAG_COW 0x08 //!< Copy-On-Write +#define MM_PFLAG_KERNEL 0x10 //!< Kernel-Only (Ring0) /** * \} */ @@ -136,7 +143,9 @@ typedef struct sKernelSymbol { * \name IRQ hander registration * \{ */ +//! Register a callback for when an IRQ is raised extern int IRQ_AddHandler(int Num, void (*Callback)(int, void*), void *Ptr); +//! Remove a previously registered IRQ handler extern void IRQ_RemHandler(int Handle); /** * \} @@ -146,14 +155,14 @@ extern void IRQ_RemHandler(int Handle); // --- IO --- #if NO_IO_BUS -#define inb(a) (Log_Panic("Arch", STR(ARCHDIR)" does not support in*/out* (%s:%i)", __FILE__, __LINE__),0) +#define inb(a) (Log_Panic("Arch", STR(ARCHDIR)" does not support in* (%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) +#define outb(a,b) (Log_Panic("Arch", STR(ARCHDIR)" does not support out* (%s:%i)", __FILE__, __LINE__),(void)(b)) +#define outw(a,b) outb(a,b) +#define outd(a,b) outb(a,b) +#define outq(a,b) outb(a,b) #else /** * \name I/O Memory Access @@ -182,44 +191,50 @@ extern Uint64 inq(Uint16 Port); * \param VAddr Virtual Address to allocate at * \return Physical address allocated */ -extern tPAddr MM_Allocate(tVAddr VAddr) __attribute__ ((warn_unused_result)); +extern tPAddr MM_Allocate(volatile void *VAddr) __attribute__ ((warn_unused_result)); +/** + * \breif Allocate a zeroed COW page to \a VAddr + * \param VAddr Virtual address to allocate at + * \return Physical address allocated (don't cache) + */ +extern void MM_AllocateZero(volatile void *VAddr); /** * \brief Deallocate a page * \param VAddr Virtual address to unmap */ -extern void MM_Deallocate(tVAddr VAddr); +extern void MM_Deallocate(volatile void *VAddr); /** * \brief Map a physical page at \a PAddr to \a VAddr * \param VAddr Target virtual address * \param PAddr Physical address to map * \return Boolean Success */ -extern int MM_Map(tVAddr VAddr, tPAddr PAddr); +extern int MM_Map(volatile void * VAddr, tPAddr PAddr); /** * \brief Get the physical address of \a Addr * \param Addr Address of the page to get the physical address of * \return Physical page mapped at \a Addr */ -extern tPAddr MM_GetPhysAddr(const void *Addr); +extern tPAddr MM_GetPhysAddr(volatile const void *Addr); /** * \brief Set the access flags on a page * \param VAddr Virtual address of the page * \param Flags New flags value * \param Mask Flags to set */ -extern void MM_SetFlags(tVAddr VAddr, Uint Flags, Uint Mask); +extern void MM_SetFlags(volatile void *VAddr, Uint Flags, Uint Mask); /** * \brief Get the flags on a flag * \param VAddr Virtual address of page * \return Flags value of the page */ -extern Uint MM_GetFlags(tVAddr VAddr); +extern Uint MM_GetFlags(volatile const void *VAddr); /** * \brief Checks is a memory range is user accessable * \param VAddr Base address to check * \return 1 if the memory is all user-accessable, 0 otherwise */ -#define MM_IsUser(VAddr) (!(MM_GetFlags((tVAddr)(VAddr))&MM_PFLAG_KERNEL)) +#define MM_IsUser(VAddr) (!(MM_GetFlags((const void*)(VAddr))&MM_PFLAG_KERNEL)) /** * \brief Temporarily map a page into the address space * \param PAddr Physical addres to map @@ -227,6 +242,15 @@ extern Uint MM_GetFlags(tVAddr VAddr); * \note There is only a limited ammount of slots avaliable */ extern void *MM_MapTemp(tPAddr PAddr); +/** + * \brief Peform a temporary map of a page from another process + * \param Process Source process + * \param Address Source virtual address + * \return Virtual address of page in memory + * \note Limited slots + */ +struct sProcess; +extern void *MM_MapTempFromProc(struct sProcess *Process, const void *Address); /** * \brief Free a temporarily mapped page * \param Ptr Pointer to page base @@ -237,7 +261,7 @@ extern void MM_FreeTemp(void *Ptr); * \param PAddr Physical address to map in * \param Number Number of pages to map */ -extern tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number); +extern void *MM_MapHWPages(tPAddr PAddr, Uint Number); /** * \brief Allocates DMA physical memory * \param Pages Number of pages required @@ -245,13 +269,13 @@ extern tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number); * \param PhysAddr Pointer to the location to place the physical address allocated * \return Virtual address allocate */ -extern tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr); +extern void *MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr); /** * \brief Unmaps an allocated hardware range * \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); +extern void MM_UnmapHWPages(volatile void *VAddr, Uint Number); /** * \brief Allocate a single physical page * \return Physical address allocated