Files
checker_m4/source/OpenAMP/libmetal/test/system/linux/shmem.c
2023-06-21 18:00:56 +08:00

60 lines
1.3 KiB
C

/*
* Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "metal-test.h"
#include <metal/log.h>
#include <metal/mutex.h>
#include <metal/shmem.h>
#include <metal/sys.h>
#include <metal/atomic.h>
static atomic_int nb_err = ATOMIC_VAR_INIT(0);
static const int shmem_threads = 10;
static void *shmem_child(void *arg)
{
const char *name = arg;
struct {
metal_mutex_t mutex;
int counter;
} *virt;
struct metal_io_region *io;
unsigned long phys;
size_t size = 2 * 1024 * 1024;
int error;
error = metal_shmem_open(name, size, &io);
if (error) {
metal_log(METAL_LOG_ERROR, "Failed shmem_open: %d.\n", error);
atomic_fetch_add(&nb_err, 1);
return NULL;
}
virt = metal_io_virt(io, 0);
phys = metal_io_phys(io, 0);
if (phys != METAL_BAD_OFFSET) {
if (virt != metal_io_phys_to_virt(io, phys)) {
atomic_fetch_add(&nb_err, 1);
metal_log(METAL_LOG_ERROR, "Failed virt != phys.\n");
}
if (phys != metal_io_virt_to_phys(io, virt)) {
atomic_fetch_add(&nb_err, 1);
metal_log(METAL_LOG_ERROR, "Failed phys != virt.\n");
}
}
metal_io_finish(io);
return NULL;
}
static int shmem(void)
{
return atomic_load(&nb_err) || metal_run(shmem_threads, shmem_child, "/foo");
}
METAL_ADD_TEST(shmem);