summaryrefslogtreecommitdiff
path: root/test/shmalloc.c
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2021-11-04 12:11:58 -0600
committerCommit Bot <commit-bot@chromium.org>2021-11-05 04:22:34 +0000
commit252457d4b21f46889eebad61d4c0a65331919cec (patch)
tree01856c4d31d710b20e85a74c8d7b5836e35c3b98 /test/shmalloc.c
parent08f5a1e6fc2c9467230444ac9b582dcf4d9f0068 (diff)
downloadchrome-ec-stabilize-14682.B-ish.tar.gz
In the interest of making long-term branch maintenance incur as little technical debt on us as possible, we should not maintain any files on the branch we are not actually using. This has the added effect of making it extremely clear when merging CLs from the main branch when changes have the possibility to affect us. The follow-on CL adds a convenience script to actually pull updates from the main branch and generate a CL for the update. BUG=b:204206272 BRANCH=ish TEST=make BOARD=arcada_ish && make BOARD=drallion_ish Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Change-Id: I17e4694c38219b5a0823e0a3e55a28d1348f4b18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3262038 Reviewed-by: Jett Rink <jettrink@chromium.org> Reviewed-by: Tom Hughes <tomhughes@chromium.org>
Diffstat (limited to 'test/shmalloc.c')
-rw-r--r--test/shmalloc.c305
1 files changed, 0 insertions, 305 deletions
diff --git a/test/shmalloc.c b/test/shmalloc.c
deleted file mode 100644
index a596d173e7..0000000000
--- a/test/shmalloc.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "common.h"
-#include "compile_time_macros.h"
-#include "console.h"
-#include "link_defs.h"
-#include "shared_mem.h"
-#include "test_util.h"
-
-/*
- * Total size of memory in the malloc pool (shared between free and allocated
- * buffers.
- */
-static int total_size;
-
-/*
- * Number of randomized allocation/free attempts, large enough to execute all
- * branches in the malloc/free module.
- */
-static int counter = 500000;
-
-/*
- * A good random number generator approximation. Guaranteed to generate the
- * same sequence on all test runs.
- */
-static uint32_t next = 127;
-static uint32_t myrand(void)
-{
- next = next * 1103515245 + 12345;
- return ((uint32_t)(next/65536) % 32768);
-}
-
-/* Keep track of buffers allocated by the test function. */
-static struct {
- void *buf;
- size_t buffer_size;
-} allocations[12]; /* Up to 12 buffers could be allocated concurrently. */
-
-/*
- * Verify that allocated and free buffers do not overlap, and that our and
- * malloc's ideas of the number of allocated buffers match.
- */
-
-static int check_for_overlaps(void)
-{
- int i;
- int allocation_match;
- int allocations_count, allocated_count;
-
- allocations_count = allocated_count = 0;
- for (i = 0; i < ARRAY_SIZE(allocations); i++) {
- struct shm_buffer *allocced_buf;
-
- if (!allocations[i].buf)
- continue;
-
- /*
- * Indication of finding the allocated buffer in internal
- * malloc structures.
- */
- allocation_match = 0;
-
- /* number of buffers allocated by the test program. */
- allocations_count++;
-
- /*
- * Number of allocated buffers malloc knows about, calculated
- * multiple times to keep things simple.
- */
- allocated_count = 0;
- for (allocced_buf = allocced_buf_chain;
- allocced_buf;
- allocced_buf = allocced_buf->next_buffer) {
- int allocated_size, allocation_size;
-
- allocated_count++;
- if (allocations[i].buf != (allocced_buf + 1))
- continue;
-
- allocated_size = allocced_buf->buffer_size;
- allocation_size = allocations[i].buffer_size;
-
- /*
- * Verify that size requested by the allocator matches
- * the value used by malloc, i.e. does not exceed the
- * allocated size and is no less than two buffer
- * structures lower (which can happen when the
- * requested size was rounded up to cover gaps smaller
- * than the buffer header structure size).
- */
- if ((allocation_size > allocated_size) ||
- ((allocated_size - allocation_size) >=
- (2 * sizeof(struct shm_buffer) + sizeof(int)))) {
- ccprintf("inconsistency: allocated (size %d)"
- " allocation %d(size %d)\n",
- allocated_size, i, allocation_size);
- return 0;
- }
-
- if (allocation_match++) {
- ccprintf("inconsistency: duplicated match\n");
- return 0;
- }
- }
- if (!allocation_match) {
- ccprintf("missing match %pP!\n", allocations[i].buf);
- return 0;
- }
- }
- if (allocations_count != allocated_count) {
- ccprintf("count mismatch (%d != %d)!\n",
- allocations_count, allocated_count);
- return 0;
- }
- return 1;
-}
-
-/*
- * Verify that shared memory is in a consistent state, i.e. that there is no
- * overlaps between allocated and free buffers, and that all memory is
- * accounted for (is either allocated or available).
- */
-
-static int shmem_is_ok(int line)
-{
- int count = 0;
- int running_size = 0;
- struct shm_buffer *pbuf = free_buf_chain;
-
- if (pbuf && pbuf->prev_buffer) {
- ccprintf("Bad free buffer list start %pP\n", pbuf);
- goto bailout;
- }
-
- while (pbuf) {
- struct shm_buffer *top;
-
- running_size += pbuf->buffer_size;
- if (count++ > 100)
- goto bailout; /* Is there a loop? */
-
- top = (struct shm_buffer *)((uintptr_t)pbuf +
- pbuf->buffer_size);
- if (pbuf->next_buffer) {
- if (top >= pbuf->next_buffer) {
- ccprintf("%s:%d"
- " - inconsistent buffer size at %pP\n",
- __func__, __LINE__, pbuf);
- goto bailout;
- }
- if (pbuf->next_buffer->prev_buffer != pbuf) {
- ccprintf("%s:%d"
- " - inconsistent next buffer at %pP\n",
- __func__, __LINE__, pbuf);
- goto bailout;
- }
- }
- pbuf = pbuf->next_buffer;
- }
-
- if (pbuf) { /* Must be a loop. */
- ccprintf("Too many buffers in the chain\n");
- goto bailout;
- }
-
- /* Make sure there were at least 5 buffers allocated at one point. */
- if (count > 5)
- set_map_bit(1 << 24);
-
- /* Add allocated sizes. */
- for (pbuf = allocced_buf_chain; pbuf; pbuf = pbuf->next_buffer)
- running_size += pbuf->buffer_size;
-
- if (total_size) {
- if (total_size != running_size)
- goto bailout;
- } else {
- /* Remember total size for future reference. */
- total_size = running_size;
- }
-
- if (!check_for_overlaps())
- goto bailout;
-
- return 1;
-
- bailout:
- ccprintf("Line %d, counter %d. The list has been corrupted, "
- "total size %d, running size %d\n",
- line, counter, total_size, running_size);
- return 0;
-}
-
-/*
- * Bitmap used to keep track of branches taken by malloc/free routines. Once
- * all bits in the 0..(MAX_MASK_BIT - 1) range are set, consider the test
- * completed.
- */
-static uint32_t test_map;
-
-void run_test(int argc, char **argv)
-{
- int index;
- const int shmem_size = shared_mem_size();
-
- while (counter--) {
- char *shptr;
- uint32_t r_data;
-
- r_data = myrand();
-
- if (!(counter % 50000))
- ccprintf("%d\n", counter);
-
- /*
- * If all bits we care about are set in the map - the test is
- * over.
- */
- if ((test_map & ALL_PATHS_MASK) == ALL_PATHS_MASK) {
- if (test_map & ~ALL_PATHS_MASK) {
- ccprintf("Unexpected mask bits set: %x"
- ", counter %d\n",
- test_map & ~ALL_PATHS_MASK,
- counter);
- test_fail();
- return;
- }
- ccprintf("Done testing, counter at %d\n", counter);
- test_pass();
- return;
- }
-
- /* Pick a random allocation entry. */
- index = r_data % ARRAY_SIZE(allocations);
- if (allocations[index].buf) {
- /*
- * If there is a buffer associated with the entry -
- * release it.
- */
- shared_mem_release(allocations[index].buf);
- allocations[index].buf = 0;
- if (!shmem_is_ok(__LINE__)) {
- test_fail();
- return;
- }
- } else {
- size_t alloc_size = r_data % (shmem_size / 2);
-
- /*
- * If the allocation entry is empty - allocate a
- * buffer of a random size up to max shared memory.
- */
- if (shared_mem_acquire(alloc_size, &shptr) ==
- EC_SUCCESS) {
- allocations[index].buf = (void *) shptr;
- allocations[index].buffer_size = alloc_size;
-
- /*
- * Make sure every allocated byte is
- * modified.
- */
- while (alloc_size--)
- shptr[alloc_size] =
- shptr[alloc_size] ^ 0xff;
-
- if (!shmem_is_ok(__LINE__)) {
- test_fail();
- return;
- }
- }
- }
- }
-
- /*
- * The test is over, free all still allcated buffers, if any. Keep
- * verifying memory consistency after each free() invocation.
- */
- for (index = 0; index < ARRAY_SIZE(allocations); index++)
- if (allocations[index].buf) {
- shared_mem_release(allocations[index].buf);
- allocations[index].buf = NULL;
- if (!shmem_is_ok(__LINE__)) {
- test_fail();
- return;
- }
- }
-
- ccprintf("Did not pass all paths, map %x != %x\n",
- test_map, ALL_PATHS_MASK);
- test_fail();
-}
-
-void set_map_bit(uint32_t mask)
-{
- test_map |= mask;
-}