/* SPDX-License-Identifier: GPL-2.0+ */#pragma once/* * Contains declarations that exist in the kernel which have been CUSTOMISED for * testing purposes to faciliate userland VMA testing. */#ifdef CONFIG_MMUextern unsigned long mmap_min_addr;extern unsigned long dac_mmap_min_addr;#else#define mmap_min_addr 0UL#define dac_mmap_min_addr 0UL#endif#define TASK_SIZE ((1ul << 47)-PAGE_SIZE)/* * The shared stubs do not implement this, it amounts to an fprintf(STDERR,...) * either way :) */#define pr_warn_once pr_errstruct anon_vma { struct anon_vma *root; struct rb_root_cached rb_root; /* Test fields. */ bool was_cloned; bool was_unlinked;};static inline void unlink_anon_vmas(struct vm_area_struct *vma){ /* For testing purposes, indicate that the anon_vma was unlinked. */ vma->anon_vma->was_unlinked = true;}static inline void vma_start_write(struct vm_area_struct *vma){ /* Used to indicate to tests that a write operation has begun. */ vma->vm_lock_seq++;}static inline __must_checkint vma_start_write_killable(struct vm_area_struct *vma){ /* Used to indicate to tests that a write operation has begun. */ vma->vm_lock_seq++; return 0;}static inline int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src, enum vma_operation operation){ /* For testing purposes. We indicate that an anon_vma has been cloned. */ if (src->anon_vma != NULL) { dst->anon_vma = src->anon_vma; dst->anon_vma->was_cloned = true; } return 0;}static inline int __anon_vma_prepare(struct vm_area_struct *vma){ struct anon_vma *anon_vma = calloc(1, sizeof(struct anon_vma)); if (!anon_vma) return -ENOMEM; anon_vma->root = anon_vma; vma->anon_vma = anon_vma; return 0;}static inline int anon_vma_prepare(struct vm_area_struct *vma){ if (likely(vma->anon_vma)) return 0; return __anon_vma_prepare(vma);}static inline void vma_lock_init(struct vm_area_struct *vma, bool reset_refcnt){ if (reset_refcnt) refcount_set(&vma->vm_refcnt, 0);}static inline unsigned long vma_kernel_pagesize(struct vm_area_struct *vma){ return PAGE_SIZE;}
/* SPDX-License-Identifier: GPL-2.0+ */
#pragma once
/*
* Contains declarations that exist in the kernel which have been CUSTOMISED for
* testing purposes to faciliate userland VMA testing.
*/
#ifdef CONFIG_MMU
extern unsigned long mmap_min_addr;
extern unsigned long dac_mmap_min_addr;
#else
#define mmap_min_addr 0UL
#define dac_mmap_min_addr 0UL
#endif
#define TASK_SIZE ((1ul << 47)-PAGE_SIZE)
/*
* The shared stubs do not implement this, it amounts to an fprintf(STDERR,...)
* either way :)
*/
#define pr_warn_once pr_err
struct anon_vma {
struct anon_vma *root;
struct rb_root_cached rb_root;
/* Test fields. */
bool was_cloned;
bool was_unlinked;
};
static inline void unlink_anon_vmas(struct vm_area_struct *vma)
{
/* For testing purposes, indicate that the anon_vma was unlinked. */
vma->anon_vma->was_unlinked = true;
}
static inline void vma_start_write(struct vm_area_struct *vma)
{
/* Used to indicate to tests that a write operation has begun. */
vma->vm_lock_seq++;
}
static inline __must_check
int vma_start_write_killable(struct vm_area_struct *vma)
{
/* Used to indicate to tests that a write operation has begun. */
vma->vm_lock_seq++;
return 0;
}
static inline int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src,
enum vma_operation operation)
{
/* For testing purposes. We indicate that an anon_vma has been cloned. */
if (src->anon_vma != NULL) {
dst->anon_vma = src->anon_vma;
dst->anon_vma->was_cloned = true;
}
return 0;
}
static inline int __anon_vma_prepare(struct vm_area_struct *vma)
{
struct anon_vma *anon_vma = calloc(1, sizeof(struct anon_vma));
if (!anon_vma)
return -ENOMEM;
anon_vma->root = anon_vma;
vma->anon_vma = anon_vma;
return 0;
}
static inline int anon_vma_prepare(struct vm_area_struct *vma)
{
if (likely(vma->anon_vma))
return 0;
return __anon_vma_prepare(vma);
}
static inline void vma_lock_init(struct vm_area_struct *vma, bool reset_refcnt)
{
if (reset_refcnt)
refcount_set(&vma->vm_refcnt, 0);
}
static inline unsigned long vma_kernel_pagesize(struct vm_area_struct *vma)
{
return PAGE_SIZE;
}