60 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			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);
 | 
						|
 |