|
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