}
// --- Exports ---
-tPAddr MM_GetPhysAddr(const void *Ptr)
+tPAddr MM_GetPhysAddr(volatile const void *Ptr)
{
tMM_PageInfo pi;
if( MM_int_GetPageInfo((tVAddr)Ptr, &pi) )
MM_Deallocate(VAddr);
}
-tVAddr MM_MapHWPages(tPAddr PAddr, Uint NPages)
+void *MM_MapHWPages(tPAddr PAddr, Uint NPages)
{
tVAddr ret;
int i;
MM_Map(ret+i*PAGE_SIZE, PAddr+i*PAGE_SIZE);
// and return
LEAVE('p', ret);
- return ret;
+ return (void*)ret;
}
Log_Warning("MMVirt", "MM_MapHWPages: No space for a %i page block", NPages);
LEAVE('p', 0);
return 0;
}
-tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PAddr)
+void *MM_AllocDMA(int Pages, int MaxBits, tPAddr *PAddr)
{
tPAddr phys;
- tVAddr ret;
+ void *ret;
phys = MM_AllocPhysRange(Pages, MaxBits);
if(!phys) {
}
ret = MM_MapHWPages(phys, Pages);
- *PAddr = phys;
+ if( !ret ) {
+ MM_DerefPhys(phys);
+ return NULL;
+ }
+ if( PAddr )
+ *PAddr = phys;
return ret;
}
// Always HW map the module data
ofs = mods[i].Start&0xFFF;
- ret[i].Base = (void*)( MM_MapHWPages(mods[i].Start,
- (ret[i].Size+ofs+0xFFF) / 0x1000
- ) + ofs );
+ ret[i].Base = (void*)( (tVAddr)MM_MapHWPages(mods[i].Start, (ret[i].Size+ofs+0xFFF) / 0x1000)
+ + ofs );
// Only map the string if needed
if( !MM_GetPhysAddr( (void*)(mods[i].String + MapOffset) ) )
{
// Assumes the string is < 4096 bytes long)
ret[i].ArgString = (void*)(
- MM_MapHWPages(mods[i].String, 2) + (mods[i].String&0xFFF)
+ (tVAddr)MM_MapHWPages(mods[i].String, 2) + (mods[i].String&0xFFF)
);
}
else
* \fn tPAddr MM_GetPhysAddr(tVAddr Addr)
* \brief Checks if the passed address is accesable
*/
-tPAddr MM_GetPhysAddr(const void *Addr)
+tPAddr MM_GetPhysAddr(volatile const void *Addr)
{
tVAddr addr = (tVAddr)Addr;
if( !(gaPageDir[addr >> 22] & 1) )
* \fn tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number)
* \brief Allocates a contigous number of pages
*/
-tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number)
+void *MM_MapHWPages(tPAddr PAddr, Uint Number)
{
int i, j;
MM_RefPhys( PAddr + (j<<12) );
gaPageTable[ (HW_MAP_ADDR >> 12) + i + j ] = (PAddr + (j<<12)) | 3;
}
- return HW_MAP_ADDR + (i<<12);
+ return (void*)(HW_MAP_ADDR + (i<<12));
}
}
// If we don't find any, return NULL
* \param PhysAddr Pointer to the location to place the physical address allocated
* \return Virtual address allocate
*/
-tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr)
+void *MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr)
{
tPAddr phys;
- tVAddr ret;
+ void *ret;
ENTER("iPages iMaxBits pPhysAddr", Pages, MaxBits, PhysAddr);
return 0;
}
LEAVE('x', ret);
- return ret;
+ return (void*)ret;
}
// Slow Allocate
if( PhysAddr )
*PhysAddr = phys;
LEAVE('x', ret);
- return ret;
+ return (void*)ret;
}
/**
return NULL;
}
- pages[i].VirtBase = MM_AllocDMA(1, -1, &pages[i].PhysAddr);
+ pages[i].VirtBase = (tVAddr)MM_AllocDMA(1, -1, &pages[i].PhysAddr);
if( pages[i].VirtBase == 0 ) {
Log_Warning("VM8086", "Unable to allocate data page");
return NULL;
// === IMPORTS ===
extern void Desctab_Init(void);
extern void MM_InitVirt(void);
-extern void Heap_Install(void);
extern int Time_Setup(void);
extern char gKernelEnd[];
/**
* \brief Get the physical address of a virtual location
*/
-tPAddr MM_GetPhysAddr(const void *Ptr)
+tPAddr MM_GetPhysAddr(volatile const void *Ptr)
{
tVAddr Addr = (tVAddr)Ptr;
tPAddr *ptr;
/**
* \brief Map a range of hardware pages
*/
-tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number)
+void *MM_MapHWPages(tPAddr PAddr, Uint Number)
{
tVAddr ret;
int num;
MM_RefPhys(PAddr);
}
- return ret;
+ return (void*)ret;
}
Log_Error("MM", "MM_MapHWPages - No space for %i pages", Number);
* \param PhysAddr Pointer to the location to place the physical address allocated
* \return Virtual address allocate
*/
-tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr)
+void *MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr)
{
tPAddr phys;
- tVAddr ret;
+ void *ret;
// Sanity Check
if(MaxBits < 12 || !PhysAddr) return 0;
// --- 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
* \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 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
* \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