tools/virtio: separate headers more.
This makes them a bit more like the kernel headers, so we can include more real kernel headers in our tests. In addition this means that we don't break tools/virtio with the next patch. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Родитель
a9a0fef779
Коммит
61d0b5a4b2
|
@ -0,0 +1,14 @@
|
|||
#if defined(__i386__) || defined(__x86_64__)
|
||||
#define barrier() asm volatile("" ::: "memory")
|
||||
#define mb() __sync_synchronize()
|
||||
|
||||
#define smp_mb() mb()
|
||||
# define smp_rmb() barrier()
|
||||
# define smp_wmb() barrier()
|
||||
/* Weak barriers should be used. If not - it's a bug */
|
||||
# define rmb() abort()
|
||||
# define wmb() abort()
|
||||
#else
|
||||
#error Please fill in barrier macros
|
||||
#endif
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#ifndef BUG_H
|
||||
#define BUG_H
|
||||
|
||||
#define BUG_ON(__BUG_ON_cond) assert(!(__BUG_ON_cond))
|
||||
|
||||
#define BUILD_BUG_ON(x)
|
||||
|
||||
#define BUG() abort()
|
||||
|
||||
#endif /* BUG_H */
|
|
@ -0,0 +1,26 @@
|
|||
#ifndef ERR_H
|
||||
#define ERR_H
|
||||
#define MAX_ERRNO 4095
|
||||
|
||||
#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
|
||||
|
||||
static inline void * __must_check ERR_PTR(long error)
|
||||
{
|
||||
return (void *) error;
|
||||
}
|
||||
|
||||
static inline long __must_check PTR_ERR(const void *ptr)
|
||||
{
|
||||
return (long) ptr;
|
||||
}
|
||||
|
||||
static inline long __must_check IS_ERR(const void *ptr)
|
||||
{
|
||||
return IS_ERR_VALUE((unsigned long)ptr);
|
||||
}
|
||||
|
||||
static inline long __must_check IS_ERR_OR_NULL(const void *ptr)
|
||||
{
|
||||
return !ptr || IS_ERR_VALUE((unsigned long)ptr);
|
||||
}
|
||||
#endif /* ERR_H */
|
|
@ -0,0 +1,5 @@
|
|||
#define EXPORT_SYMBOL(sym)
|
||||
#define EXPORT_SYMBOL_GPL(sym)
|
||||
#define EXPORT_SYMBOL_GPL_FUTURE(sym)
|
||||
#define EXPORT_UNUSED_SYMBOL(sym)
|
||||
#define EXPORT_UNUSED_SYMBOL_GPL(sym)
|
|
@ -0,0 +1 @@
|
|||
#include "../../../include/linux/irqreturn.h"
|
|
@ -0,0 +1,112 @@
|
|||
#ifndef KERNEL_H
|
||||
#define KERNEL_H
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/bug.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <asm/barrier.h>
|
||||
|
||||
#define CONFIG_SMP
|
||||
|
||||
#define PAGE_SIZE getpagesize()
|
||||
#define PAGE_MASK (~(PAGE_SIZE-1))
|
||||
|
||||
typedef unsigned long long dma_addr_t;
|
||||
typedef size_t __kernel_size_t;
|
||||
|
||||
struct page {
|
||||
unsigned long long dummy;
|
||||
};
|
||||
|
||||
/* Physical == Virtual */
|
||||
#define virt_to_phys(p) ((unsigned long)p)
|
||||
#define phys_to_virt(a) ((void *)(unsigned long)(a))
|
||||
/* Page address: Virtual / 4K */
|
||||
#define page_to_phys(p) ((dma_addr_t)(unsigned long)(p))
|
||||
#define virt_to_page(p) ((struct page *)((unsigned long)p & PAGE_MASK))
|
||||
|
||||
#define offset_in_page(p) (((unsigned long)p) % PAGE_SIZE)
|
||||
|
||||
#define __printf(a,b) __attribute__((format(printf,a,b)))
|
||||
|
||||
typedef enum {
|
||||
GFP_KERNEL,
|
||||
GFP_ATOMIC,
|
||||
__GFP_HIGHMEM,
|
||||
__GFP_HIGH
|
||||
} gfp_t;
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
|
||||
|
||||
extern void *__kmalloc_fake, *__kfree_ignore_start, *__kfree_ignore_end;
|
||||
static inline void *kmalloc(size_t s, gfp_t gfp)
|
||||
{
|
||||
if (__kmalloc_fake)
|
||||
return __kmalloc_fake;
|
||||
return malloc(s);
|
||||
}
|
||||
|
||||
static inline void kfree(void *p)
|
||||
{
|
||||
if (p >= __kfree_ignore_start && p < __kfree_ignore_end)
|
||||
return;
|
||||
free(p);
|
||||
}
|
||||
|
||||
static inline void *krealloc(void *p, size_t s, gfp_t gfp)
|
||||
{
|
||||
return realloc(p, s);
|
||||
}
|
||||
|
||||
|
||||
static inline unsigned long __get_free_page(gfp_t gfp)
|
||||
{
|
||||
void *p;
|
||||
|
||||
posix_memalign(&p, PAGE_SIZE, PAGE_SIZE);
|
||||
return (unsigned long)p;
|
||||
}
|
||||
|
||||
static inline void free_page(unsigned long addr)
|
||||
{
|
||||
free((void *)addr);
|
||||
}
|
||||
|
||||
#define container_of(ptr, type, member) ({ \
|
||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
||||
(type *)( (char *)__mptr - offsetof(type,member) );})
|
||||
|
||||
#define uninitialized_var(x) x = x
|
||||
|
||||
# ifndef likely
|
||||
# define likely(x) (__builtin_expect(!!(x), 1))
|
||||
# endif
|
||||
# ifndef unlikely
|
||||
# define unlikely(x) (__builtin_expect(!!(x), 0))
|
||||
# endif
|
||||
|
||||
#define pr_err(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
|
||||
#ifdef DEBUG
|
||||
#define pr_debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
|
||||
#else
|
||||
#define pr_debug(format, ...) do {} while (0)
|
||||
#endif
|
||||
#define dev_err(dev, format, ...) fprintf (stderr, format, ## __VA_ARGS__)
|
||||
#define dev_warn(dev, format, ...) fprintf (stderr, format, ## __VA_ARGS__)
|
||||
|
||||
#define min(x, y) ({ \
|
||||
typeof(x) _min1 = (x); \
|
||||
typeof(y) _min2 = (y); \
|
||||
(void) (&_min1 == &_min2); \
|
||||
_min1 < _min2 ? _min1 : _min2; })
|
||||
|
||||
#endif /* KERNEL_H */
|
|
@ -0,0 +1 @@
|
|||
#include <linux/export.h>
|
|
@ -0,0 +1,4 @@
|
|||
#include "../../../include/linux/kern_levels.h"
|
||||
|
||||
#define printk printf
|
||||
#define vprintk vprintf
|
|
@ -0,0 +1,4 @@
|
|||
#define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init) int name = 0
|
||||
|
||||
#define __ratelimit(x) (*(x))
|
||||
|
|
@ -0,0 +1,173 @@
|
|||
#ifndef SCATTERLIST_H
|
||||
#define SCATTERLIST_H
|
||||
#include <linux/kernel.h>
|
||||
|
||||
struct scatterlist {
|
||||
unsigned long page_link;
|
||||
unsigned int offset;
|
||||
unsigned int length;
|
||||
dma_addr_t dma_address;
|
||||
};
|
||||
|
||||
/* Scatterlist helpers, stolen from linux/scatterlist.h */
|
||||
#define sg_is_chain(sg) ((sg)->page_link & 0x01)
|
||||
#define sg_is_last(sg) ((sg)->page_link & 0x02)
|
||||
#define sg_chain_ptr(sg) \
|
||||
((struct scatterlist *) ((sg)->page_link & ~0x03))
|
||||
|
||||
/**
|
||||
* sg_assign_page - Assign a given page to an SG entry
|
||||
* @sg: SG entry
|
||||
* @page: The page
|
||||
*
|
||||
* Description:
|
||||
* Assign page to sg entry. Also see sg_set_page(), the most commonly used
|
||||
* variant.
|
||||
*
|
||||
**/
|
||||
static inline void sg_assign_page(struct scatterlist *sg, struct page *page)
|
||||
{
|
||||
unsigned long page_link = sg->page_link & 0x3;
|
||||
|
||||
/*
|
||||
* In order for the low bit stealing approach to work, pages
|
||||
* must be aligned at a 32-bit boundary as a minimum.
|
||||
*/
|
||||
BUG_ON((unsigned long) page & 0x03);
|
||||
#ifdef CONFIG_DEBUG_SG
|
||||
BUG_ON(sg->sg_magic != SG_MAGIC);
|
||||
BUG_ON(sg_is_chain(sg));
|
||||
#endif
|
||||
sg->page_link = page_link | (unsigned long) page;
|
||||
}
|
||||
|
||||
/**
|
||||
* sg_set_page - Set sg entry to point at given page
|
||||
* @sg: SG entry
|
||||
* @page: The page
|
||||
* @len: Length of data
|
||||
* @offset: Offset into page
|
||||
*
|
||||
* Description:
|
||||
* Use this function to set an sg entry pointing at a page, never assign
|
||||
* the page directly. We encode sg table information in the lower bits
|
||||
* of the page pointer. See sg_page() for looking up the page belonging
|
||||
* to an sg entry.
|
||||
*
|
||||
**/
|
||||
static inline void sg_set_page(struct scatterlist *sg, struct page *page,
|
||||
unsigned int len, unsigned int offset)
|
||||
{
|
||||
sg_assign_page(sg, page);
|
||||
sg->offset = offset;
|
||||
sg->length = len;
|
||||
}
|
||||
|
||||
static inline struct page *sg_page(struct scatterlist *sg)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_SG
|
||||
BUG_ON(sg->sg_magic != SG_MAGIC);
|
||||
BUG_ON(sg_is_chain(sg));
|
||||
#endif
|
||||
return (struct page *)((sg)->page_link & ~0x3);
|
||||
}
|
||||
|
||||
/*
|
||||
* Loop over each sg element, following the pointer to a new list if necessary
|
||||
*/
|
||||
#define for_each_sg(sglist, sg, nr, __i) \
|
||||
for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg))
|
||||
|
||||
/**
|
||||
* sg_chain - Chain two sglists together
|
||||
* @prv: First scatterlist
|
||||
* @prv_nents: Number of entries in prv
|
||||
* @sgl: Second scatterlist
|
||||
*
|
||||
* Description:
|
||||
* Links @prv@ and @sgl@ together, to form a longer scatterlist.
|
||||
*
|
||||
**/
|
||||
static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents,
|
||||
struct scatterlist *sgl)
|
||||
{
|
||||
/*
|
||||
* offset and length are unused for chain entry. Clear them.
|
||||
*/
|
||||
prv[prv_nents - 1].offset = 0;
|
||||
prv[prv_nents - 1].length = 0;
|
||||
|
||||
/*
|
||||
* Set lowest bit to indicate a link pointer, and make sure to clear
|
||||
* the termination bit if it happens to be set.
|
||||
*/
|
||||
prv[prv_nents - 1].page_link = ((unsigned long) sgl | 0x01) & ~0x02;
|
||||
}
|
||||
|
||||
/**
|
||||
* sg_mark_end - Mark the end of the scatterlist
|
||||
* @sg: SG entryScatterlist
|
||||
*
|
||||
* Description:
|
||||
* Marks the passed in sg entry as the termination point for the sg
|
||||
* table. A call to sg_next() on this entry will return NULL.
|
||||
*
|
||||
**/
|
||||
static inline void sg_mark_end(struct scatterlist *sg)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_SG
|
||||
BUG_ON(sg->sg_magic != SG_MAGIC);
|
||||
#endif
|
||||
/*
|
||||
* Set termination bit, clear potential chain bit
|
||||
*/
|
||||
sg->page_link |= 0x02;
|
||||
sg->page_link &= ~0x01;
|
||||
}
|
||||
|
||||
static inline struct scatterlist *sg_next(struct scatterlist *sg)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_SG
|
||||
BUG_ON(sg->sg_magic != SG_MAGIC);
|
||||
#endif
|
||||
if (sg_is_last(sg))
|
||||
return NULL;
|
||||
|
||||
sg++;
|
||||
if (unlikely(sg_is_chain(sg)))
|
||||
sg = sg_chain_ptr(sg);
|
||||
|
||||
return sg;
|
||||
}
|
||||
|
||||
static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents)
|
||||
{
|
||||
memset(sgl, 0, sizeof(*sgl) * nents);
|
||||
#ifdef CONFIG_DEBUG_SG
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < nents; i++)
|
||||
sgl[i].sg_magic = SG_MAGIC;
|
||||
}
|
||||
#endif
|
||||
sg_mark_end(&sgl[nents - 1]);
|
||||
}
|
||||
|
||||
static inline dma_addr_t sg_phys(struct scatterlist *sg)
|
||||
{
|
||||
return page_to_phys(sg_page(sg)) + sg->offset;
|
||||
}
|
||||
|
||||
static inline void sg_set_buf(struct scatterlist *sg, const void *buf,
|
||||
unsigned int buflen)
|
||||
{
|
||||
sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf));
|
||||
}
|
||||
|
||||
static inline void sg_init_one(struct scatterlist *sg,
|
||||
const void *buf, unsigned int buflen)
|
||||
{
|
||||
sg_init_table(sg, 1);
|
||||
sg_set_buf(sg, buf, buflen);
|
||||
}
|
||||
#endif /* SCATTERLIST_H */
|
|
@ -0,0 +1,28 @@
|
|||
#ifndef TYPES_H
|
||||
#define TYPES_H
|
||||
#include <stdint.h>
|
||||
|
||||
#define __force
|
||||
#define __user
|
||||
#define __must_check
|
||||
#define __cold
|
||||
|
||||
typedef uint64_t u64;
|
||||
typedef int64_t s64;
|
||||
typedef uint32_t u32;
|
||||
typedef int32_t s32;
|
||||
typedef uint16_t u16;
|
||||
typedef int16_t s16;
|
||||
typedef uint8_t u8;
|
||||
typedef int8_t s8;
|
||||
|
||||
typedef uint64_t __u64;
|
||||
typedef int64_t __s64;
|
||||
typedef uint32_t __u32;
|
||||
typedef int32_t __s32;
|
||||
typedef uint16_t __u16;
|
||||
typedef int16_t __s16;
|
||||
typedef uint8_t __u8;
|
||||
typedef int8_t __s8;
|
||||
|
||||
#endif /* TYPES_H */
|
|
@ -0,0 +1,50 @@
|
|||
#ifndef UACCESS_H
|
||||
#define UACCESS_H
|
||||
extern void *__user_addr_min, *__user_addr_max;
|
||||
|
||||
#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
|
||||
|
||||
static inline void __chk_user_ptr(const volatile void *p, size_t size)
|
||||
{
|
||||
assert(p >= __user_addr_min && p + size <= __user_addr_max);
|
||||
}
|
||||
|
||||
#define put_user(x, ptr) \
|
||||
({ \
|
||||
typeof(ptr) __pu_ptr = (ptr); \
|
||||
__chk_user_ptr(__pu_ptr, sizeof(*__pu_ptr)); \
|
||||
ACCESS_ONCE(*(__pu_ptr)) = x; \
|
||||
0; \
|
||||
})
|
||||
|
||||
#define get_user(x, ptr) \
|
||||
({ \
|
||||
typeof(ptr) __pu_ptr = (ptr); \
|
||||
__chk_user_ptr(__pu_ptr, sizeof(*__pu_ptr)); \
|
||||
x = ACCESS_ONCE(*(__pu_ptr)); \
|
||||
0; \
|
||||
})
|
||||
|
||||
static void volatile_memcpy(volatile char *to, const volatile char *from,
|
||||
unsigned long n)
|
||||
{
|
||||
while (n--)
|
||||
*(to++) = *(from++);
|
||||
}
|
||||
|
||||
static inline int copy_from_user(void *to, const void __user volatile *from,
|
||||
unsigned long n)
|
||||
{
|
||||
__chk_user_ptr(from, n);
|
||||
volatile_memcpy(to, from, n);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int copy_to_user(void __user volatile *to, const void *from,
|
||||
unsigned long n)
|
||||
{
|
||||
__chk_user_ptr(to, n);
|
||||
volatile_memcpy(to, from, n);
|
||||
return 0;
|
||||
}
|
||||
#endif /* UACCESS_H */
|
|
@ -0,0 +1 @@
|
|||
#include "../../../include/linux/uio.h"
|
|
@ -1,129 +1,7 @@
|
|||
#ifndef LINUX_VIRTIO_H
|
||||
#define LINUX_VIRTIO_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <errno.h>
|
||||
|
||||
typedef unsigned long long dma_addr_t;
|
||||
|
||||
struct scatterlist {
|
||||
unsigned long page_link;
|
||||
unsigned int offset;
|
||||
unsigned int length;
|
||||
dma_addr_t dma_address;
|
||||
};
|
||||
|
||||
struct page {
|
||||
unsigned long long dummy;
|
||||
};
|
||||
|
||||
#define BUG_ON(__BUG_ON_cond) assert(!(__BUG_ON_cond))
|
||||
|
||||
/* Physical == Virtual */
|
||||
#define virt_to_phys(p) ((unsigned long)p)
|
||||
#define phys_to_virt(a) ((void *)(unsigned long)(a))
|
||||
/* Page address: Virtual / 4K */
|
||||
#define virt_to_page(p) ((struct page*)((virt_to_phys(p) / 4096) * \
|
||||
sizeof(struct page)))
|
||||
#define offset_in_page(p) (((unsigned long)p) % 4096)
|
||||
#define sg_phys(sg) ((sg->page_link & ~0x3) / sizeof(struct page) * 4096 + \
|
||||
sg->offset)
|
||||
static inline void sg_mark_end(struct scatterlist *sg)
|
||||
{
|
||||
/*
|
||||
* Set termination bit, clear potential chain bit
|
||||
*/
|
||||
sg->page_link |= 0x02;
|
||||
sg->page_link &= ~0x01;
|
||||
}
|
||||
static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents)
|
||||
{
|
||||
memset(sgl, 0, sizeof(*sgl) * nents);
|
||||
sg_mark_end(&sgl[nents - 1]);
|
||||
}
|
||||
static inline void sg_assign_page(struct scatterlist *sg, struct page *page)
|
||||
{
|
||||
unsigned long page_link = sg->page_link & 0x3;
|
||||
|
||||
/*
|
||||
* In order for the low bit stealing approach to work, pages
|
||||
* must be aligned at a 32-bit boundary as a minimum.
|
||||
*/
|
||||
BUG_ON((unsigned long) page & 0x03);
|
||||
sg->page_link = page_link | (unsigned long) page;
|
||||
}
|
||||
|
||||
static inline void sg_set_page(struct scatterlist *sg, struct page *page,
|
||||
unsigned int len, unsigned int offset)
|
||||
{
|
||||
sg_assign_page(sg, page);
|
||||
sg->offset = offset;
|
||||
sg->length = len;
|
||||
}
|
||||
|
||||
static inline void sg_set_buf(struct scatterlist *sg, const void *buf,
|
||||
unsigned int buflen)
|
||||
{
|
||||
sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf));
|
||||
}
|
||||
|
||||
static inline void sg_init_one(struct scatterlist *sg, const void *buf, unsigned int buflen)
|
||||
{
|
||||
sg_init_table(sg, 1);
|
||||
sg_set_buf(sg, buf, buflen);
|
||||
}
|
||||
|
||||
typedef __u16 u16;
|
||||
|
||||
typedef enum {
|
||||
GFP_KERNEL,
|
||||
GFP_ATOMIC,
|
||||
__GFP_HIGHMEM,
|
||||
__GFP_HIGH
|
||||
} gfp_t;
|
||||
typedef enum {
|
||||
IRQ_NONE,
|
||||
IRQ_HANDLED
|
||||
} irqreturn_t;
|
||||
|
||||
static inline void *kmalloc(size_t s, gfp_t gfp)
|
||||
{
|
||||
return malloc(s);
|
||||
}
|
||||
|
||||
static inline void kfree(void *p)
|
||||
{
|
||||
free(p);
|
||||
}
|
||||
|
||||
#define container_of(ptr, type, member) ({ \
|
||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
||||
(type *)( (char *)__mptr - offsetof(type,member) );})
|
||||
|
||||
#define uninitialized_var(x) x = x
|
||||
|
||||
# ifndef likely
|
||||
# define likely(x) (__builtin_expect(!!(x), 1))
|
||||
# endif
|
||||
# ifndef unlikely
|
||||
# define unlikely(x) (__builtin_expect(!!(x), 0))
|
||||
# endif
|
||||
|
||||
#define pr_err(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
|
||||
#ifdef DEBUG
|
||||
#define pr_debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
|
||||
#else
|
||||
#define pr_debug(format, ...) do {} while (0)
|
||||
#endif
|
||||
#define dev_err(dev, format, ...) fprintf (stderr, format, ## __VA_ARGS__)
|
||||
#define dev_warn(dev, format, ...) fprintf (stderr, format, ## __VA_ARGS__)
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
/* TODO: empty stubs for now. Broken but enough for virtio_ring.c */
|
||||
#define list_add_tail(a, b) do {} while (0)
|
||||
|
@ -133,6 +11,7 @@ static inline void kfree(void *p)
|
|||
#define BITS_PER_BYTE 8
|
||||
#define BITS_PER_LONG (sizeof(long) * BITS_PER_BYTE)
|
||||
#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
|
||||
|
||||
/* TODO: Not atomic as it should be:
|
||||
* we don't use this for anything important. */
|
||||
static inline void clear_bit(int nr, volatile unsigned long *addr)
|
||||
|
@ -147,10 +26,6 @@ static inline int test_bit(int nr, const volatile unsigned long *addr)
|
|||
{
|
||||
return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
|
||||
}
|
||||
|
||||
/* The only feature we care to support */
|
||||
#define virtio_has_feature(dev, feature) \
|
||||
test_bit((feature), (dev)->features)
|
||||
/* end of stubs */
|
||||
|
||||
struct virtio_device {
|
||||
|
@ -170,28 +45,9 @@ struct virtqueue {
|
|||
void *priv;
|
||||
};
|
||||
|
||||
#define EXPORT_SYMBOL_GPL(__EXPORT_SYMBOL_GPL_name) \
|
||||
void __EXPORT_SYMBOL_GPL##__EXPORT_SYMBOL_GPL_name() { \
|
||||
}
|
||||
#define MODULE_LICENSE(__MODULE_LICENSE_value) \
|
||||
const char *__MODULE_LICENSE_name = __MODULE_LICENSE_value
|
||||
|
||||
#define CONFIG_SMP
|
||||
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
#define barrier() asm volatile("" ::: "memory")
|
||||
#define mb() __sync_synchronize()
|
||||
|
||||
#define smp_mb() mb()
|
||||
# define smp_rmb() barrier()
|
||||
# define smp_wmb() barrier()
|
||||
/* Weak barriers should be used. If not - it's a bug */
|
||||
# define rmb() abort()
|
||||
# define wmb() abort()
|
||||
#else
|
||||
#error Please fill in barrier macros
|
||||
#endif
|
||||
|
||||
/* Interfaces exported by virtio_ring. */
|
||||
int virtqueue_add_buf(struct virtqueue *vq,
|
||||
struct scatterlist sg[],
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
#define VIRTIO_TRANSPORT_F_START 28
|
||||
#define VIRTIO_TRANSPORT_F_END 32
|
||||
|
||||
#define virtio_has_feature(dev, feature) \
|
||||
test_bit((feature), (dev)->features)
|
||||
|
|
@ -0,0 +1 @@
|
|||
#include "../../../include/linux/virtio_ring.h"
|
|
@ -0,0 +1 @@
|
|||
#include "../../../include/linux/vringh.h"
|
|
@ -0,0 +1 @@
|
|||
#include <sys/uio.h>
|
|
@ -0,0 +1 @@
|
|||
#include "../../../../include/uapi/linux/virtio_config.h"
|
|
@ -0,0 +1,4 @@
|
|||
#ifndef VIRTIO_RING_H
|
||||
#define VIRTIO_RING_H
|
||||
#include "../../../../include/uapi/linux/virtio_ring.h"
|
||||
#endif /* VIRTIO_RING_H */
|
|
@ -10,11 +10,15 @@
|
|||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
#include <linux/vhost.h>
|
||||
#include <linux/virtio.h>
|
||||
#include <linux/virtio_ring.h>
|
||||
#include "../../drivers/vhost/test.h"
|
||||
|
||||
/* Unused */
|
||||
void *__kmalloc_fake, *__kfree_ignore_start, *__kfree_ignore_end;
|
||||
|
||||
struct vq_info {
|
||||
int kick;
|
||||
int call;
|
||||
|
|
Загрузка…
Ссылка в новой задаче