[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 4/4] tests/tcg: add HeapInfo checking to semihosting test
From: |
Alex Bennée |
Subject: |
[PATCH v3 4/4] tests/tcg: add HeapInfo checking to semihosting test |
Date: |
Tue, 9 Mar 2021 17:21:27 +0000 |
Query the SYS_HEAPINFO semicall and do some basic verification of the
information via libc calls.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
.../multiarch/arm-compat-semi/semihosting.c | 35 ++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)
diff --git a/tests/tcg/multiarch/arm-compat-semi/semihosting.c
b/tests/tcg/multiarch/arm-compat-semi/semihosting.c
index b3fd16cd12..5fa3c0a82d 100644
--- a/tests/tcg/multiarch/arm-compat-semi/semihosting.c
+++ b/tests/tcg/multiarch/arm-compat-semi/semihosting.c
@@ -8,9 +8,16 @@
*/
#define SYS_WRITE0 0x04
+#define SYS_HEAPINFO 0x16
#define SYS_REPORTEXC 0x18
+#define _GNU_SOURCE /* asprintf is a GNU extension */
+
#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
#include "semicall.h"
int main(int argc, char *argv[argc])
@@ -21,8 +28,34 @@ int main(int argc, char *argv[argc])
uintptr_t exit_block[2] = {0x20026, 0};
uintptr_t exit_code = (uintptr_t) &exit_block;
#endif
+ struct {
+ void *heap_base;
+ void *heap_limit;
+ void *stack_base;
+ void *stack_limit;
+ } info;
+ void *ptr_to_info = (void *) &info;
+ char *heap_info, *stack_info;
+ void *brk = sbrk(0);
+
+ __semi_call(SYS_WRITE0, (uintptr_t) "Checking HeapInfo\n");
+
+ memset(&info, 0, sizeof(info));
+ __semi_call(SYS_HEAPINFO, (uintptr_t) &ptr_to_info);
+
+ asprintf(&heap_info, "heap: %p -> %p\n", info.heap_base, info.heap_limit);
+ __semi_call(SYS_WRITE0, (uintptr_t) heap_info);
+ if (info.heap_base != brk) {
+ sprintf(heap_info, "heap mismatch: %p\n", brk);
+ __semi_call(SYS_WRITE0, (uintptr_t) heap_info);
+ return -1;
+ }
+
+ asprintf(&stack_info, "stack: %p -> %p\n", info.stack_base,
info.stack_limit);
+ __semi_call(SYS_WRITE0, (uintptr_t) stack_info);
+ free(heap_info);
+ free(stack_info);
- __semi_call(SYS_WRITE0, (uintptr_t) "Hello World");
__semi_call(SYS_REPORTEXC, exit_code);
/* if we get here we failed */
return -1;
--
2.20.1