summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/hatch_fp/build.mk1
-rw-r--r--board/nocturne_fp/build.mk1
-rw-r--r--board/nucleo-dartmonkey/build.mk1
-rw-r--r--board/nucleo-f412zg/build.mk1
-rw-r--r--board/nucleo-h743zi/build.mk1
-rw-r--r--test/build.mk2
-rwxr-xr-xtest/run_device_tests.py1
-rw-r--r--test/sbrk.c86
-rw-r--r--test/sbrk.tasklist9
9 files changed, 103 insertions, 0 deletions
diff --git a/board/hatch_fp/build.mk b/board/hatch_fp/build.mk
index 2647b4af9c..a13ec273d2 100644
--- a/board/hatch_fp/build.mk
+++ b/board/hatch_fp/build.mk
@@ -56,6 +56,7 @@ test-list-y=\
rollback_entropy \
rsa3 \
rtc \
+ sbrk \
scratchpad \
sha256 \
sha256_unrolled \
diff --git a/board/nocturne_fp/build.mk b/board/nocturne_fp/build.mk
index 49d5db1582..aa906b8cf1 100644
--- a/board/nocturne_fp/build.mk
+++ b/board/nocturne_fp/build.mk
@@ -56,6 +56,7 @@ test-list-y=\
rollback_entropy \
rsa3 \
rtc \
+ sbrk \
scratchpad \
sha256 \
sha256_unrolled \
diff --git a/board/nucleo-dartmonkey/build.mk b/board/nucleo-dartmonkey/build.mk
index b544490fc9..fbf78d16b7 100644
--- a/board/nucleo-dartmonkey/build.mk
+++ b/board/nucleo-dartmonkey/build.mk
@@ -33,6 +33,7 @@ test-list-y=\
rollback_entropy \
rsa3 \
rtc \
+ sbrk \
scratchpad \
sha256 \
sha256_unrolled \
diff --git a/board/nucleo-f412zg/build.mk b/board/nucleo-f412zg/build.mk
index d923a7a40f..8299781a6f 100644
--- a/board/nucleo-f412zg/build.mk
+++ b/board/nucleo-f412zg/build.mk
@@ -30,6 +30,7 @@ test-list-y=\
rollback_entropy \
rsa3 \
rtc \
+ sbrk \
scratchpad \
sha256 \
sha256_unrolled \
diff --git a/board/nucleo-h743zi/build.mk b/board/nucleo-h743zi/build.mk
index ad04a68918..575a6d5da3 100644
--- a/board/nucleo-h743zi/build.mk
+++ b/board/nucleo-h743zi/build.mk
@@ -30,6 +30,7 @@ test-list-y=\
rollback_entropy \
rsa3 \
rtc \
+ sbrk \
scratchpad \
sha256 \
sha256_unrolled \
diff --git a/test/build.mk b/test/build.mk
index 923c141d33..2c5ff67b69 100644
--- a/test/build.mk
+++ b/test/build.mk
@@ -90,6 +90,7 @@ test-list-host += rollback_secret
test-list-host += rsa
test-list-host += rsa3
test-list-host += rtc
+test-list-host += sbrk
test-list-host += sbs_charging_v2
test-list-host += sha256
test-list-host += sha256_unrolled
@@ -252,6 +253,7 @@ rsa-y=rsa.o
rsa3-y=rsa.o
rtc-y=rtc.o
scratchpad-y=scratchpad.o
+sbrk-y=sbrk.o
sbs_charging-y=sbs_charging.o
sbs_charging_v2-y=sbs_charging_v2.o
sha256-y=sha256.o
diff --git a/test/run_device_tests.py b/test/run_device_tests.py
index 4661d57b74..65241177b2 100755
--- a/test/run_device_tests.py
+++ b/test/run_device_tests.py
@@ -308,6 +308,7 @@ class AllTests:
test_name="rollback_entropy", imagetype_to_use=ImageType.RO
),
TestConfig(test_name="rtc"),
+ TestConfig(test_name="sbrk", imagetype_to_use=ImageType.RO),
TestConfig(test_name="sha256"),
TestConfig(test_name="sha256_unrolled"),
TestConfig(test_name="static_if"),
diff --git a/test/sbrk.c b/test/sbrk.c
new file mode 100644
index 0000000000..a5cbd2e41b
--- /dev/null
+++ b/test/sbrk.c
@@ -0,0 +1,86 @@
+/* Copyright 2023 The ChromiumOS Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "link_defs.h"
+#include "shared_mem.h"
+#include "test_util.h"
+
+#include <errno.h>
+
+#include <unistd.h>
+
+test_static int test_sbrk_overflow(void)
+{
+ /* Requesting the maximum possible amount should succeed. */
+ uint8_t *ptr = sbrk(shared_mem_size());
+ TEST_NE(ptr, (void *)-1, "%p");
+
+ /* Requesting any more should fail. */
+ ptr = sbrk(1);
+ TEST_EQ(ptr, (void *)-1, "%p");
+ TEST_EQ(errno, ENOMEM, "%d");
+
+ return EC_SUCCESS;
+}
+
+test_static int test_sbrk_underflow(void)
+{
+ uint8_t *const start = sbrk(0);
+ TEST_EQ(start, (uint8_t *)__shared_mem_buf, "%p");
+
+ /*
+ * We're already at the start of the shared mem buffer, so requesting
+ * less should fail.
+ */
+ uint8_t *ptr = sbrk(-1);
+ TEST_EQ(ptr, (void *)-1, "%p");
+ TEST_EQ(errno, ENOMEM, "%d");
+
+ ptr = sbrk(0);
+ TEST_EQ(ptr, (uint8_t *)__shared_mem_buf, "%p");
+
+ return EC_SUCCESS;
+}
+
+test_static int test_sbrk(void)
+{
+ uint8_t *const start = sbrk(0);
+ if (!IS_ENABLED(BOARD_HOST))
+ TEST_EQ(start, (uint8_t *)__shared_mem_buf, "%p");
+
+ uint8_t *prev = sbrk(100);
+ TEST_EQ(prev, start, "%p");
+
+ uint8_t *cur = sbrk(0);
+ TEST_EQ(cur, prev + 100, "%p");
+
+ prev = sbrk(-100);
+ TEST_EQ(prev, cur, "%p");
+
+ cur = sbrk(0);
+ TEST_EQ(cur, start, "%p");
+
+ return EC_SUCCESS;
+}
+
+void run_test(int argc, const char **argv)
+{
+ test_reset();
+
+ RUN_TEST(test_sbrk);
+ if (!IS_ENABLED(BOARD_HOST)) {
+ if (IS_ENABLED(SECTION_IS_RW)) {
+ ccprintf("The following tests only work in RO, since "
+ "RW performs dynamic memory allocation "
+ "before the test starts.\n");
+ test_fail();
+ return;
+ }
+ RUN_TEST(test_sbrk_underflow);
+ RUN_TEST(test_sbrk_overflow);
+ }
+
+ test_print_result();
+}
diff --git a/test/sbrk.tasklist b/test/sbrk.tasklist
new file mode 100644
index 0000000000..d1920322a9
--- /dev/null
+++ b/test/sbrk.tasklist
@@ -0,0 +1,9 @@
+/* Copyright 2023 The ChromiumOS Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/**
+ * See CONFIG_TASK_LIST in config.h for details.
+ */
+#define CONFIG_TEST_TASK_LIST