dvander@28: /* vim: set ts=4 sw=4 tw=99 et: dvander@28: * dvander@28: * Copyright (C) 2012 David Anderson dvander@28: * dvander@28: * This file is part of JITCraft. dvander@28: * dvander@28: * JITCraft is free software: you can redistribute it and/or modify it under dvander@28: * the terms of the GNU General Public License as published by the Free dvander@28: * Software Foundation, either version 3 of the License, or (at your option) dvander@28: * any later version. dvander@28: * dvander@28: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@28: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@28: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@28: * dvander@28: * You should have received a copy of the GNU General Public License along with dvander@28: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@28: */ dvander@28: #ifndef _include_jitcraft_platform_h_ dvander@28: #define _include_jitcraft_platform_h_ dvander@28: dvander@28: #include "Utility.h" dvander@28: dvander@59: namespace ke { dvander@28: dvander@11: namespace OS { dvander@11: enum Protection { dvander@11: Prot_ReadWrite, // rw-, for the heap dvander@11: Prot_ReadExecute, // r-x, for code dvander@11: Prot_ReadWriteExecute // rwx, if disabling r-x for code. dvander@11: }; dvander@11: dvander@11: enum MapMode { dvander@11: Map_Reserve, // don't ask for actual pages yet dvander@11: Map_Commit // ask for pages right away dvander@11: }; dvander@11: dvander@11: Address MapMemory(size_t amount, MapMode mode, Protection prot); dvander@11: bool CommitMemory(Address address, size_t amount, Protection prot); dvander@11: void UnmapMemory(Address address, size_t size); dvander@11: dvander@11: class AlignableMapping { dvander@11: Address base_; dvander@11: Address aligned_; dvander@11: size_t size_; dvander@11: dvander@11: public: dvander@11: AlignableMapping(Address ptr, size_t alignment, size_t size) dvander@11: : base_(ptr), dvander@11: size_(size) dvander@11: { dvander@11: aligned_ = base_; dvander@11: if (!IsAligned(aligned_, alignment)) dvander@11: aligned_ = AlignedBase(aligned_, alignment) + alignment; dvander@11: } dvander@11: dvander@11: AlignableMapping() : base_(NULL), aligned_(NULL), size_(0) dvander@11: { dvander@11: } dvander@11: dvander@11: Address base() const { dvander@11: return base_; dvander@11: } dvander@11: bool isValid() const { dvander@11: return !!base_; dvander@11: } dvander@11: size_t size() const { dvander@11: return size_; dvander@11: } dvander@11: Address aligned() const { dvander@11: return aligned_; dvander@11: } dvander@11: }; dvander@11: dvander@51: // MapAlignedMemory is guaranteed to return zeroed memory. dvander@11: AlignableMapping MapAlignedMemory(size_t amount, size_t alignment, MapMode mode); dvander@11: void UnmapAlignedMemory(Address address, size_t size); dvander@11: dvander@11: // The default alignment of memory returned via MapMemory(). dvander@11: // :TODO: better ifdefs dvander@11: #ifdef _MSC_VER dvander@28: static const size_t kPageAlignment = 64 * kKB; dvander@11: #else dvander@28: static const size_t kPageAlignment = 4 * kKB; dvander@11: #endif dvander@11: dvander@28: } dvander@28: dvander@28: } dvander@28: dvander@28: #endif // _include_jitcraft_platform_h_