Heap allocation window uses the DRAM size limit option and detect if heap allocation...
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / heapallocatorbrowser.cpp
... / ...
CommitLineData
1//\r
2// heapallocatorbrowser.cpp: Memory heap allocation\r
3//\r
4// by Jean-Paul Mari\r
5//\r
6// JPM = Jean-Paul Mari <djipi.mari@gmail.com>\r
7//\r
8// Who When What\r
9// --- ---------- -----------------------------------------------------------\r
10// JPM 01/08/2017 Created this file\r
11// JPM 09/05/2018 Support of the DRAM size limit option\r
12// JPM 09/05/2018 Use definitions for error instead of hard values\r
13// JPM 09/05/2018 Detect if heap allocation shares space with SP (Stack)\r
14//\r
15\r
16// STILL TO DO:\r
17// Better information display\r
18//\r
19\r
20#include "settings.h"\r
21#include "debugger/heapallocatorbrowser.h"\r
22#include "memory.h"\r
23#include "debugger/DBGManager.h"\r
24#include "m68000/m68kinterface.h"\r
25\r
26\r
27HeapAllocatorBrowserWindow::HeapAllocatorBrowserWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog),\r
28layout(new QVBoxLayout), text(new QTextBrowser),\r
29Adr(0)\r
30{\r
31 setWindowTitle(tr("Heap Allocation"));\r
32\r
33 QFont fixedFont("Lucida Console", 8, QFont::Normal);\r
34 fixedFont.setStyleHint(QFont::TypeWriter);\r
35 text->setFont(fixedFont);\r
36 setLayout(layout);\r
37\r
38 layout->addWidget(text);\r
39}\r
40\r
41\r
42//\r
43HeapAllocatorBrowserWindow::~HeapAllocatorBrowserWindow(void)\r
44{\r
45}\r
46\r
47\r
48//\r
49void HeapAllocatorBrowserWindow::RefreshContents(void)\r
50{\r
51 char string[1024];\r
52 QString HA;\r
53 size_t Adr68K;\r
54 size_t Error = HA_NOERROR;\r
55 HeapAllocation HeapAllocation;\r
56\r
57 if (isVisible())\r
58 {\r
59 if (Adr68K = Adr)\r
60 {\r
61 do\r
62 {\r
63 if ((Adr68K >= 0x4000) && (Adr68K < vjs.DRAM_size))\r
64 {\r
65 if (Adr68K < m68k_get_reg(NULL, M68K_REG_SP))\r
66 {\r
67 memcpy(&HeapAllocation, &jaguarMainRAM[Adr68K], sizeof(HeapAllocation));\r
68\r
69 if (HeapAllocation.size = ((HeapAllocation.size & 0xff) << 24) + ((HeapAllocation.size & 0xff00) << 8) + ((HeapAllocation.size & 0xff0000) >> 8) + ((HeapAllocation.size & 0xff000000) >> 24))\r
70 {\r
71 if (HeapAllocation.size <= (vjs.DRAM_size - 0x4000))\r
72 {\r
73 if ((HeapAllocation.used = ((HeapAllocation.used & 0xff) << 8) + ((HeapAllocation.used & 0xff00) >> 8)) <= 1)\r
74 {\r
75 HeapAllocation.nextalloc = ((HeapAllocation.nextalloc & 0xff) << 24) + ((HeapAllocation.nextalloc & 0xff00) << 8) + ((HeapAllocation.nextalloc & 0xff0000) >> 8) + ((HeapAllocation.nextalloc & 0xff000000) >> 24);\r
76\r
77 if ((HeapAllocation.nextalloc >= 0x4000) && (HeapAllocation.nextalloc < vjs.DRAM_size))\r
78 {\r
79 sprintf(string, "0x%06x | 0x%06x (%zi) | %s | 0x%06x<br>", Adr68K, HeapAllocation.size - sizeof(HeapAllocation), HeapAllocation.size - sizeof(HeapAllocation), HeapAllocation.used ? "Allocated" : "Free", HeapAllocation.nextalloc);\r
80 Adr68K = HeapAllocation.nextalloc;\r
81 }\r
82 else\r
83 {\r
84 sprintf(string, "<br><font color='#ff0000'><b>Unable to determine the next memory allocation</b></font>");\r
85 Error = HA_UNABLENEXTMEMORYALLOC;\r
86 }\r
87 }\r
88 else\r
89 {\r
90 sprintf(string, "<br><font color='#ff0000'><b>Unable to determine if the allocated memory is used or not</b></font>");\r
91 Error = HA_UNABLEALLOCATEMEMORYUSAGE;\r
92 }\r
93 }\r
94 else\r
95 {\r
96 sprintf(string, "<br><font color='#ff0000'><b>Memory bloc size has a problem</b></font>");\r
97 Error = HA_MEMORYBLOCKSIZEPROBLEM;\r
98 }\r
99 }\r
100 else\r
101 {\r
102 sprintf(string, "<br><font color='#0000ff'><b>Memory allocations browsing successfully completed</b></font>");\r
103 }\r
104 }\r
105 else\r
106 {\r
107 sprintf(string, "<br><font color='#ff0000'><b>Memory allocations and Stack are sharing the same space</b></font>");\r
108 Error = HA_HAANDSPSHARESPACE;\r
109 }\r
110 }\r
111 else\r
112 {\r
113 sprintf(string, "<br><font color='#ff0000'><b>Memory allocations may have a problem</b></font>");\r
114 Error = HA_MEMORYALLOCATIONPROBLEM;\r
115 }\r
116\r
117 HA += QString(string);\r
118\r
119 }\r
120 while (HeapAllocation.size && !Error);\r
121 }\r
122 else\r
123 {\r
124 if (Adr = DBGManager_GetAdrFromSymbolName((char *)"__HeapBase"))\r
125 {\r
126 if (Adr68K = DBGManager_GetGlobalVariableAdrFromName((char *)"alloc"))\r
127 {\r
128 if (!(Adr68K = (jaguarMainRAM[Adr68K] << 24) + (jaguarMainRAM[Adr68K + 1] << 16) + (jaguarMainRAM[Adr68K + 2] << 8) + (jaguarMainRAM[Adr68K + 3])) || ((Adr68K < 0x4000) || (Adr68K >= 0x200000)))\r
129 {\r
130 sprintf(string, "<font color='#ff0000'><b>Memory allocator not yet initialised</b></font>");\r
131 Adr = 0;\r
132 }\r
133 else\r
134 {\r
135 return RefreshContents();\r
136 }\r
137 }\r
138 else\r
139 {\r
140 sprintf(string, "<font color='#ff0000'><b>Memory allocator is not compatible</b></font>");\r
141 Adr = 0;\r
142 }\r
143 }\r
144 else\r
145 {\r
146 sprintf(string, "<font color='#ff0000'><b>Memory allocator doesn't exist</b></font>");\r
147 }\r
148\r
149 HA += QString(string);\r
150 }\r
151\r
152 text->clear();\r
153 text->setText(HA);\r
154 }\r
155}\r
156\r
157\r
158// \r
159void HeapAllocatorBrowserWindow::Reset(void)\r
160{\r
161 size_t Adr68K;\r
162\r
163 if (DBGManager_GetAdrFromSymbolName((char *)"__HeapBase"))\r
164 {\r
165 if (Adr68K = DBGManager_GetGlobalVariableAdrFromName((char *)"alloc"))\r
166 {\r
167 jaguarMainRAM[Adr68K] = jaguarMainRAM[Adr68K + 1] = jaguarMainRAM[Adr68K + 2] = jaguarMainRAM[Adr68K + 3] = 0;\r
168 Adr = 0;\r
169 }\r
170 }\r
171}\r
172\r
173\r
174// \r
175void HeapAllocatorBrowserWindow::keyPressEvent(QKeyEvent * e)\r
176{\r
177 if (e->key() == Qt::Key_Escape)\r
178 {\r
179 hide();\r
180 }\r
181}\r
182\r