//===------------ 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 "debug.h"
#include "vmkit/VirtualMachine.h"
#include "MMTkObject.h"

#include <sys/mman.h>

namespace mmtk {

class InitCollector {
public:
  InitCollector() {
    uint32 flags = MAP_PRIVATE | MAP_ANON | MAP_FIXED;
    void* baseAddr = mmap((void*)vmkit::kGCMemoryStart, vmkit::kGCMemorySize, PROT_READ | PROT_WRITE,
                          flags, -1, 0);
    if (baseAddr == MAP_FAILED) {
      perror("mmap for GC memory");
      abort();
    }
  }
};

// Allocate the memory for MMTk right now, to avoid conflicts with other allocators.
InitCollector initCollector;

extern "C" word_t Java_org_j3_mmtk_Memory_getHeapStartConstant__ (MMTkObject* M) {
  return vmkit::kGCMemoryStart;
}

extern "C" word_t Java_org_j3_mmtk_Memory_getHeapEndConstant__ (MMTkObject* M) {
  return vmkit::kGCMemoryStart + vmkit::kGCMemorySize;
}

extern "C" word_t Java_org_j3_mmtk_Memory_getAvailableStartConstant__ (MMTkObject* M) {
  return Java_org_j3_mmtk_Memory_getHeapStartConstant__ (M);
}

extern "C" word_t Java_org_j3_mmtk_Memory_getAvailableEndConstant__ (MMTkObject* M) {
  return Java_org_j3_mmtk_Memory_getHeapEndConstant__ (M);
}

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

extern "C" uint8_t
Java_org_j3_mmtk_Memory_mprotect__Lorg_vmmagic_unboxed_Address_2I (MMTkObject* M, word_t address, sint32 size) {
  int val = mprotect((void*)address, size, PROT_NONE);
  return (val == 0);
}

extern "C" uint8_t
Java_org_j3_mmtk_Memory_munprotect__Lorg_vmmagic_unboxed_Address_2I (MMTkObject* M, word_t address, sint32 size) {
  int val = mprotect((void*)address, size, PROT_READ | PROT_WRITE);
  return (val == 0);
}

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

extern "C" void
Java_org_j3_mmtk_Memory_zeroPages__Lorg_vmmagic_unboxed_Address_2I (MMTkObject* M, word_t address, sint32 size) {
  UNIMPLEMENTED();
}

extern "C" void
Java_org_j3_mmtk_Memory_dumpMemory__Lorg_vmmagic_unboxed_Address_2II (MMTkObject* M, word_t address, sint32 before, sint32 after) {
  UNIMPLEMENTED();
}

}
