|
57 | 57 | // a different process for execution, it must not make any function calls. It |
58 | 58 | // could be written as asm, but simple C is more readable/maintainable and |
59 | 59 | // should consistently compile to movable, position-independent code. |
60 | | -void heap_iterate_callback(unsigned long base, unsigned long size, void *arg) { |
| 60 | +static void heap_iterate_callback(unsigned long base, unsigned long size, void *arg) { |
61 | 61 | volatile uint64_t *data = (uint64_t*)arg; |
62 | 62 | while (data[NEXT_FREE_IDX] >= data[MAX_VALID_IDX]) { |
63 | 63 | // SIGTRAP indicates the buffer is full and needs to be drained before more |
64 | 64 | // entries can be written. |
65 | 65 | __builtin_debugtrap(); |
66 | | - asm volatile("nop"); |
| 66 | + __asm__ __volatile__("nop"); |
67 | 67 | } |
68 | 68 | data[data[NEXT_FREE_IDX]++] = base; |
69 | 69 | data[data[NEXT_FREE_IDX]++] = size; |
70 | | - asm volatile(".global heap_iterate_callback_end"); |
71 | | - asm volatile("heap_iterate_callback_end:"); |
| 70 | + __asm__ __volatile(".local heap_iterate_callback_end"); |
| 71 | + __asm__ __volatile__("heap_iterate_callback_end:"); |
72 | 72 | } |
73 | 73 |
|
74 | 74 | void* heap_iterate_callback_start() { |
@@ -97,12 +97,12 @@ bool heap_iterate_metadata_process( |
97 | 97 | void* data, size_t len, void* callback_context, heap_iterate_entry_callback_t callback) { |
98 | 98 | uint64_t *metadata = data; |
99 | 99 | const uint64_t max_entries = len / sizeof(uint64_t); |
| 100 | + const uint64_t end_index = metadata[NEXT_FREE_IDX]; |
100 | 101 |
|
101 | | - if (metadata[MAX_VALID_IDX] != max_entries || |
102 | | - metadata[NEXT_FREE_IDX] > max_entries) |
| 102 | + if (metadata[MAX_VALID_IDX] != max_entries || end_index > max_entries) |
103 | 103 | return false; |
104 | 104 |
|
105 | | - for (size_t i = HEADER_SIZE; i < metadata[NEXT_FREE_IDX]; i += ENTRY_SIZE) { |
| 105 | + for (size_t i = HEADER_SIZE; i < end_index; i += ENTRY_SIZE) { |
106 | 106 | const uint64_t base = metadata[i]; |
107 | 107 | const uint64_t size = metadata[i + 1]; |
108 | 108 | callback(callback_context, base, size); |
|
0 commit comments