1/*
2 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24#ifndef SHARE_GC_Z_ZPHYSICALMEMORY_HPP
25#define SHARE_GC_Z_ZPHYSICALMEMORY_HPP
26
27#include "memory/allocation.hpp"
28#include OS_CPU_HEADER(gc/z/zPhysicalMemoryBacking)
29
30class ZPhysicalMemorySegment : public CHeapObj<mtGC> {
31private:
32 uintptr_t _start;
33 uintptr_t _end;
34
35public:
36 ZPhysicalMemorySegment();
37 ZPhysicalMemorySegment(uintptr_t start, size_t size);
38
39 uintptr_t start() const;
40 uintptr_t end() const;
41 size_t size() const;
42};
43
44class ZPhysicalMemory {
45private:
46 size_t _nsegments;
47 ZPhysicalMemorySegment* _segments;
48
49public:
50 ZPhysicalMemory();
51 ZPhysicalMemory(const ZPhysicalMemorySegment& segment);
52 ZPhysicalMemory(const ZPhysicalMemory& pmem);
53 const ZPhysicalMemory& operator=(const ZPhysicalMemory& pmem);
54 ~ZPhysicalMemory();
55
56 bool is_null() const;
57 size_t size() const;
58
59 size_t nsegments() const;
60 const ZPhysicalMemorySegment& segment(size_t index) const;
61 void add_segment(const ZPhysicalMemorySegment& segment);
62
63 ZPhysicalMemory split(size_t size);
64};
65
66class ZPhysicalMemoryManager {
67private:
68 ZPhysicalMemoryBacking _backing;
69
70 void nmt_commit(const ZPhysicalMemory& pmem, uintptr_t offset) const;
71 void nmt_uncommit(const ZPhysicalMemory& pmem, uintptr_t offset) const;
72
73public:
74 bool is_initialized() const;
75
76 void warn_commit_limits(size_t max) const;
77 bool supports_uncommit();
78
79 size_t commit(size_t size);
80 size_t uncommit(size_t size);
81
82 ZPhysicalMemory alloc(size_t size);
83 void free(const ZPhysicalMemory& pmem);
84
85 void map(const ZPhysicalMemory& pmem, uintptr_t offset) const;
86 void unmap(const ZPhysicalMemory& pmem, uintptr_t offset) const;
87
88 void debug_map(const ZPhysicalMemory& pmem, uintptr_t offset) const;
89 void debug_unmap(const ZPhysicalMemory& pmem, uintptr_t offset) const;
90};
91
92#endif // SHARE_GC_Z_ZPHYSICALMEMORY_HPP
93