//===------------ Memory.cpp - Implementation of the Memory class  --------===//
//
//                              The VMKit project
//
// This file is distributed under the University of Illinois Open Source 
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include <sys/mman.h>


#include "JavaObject.h"
#include "JavaThread.h"

using namespace j3;
extern "C" uintptr_t Java_org_j3_mmtk_Memory_getHeapStartConstant__ () {
  return (uintptr_t)0x30000000;
}

extern "C" uintptr_t Java_org_j3_mmtk_Memory_getHeapEndConstant__ () {
  return (uintptr_t)0x80000000;
}

extern "C" uintptr_t Java_org_j3_mmtk_Memory_getAvailableStartConstant__ () {
  return (uintptr_t)0x30000000;
}

extern "C" uintptr_t Java_org_j3_mmtk_Memory_getAvailableEndConstant__ () {
  return (uintptr_t)0x80000000;
}

extern "C" sint32
Java_org_j3_mmtk_Memory_dzmmap__Lorg_vmmagic_unboxed_Address_2I(JavaObject* M,
                                                                void* start,
                                                                sint32 size) {
  // Already mmapped during initialization.
  return 0;
}

extern "C" void
Java_org_j3_mmtk_Memory_mprotect__Lorg_vmmagic_unboxed_Address_2I () {
  JavaThread::get()->printBacktrace(); abort();
}

extern "C" void
Java_org_j3_mmtk_Memory_munprotect__Lorg_vmmagic_unboxed_Address_2I () {
  JavaThread::get()->printBacktrace(); abort();
}

extern "C" void
Java_org_j3_mmtk_Memory_zero__Lorg_vmmagic_unboxed_Address_2Lorg_vmmagic_unboxed_Extent_2(JavaObject* M,
                                                                                          void* addr,
                                                                                          uintptr_t len) {
  memset(addr, 0, len);
}

extern "C" void
Java_org_j3_mmtk_Memory_zeroPages__Lorg_vmmagic_unboxed_Address_2I () {
  JavaThread::get()->printBacktrace(); abort();
}

extern "C" void
Java_org_j3_mmtk_Memory_dumpMemory__Lorg_vmmagic_unboxed_Address_2II () {
  JavaThread::get()->printBacktrace(); abort();
}
