Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | /*
* Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/*
* @file linux/sys.h
* @brief Linux system primitives for libmetal.
*/
#ifndef __METAL_SYS__H__
#error "Include metal/sys.h instead of metal/linux/sys.h"
#endif
#ifndef __METAL_LINUX_SYS__H__
#define __METAL_LINUX_SYS__H__
#include <errno.h>
#include <fcntl.h>
#include <libgen.h>
#include <limits.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <syslog.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/futex.h>
#include <sysfs/libsysfs.h>
#ifdef HAVE_HUGETLBFS_H
#include <hugetlbfs.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define METAL_INVALID_VADDR NULL
#define MAX_PAGE_SIZES 32
/** Structure of shared page or hugepage sized data. */
struct metal_page_size {
/** Page size. */
size_t page_size;
/** Page shift. */
unsigned long page_shift;
/** Path to hugetlbfs (or tmpfs) mount point. */
char path[PATH_MAX];
/** Flags to use for mmap. */
int mmap_flags;
};
/** Structure of linux specific libmetal runtime state. */
struct metal_state {
/** Common (system independent) data. */
struct metal_common_state common;
/** file descriptor for shared data. */
int data_fd;
/** system page size. */
unsigned long page_size;
/** system page shift. */
unsigned long page_shift;
/** sysfs mount point. */
const char *sysfs_path;
/** sysfs mount point. */
const char *tmp_path;
/** available page sizes. */
struct metal_page_size page_sizes[MAX_PAGE_SIZES];
/** number of available page sizes. */
int num_page_sizes;
/** File descriptor for /proc/self/pagemap (or -1). */
int pagemap_fd;
};
#ifdef METAL_INTERNAL
extern int metal_linux_bus_init(void);
extern void metal_linux_bus_finish(void);
extern int metal_open(const char *path, int shm);
extern int metal_open_unlinked(const char *path, int shm);
extern int metal_mktemp(char *template, int fifo);
extern int metal_mktemp_unlinked(char *template);
extern int metal_map(int fd, off_t offset, size_t size, int expand,
int flags, void **result);
extern int metal_unmap(void *mem, size_t size);
extern int metal_mlock(void *mem, size_t size);
extern void metal_randomize_string(char *template);
extern void metal_mktemp_template(char template[PATH_MAX],
const char *name);
extern int metal_virt2phys(void *addr, unsigned long *phys);
#define metal_for_each_page_size_up(ps) \
for ((ps) = &_metal.page_sizes[0]; \
(ps) <= &_metal.page_sizes[_metal.num_page_sizes - 1]; \
(ps)++)
#define metal_for_each_page_size_down(ps) \
for ((ps) = &_metal.page_sizes[_metal.num_page_sizes - 1]; \
(ps) >= &_metal.page_sizes[0]; \
(ps)--)
#endif
#ifdef __cplusplus
}
#endif
#endif /* __METAL_LINUX_SYS__H__ */
|