/*
===========================================================================
Doom 3 GPL Source Code
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
Doom 3 Source Code is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Doom 3 Source Code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Doom 3 Source Code. If not, see .
In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
*/
// -*- mode: objc -*-
#import
#import
#import
#import "sys/platform.h"
#import "sys/osx/macosx_local.h"
#import "sys/osx/macosx_sys.h"
//extern "C" void *vm_allocate(unsigned, unsigned*, unsigned, int);
//extern "C" void vm_deallocate(unsigned, unsigned*, unsigned);
const char *macosx_scanForLibraryDirectory(void)
{
return "/Library/DOOM";
}
// EEEK!
static long size_save;
void *osxAllocateMemoryNV(long size, float readFrequency, float writeFrequency, float priority)
{
kern_return_t kr;
vm_address_t buffer;
kr = vm_allocate(mach_task_self(),
(vm_address_t *)&buffer,
size,
VM_FLAGS_ANYWHERE);
if(kr == 0) {
size_save = size;
return buffer;
}
else
{
size_save = 0;
return NULL;
}
}
void osxFreeMemoryNV(void *pointer)
{
if(size_save) {
vm_deallocate(mach_task_self(),
(vm_address_t)pointer,
size_save);
size_save = 0;
}
}
void *osxAllocateMemory(long size)
{
kern_return_t kr;
vm_address_t buffer;
size += sizeof( int );
kr = vm_allocate(mach_task_self(),
(vm_address_t *)&buffer,
size,
VM_FLAGS_ANYWHERE);
if(kr == 0) {
int *ptr = buffer;
*ptr = size;
ptr = ptr + 1;
return ptr;
}
else
{
return NULL;
}
}
void osxFreeMemory(void *pointer)
{
int size;
int *ptr = pointer;
ptr = ptr - 1;
size = *ptr;
vm_deallocate(mach_task_self(), (vm_address_t)ptr, size);
}
static inline void __eieio(void)
{
__asm__ ("eieio");
}
static inline void __sync(void)
{
__asm__ ("sync");
}
static inline void __isync(void)
{
__asm__ ("isync");
}
static inline void __dcbf(void *base, unsigned long offset)
{
__asm__ ("dcbf %0, %1"
:
: "r" (base), "r" (offset)
: "r0");
}
static inline void __dcbst(void *base, unsigned long offset)
{
__asm__ ("dcbst %0, %1"
:
: "r" (base), "r" (offset)
: "r0");
}
static inline void __dcbz(void *base, unsigned long offset)
{
__asm__ ("dcbz %0, %1"
:
: "r" (base), "r" (offset)
: "r0");
}
void Sys_FlushCacheMemory( void *base, int bytes ) {
unsigned long i;
for(i = 0; i < bytes; i+= 32) {
__dcbf(base,i);
}
__sync();
__isync();
__dcbf(base, i);
__sync();
__isync();
*(volatile unsigned long *)(base + i);
__isync();
}