github.com/iDigitalFlame/xmt@v0.5.1/device/winapi/mem_v18.go (about) 1 //go:build windows && cgo && go1.18 && !go1.19 2 // +build windows,cgo,go1.18,!go1.19 3 4 // Copyright (C) 2020 - 2023 iDigitalFlame 5 // 6 // This program is free software: you can redistribute it and/or modify 7 // it under the terms of the GNU General Public License as published by 8 // the Free Software Foundation, either version 3 of the License, or 9 // any later version. 10 // 11 // This program is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 // 16 // You should have received a copy of the GNU General Public License 17 // along with this program. If not, see <https://www.gnu.org/licenses/>. 18 // 19 20 package winapi 21 22 import "unsafe" 23 24 const ( 25 x64 = 1 << (^uintptr(0) >> 63) / 2 26 summarySize = 4 + (1 * x64) 27 chunkL1Bits = 1 << (13 * x64) 28 chunkL2Bits = 1 << ((x64*48 + (1-x64)*32) - 22 - (13 * x64)) 29 arenaL1Bits = 1 << (6 * x64) 30 arenaL2Bits = 1 << ((x64*48 + (1-x64)*32) - 22 - (6 * x64)) 31 ) 32 33 //go:linkname gcBitsArenas runtime.gcBitsArenas 34 var gcBitsArenas [4]uintptr 35 36 type mheap struct { 37 _ uintptr 38 pages struct { 39 summary [summarySize][]uint64 40 chunks [chunkL1Bits]*[chunkL2Bits][16]uint64 41 _ uintptr 42 _, _ uint 43 inUse struct { 44 ranges [][2]uintptr 45 _, _ uintptr 46 } 47 scav struct { 48 _ uintptr 49 _ struct { 50 _ [][2]uintptr 51 _, _ uintptr 52 } 53 _ uint32 54 _, _, _, _ uintptr 55 } 56 _, _ uintptr 57 _ bool 58 } 59 _ uint32 60 allspans []*mspan 61 _, _, _, _ uint64 62 _ float64 63 _, _ uint64 64 _ uintptr 65 arenas [arenaL1Bits]*[arenaL2Bits]uintptr 66 heapArenaAlloc linearAlloc 67 arenaHints *arenaHint 68 area linearAlloc 69 _, _, _ []uint 70 base uintptr 71 _ uintptr 72 _ uint32 73 _ [136]struct { 74 _ uint8 75 _ [4]struct { 76 _, _, _, _ uintptr 77 _ uint64 78 } 79 _ uint64 80 _ [cacheLineSize - (1+(2*((4*ptrSize)+8)))%cacheLineSize]byte 81 } 82 spanalloc fixalloc 83 cachealloc fixalloc 84 specialfinalizeralloc fixalloc 85 specialprofilealloc fixalloc 86 specialReachableAlloc fixalloc 87 _ uintptr 88 arenaHintAlloc fixalloc 89 } 90 type mspan struct { 91 _, _ *mspan 92 _ uintptr 93 startAddr uintptr 94 } 95 type arenaHint struct { 96 addr uintptr 97 _ bool 98 next *arenaHint 99 } 100 type linearAlloc struct { 101 next uintptr 102 mapped, _ uintptr 103 _ bool 104 } 105 106 func enumRuntimeMemory(h *mheap, m memoryMap) { 107 for i := range h.pages.summary { 108 m.add(uintptr(unsafe.Pointer(&h.pages.summary[i][0]))) 109 } 110 for i := range h.pages.chunks { 111 if h.pages.chunks[i] == nil { 112 continue 113 } 114 m.add(uintptr(unsafe.Pointer(&h.pages.chunks[i]))) 115 } 116 for i := range h.pages.inUse.ranges { 117 if h.pages.inUse.ranges[i][0] == 0 { 118 continue 119 } 120 m.add(h.pages.inUse.ranges[i][0]) 121 } 122 for i := 1; i < len(gcBitsArenas); i++ { 123 m.add(gcBitsArenas[i]) 124 } 125 if len(h.allspans) > 0 { 126 for i := range h.allspans { 127 if h.allspans[i] != nil { 128 m.add(h.allspans[i].startAddr) 129 } 130 } 131 m.add(uintptr(unsafe.Pointer(&h.allspans[0]))) 132 } 133 for i := range h.arenas { 134 if h.arenas[i] == nil { 135 continue 136 } 137 if m.add(uintptr(unsafe.Pointer(h.arenas[i]))); x64 == 0 { 138 continue 139 } 140 for z := range h.arenas[i] { 141 if h.arenas[i][z] == 0 { 142 continue 143 } 144 m.add(uintptr(unsafe.Pointer(h.arenas[i][z]))) 145 } 146 } 147 if m.add(h.area.next); h.area.mapped > 2 { 148 m.add(h.area.mapped - 2) 149 } 150 if m.add(h.heapArenaAlloc.next); h.heapArenaAlloc.mapped > 2 { 151 m.add(h.heapArenaAlloc.mapped - 2) 152 } 153 for x := h.arenaHints; x != nil; x = x.next { 154 m.add(x.addr) 155 } 156 m.add(h.base) 157 m.add(h.spanalloc.chunk) 158 m.add(h.spanalloc.inuse) 159 m.add(h.cachealloc.chunk) 160 m.add(h.cachealloc.inuse) 161 m.add(h.specialfinalizeralloc.chunk) 162 m.add(h.specialfinalizeralloc.inuse) 163 m.add(h.specialprofilealloc.chunk) 164 m.add(h.specialprofilealloc.inuse) 165 m.add(h.specialReachableAlloc.chunk) 166 m.add(h.specialReachableAlloc.inuse) 167 m.add(h.arenaHintAlloc.chunk) 168 m.add(h.arenaHintAlloc.inuse) 169 }