Files
2026-08-24 10:03:24 +08:00

262 lines
8.9 KiB
C

/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef __SYMBOLS_H__
#define __SYMBOLS_H__
#include <linux/cleancache.h>
#include <linux/writeback.h>
#include <linux/parser.h>
#include <linux/iomap.h>
#include <linux/nls.h>
#include <linux/pagevec.h>
#include <linux/mempool.h>
#include <linux/fs_context.h>
#include <linux/fs_parser.h>
#include <linux/fscrypt.h>
#include <linux/quotaops.h>
#define EXT_FUN_TYPE1(a) extern a##_t f_##a
#define EXT_FUN_TYPEG(a) extern a##_g f_##a
#define EXT_FUN_TYPE2(a, b) extern a##_t f_##b
#define EXT_OBJ_TYPE(a, b) extern a * b##_t
#define FUN_TYPE1(a) a##_t f_##a; \
EXPORT_SYMBOL(f_##a)
#define FUN_TYPEG(a) a##_g f_##a; \
EXPORT_SYMBOL(f_##a)
#define FUN_TYPE2(a, b) a##_t f_##b; \
EXPORT_SYMBOL(f_##b)
#define OBJ_TYPE(a, b) a * b##_t; \
EXPORT_SYMBOL(b##_t)
#define FUN_ASSIGN(a) f_##a = a
#define OBJ_ASSIGN(a) a##_t = &a
#define KSYM_FUN(sym) \
{ \
.name = #sym, \
.data = &f_##sym, \
}
#ifdef CONFIG_KASAN_GENERIC
/* When KASAN enabled cfi is disabled */
#define KSYM_CFI(sym) \
{ \
.name = #sym , \
.data = &f_##sym, \
}
#else
#define KSYM_CFI(sym) \
{ \
.name = #sym ".cfi_jt", \
.data = &f_##sym, \
}
#endif
#define KSYM_OBJ(sym) \
{ \
.name = #sym, \
.data = &sym##_t, \
}
/*---------- erofs symbols ------------*/
typedef uint32_t (*xxh32_t)(const void *input, const size_t len, const uint32_t seed);
typedef int (*filemap_add_folio_t)(struct address_space *mapping, struct folio *folio,
pgoff_t index, gfp_t gfp);
typedef void (*psi_memstall_enter_t)(unsigned long *flags);
typedef void (*psi_memstall_leave_t)(unsigned long *flags);
typedef void (*migrate_disable_t)(void);
typedef void (*migrate_enable_t)(void);
typedef void (*flush_dcache_folio_t)(struct folio *folio);
typedef void (*folio_unlock_t)(struct folio *folio);
typedef unsigned long (*alloc_pages_bulk_noprof_t)(gfp_t gfp, int preferred_nid,
nodemask_t *nodemask, int nr_pages,
struct list_head *page_list,
struct page **page_array);
typedef int (*lockref_get_not_zero_t)(struct lockref *lockref);
typedef int (*lockref_put_or_lock_t)(struct lockref *lockref);
typedef void (*lockref_mark_dead_t)(struct lockref *lockref);
typedef void (*bio_init_t)(struct bio *bio, struct block_device *bdev, struct bio_vec *table,
unsigned short max_vecs, blk_opf_t opf);
typedef ssize_t (*vfs_iocb_iter_read_t)(struct file *file, struct kiocb *iocb,
struct iov_iter *iter);
typedef void (*__bio_advance_t)(struct bio *bio, unsigned bytes);
typedef void (*zero_fill_bio_iter_t)(struct bio *bio, struct bvec_iter start);
typedef void (*bio_uninit_t)(struct bio *bio);
typedef bool (*bio_add_folio_t)(struct bio *bio, struct folio *folio, size_t len,
size_t off);
typedef int (*get_tree_bdev_flags_t)(struct fs_context *fc,
int (*fill_super)(struct super_block *sb,
struct fs_context *fc), unsigned int flags);
typedef struct file *(*filp_open_t)(const char *filename, int flags, umode_t mode);
typedef int (*get_tree_nodev_t)(struct fs_context *fc,
int (*fill_super)(struct super_block *sb,
struct fs_context *fc));
typedef int (*super_setup_bdi_t)(struct super_block *sb);
typedef const char *(*bdi_dev_name_t)(struct backing_dev_info *bdi);
typedef struct folio *(*read_cache_folio_t)(struct address_space *mapping, pgoff_t index,
filler_t filler, struct file *file);
typedef void (*folio_end_read_t)(struct folio *folio, bool success);
typedef int (*iomap_read_folio_t)(struct folio *folio, const struct iomap_ops *ops);
typedef void (*iomap_invalidate_folio_t)(struct folio *folio, size_t offset, size_t len);
typedef bool (*iomap_release_folio_t)(struct folio *folio, gfp_t gfp_flags);
typedef unsigned long (*thp_get_unmapped_area_t)(struct file *filp, unsigned long addr,
unsigned long len, unsigned long pgoff, unsigned long flags);
typedef void (*__seq_puts_t)(struct seq_file *m, const char *s);
typedef size_t (*_copy_to_iter_t)(const void *addr, size_t bytes, struct iov_iter *i);
typedef void (*copy_highpage_t)(struct page *to, struct page *from);
typedef void (*iov_iter_bvec_t)(struct iov_iter *i, unsigned int direction,
const struct bio_vec *bvec, unsigned long nr_segs,
size_t count);
typedef char *(*kmemdup_nul_t)(const char *s, size_t len, gfp_t gfp);
typedef void *(*memchr_inv_t)(const void *start, int c, size_t bytes);
typedef void *(*kmem_cache_alloc_lru_noprof_t)(struct kmem_cache *s, struct list_lru *lru,
gfp_t gfpflags);
typedef pgoff_t (*__folio_swap_cache_index_t)(struct folio *folio);
typedef struct file *(*bdev_file_open_by_path_t)(const char *path, blk_mode_t mode,
void *holder,
const struct blk_holder_ops *hops);
typedef struct block_device *(*file_bdev_t)(struct file *bdev_file);
typedef int (*generic_encode_ino32_fh_t)(struct inode *inode, __u32 *fh, int *max_len,
struct inode *parent);
typedef struct folio *(*__filemap_get_folio_t)(struct address_space *mapping, pgoff_t index,
fgf_t fgp_flags, gfp_t gfp);
typedef ssize_t (*filemap_splice_read_t)(struct file *in, loff_t *ppos,
struct pipe_inode_info *pipe,
size_t len, unsigned int flags);
typedef void (*wait_for_completion_io_t)(struct completion *);
/*--------- erofs symbols ----------*/
EXT_FUN_TYPE1(wait_for_completion_io);
EXT_FUN_TYPE1(xxh32);
EXT_FUN_TYPE1(__filemap_get_folio);
EXT_FUN_TYPE1(file_bdev);
EXT_FUN_TYPE1(filemap_add_folio);
EXT_FUN_TYPE1(flush_dcache_folio);
EXT_FUN_TYPE1(psi_memstall_leave);
EXT_FUN_TYPE1(psi_memstall_enter);
EXT_FUN_TYPE1(migrate_disable);
EXT_FUN_TYPE1(migrate_enable);
EXT_FUN_TYPE1(alloc_pages_bulk_noprof);
EXT_FUN_TYPE1(generic_encode_ino32_fh);
EXT_FUN_TYPE1(__folio_swap_cache_index);
EXT_FUN_TYPE1(lockref_get_not_zero);
EXT_FUN_TYPE1(lockref_put_or_lock);
EXT_FUN_TYPE1(lockref_mark_dead);
EXT_FUN_TYPE1(bio_init);
EXT_FUN_TYPE1(filemap_splice_read);
EXT_FUN_TYPE1(vfs_iocb_iter_read);
EXT_FUN_TYPE1(__bio_advance);
EXT_FUN_TYPE1(zero_fill_bio_iter);
EXT_FUN_TYPE1(bio_uninit);
EXT_FUN_TYPE1(bio_add_folio);
EXT_FUN_TYPE1(kmem_cache_alloc_lru_noprof);
EXT_FUN_TYPE1(get_tree_bdev_flags);
EXT_FUN_TYPE1(filp_open);
EXT_FUN_TYPE1(get_tree_nodev);
EXT_FUN_TYPE1(super_setup_bdi);
EXT_FUN_TYPE1(bdi_dev_name);
EXT_FUN_TYPE1(read_cache_folio);
EXT_FUN_TYPE1(folio_end_read);
EXT_FUN_TYPE1(iomap_read_folio);
EXT_FUN_TYPE1(iomap_invalidate_folio);
EXT_FUN_TYPE1(iomap_release_folio);
EXT_FUN_TYPE1(thp_get_unmapped_area);
EXT_FUN_TYPE1(__seq_puts);
EXT_FUN_TYPE1(_copy_to_iter);
EXT_FUN_TYPE1(folio_unlock);
EXT_FUN_TYPE1(copy_highpage);
EXT_FUN_TYPE1(iov_iter_bvec);
EXT_FUN_TYPE1(kmemdup_nul);
EXT_FUN_TYPE1(memchr_inv);
EXT_FUN_TYPE1(bdev_file_open_by_path);
EXT_OBJ_TYPE(struct qstr, dotdot_name);
EXT_OBJ_TYPE(struct xattr_handler , nop_posix_acl_access);
EXT_OBJ_TYPE(struct xattr_handler , nop_posix_acl_default);
#define f___alloc_pages_bulk(...) alloc_hooks(f_alloc_pages_bulk_noprof(__VA_ARGS__))
#define f_alloc_pages_bulk_array(_gfp, _nr_pages, _page_array) \
f___alloc_pages_bulk(_gfp, numa_mem_id(), NULL, _nr_pages, NULL, _page_array)
#define f_kmem_cache_alloc_lru(...) alloc_hooks(f_kmem_cache_alloc_lru_noprof(__VA_ARGS__))
#define f_alloc_inode_sb(_sb, _cache, _gfp) f_kmem_cache_alloc_lru(_cache, &_sb->s_inode_lru, _gfp)
static inline void f_bio_advance(struct bio *bio, unsigned int nbytes)
{
if (nbytes == bio->bi_iter.bi_size) {
bio->bi_iter.bi_size = 0;
return;
}
f___bio_advance(bio, nbytes);
}
static inline void f_zero_fill_bio(struct bio *bio)
{
f_zero_fill_bio_iter(bio, bio->bi_iter);
}
static inline struct folio *f_read_mapping_folio(struct address_space *mapping,
pgoff_t index, struct file *file)
{
return f_read_cache_folio(mapping, index, NULL, file);
}
static inline pgoff_t f_folio_index(struct folio *folio)
{
if (unlikely(folio_test_swapcache(folio)))
return f___folio_swap_cache_index(folio);
return folio->index;
}
static inline bool f_folio_contains(struct folio *folio, pgoff_t index)
{
return index - f_folio_index(folio) < folio_nr_pages(folio);
}
static __always_inline void f_seq_puts(struct seq_file *m, const char *s)
{
if (!__builtin_constant_p(*s))
f___seq_puts(m, s);
else if (s[0] && !s[1])
seq_putc(m, s[0]);
else
seq_write(m, s, __builtin_strlen(s));
}
static __always_inline __must_check
size_t F_copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i)
{
if (check_copy_size(addr, bytes, true))
return f__copy_to_iter(addr, bytes, i);
return 0;
}
static inline void f_memcpy_to_folio(struct folio *folio, size_t offset,
const char *from, size_t len)
{
VM_BUG_ON(offset + len > folio_size(folio));
do {
char *to = kmap_local_folio(folio, offset);
size_t chunk = len;
if (folio_test_highmem(folio) &&
chunk > PAGE_SIZE - offset_in_page(offset))
chunk = PAGE_SIZE - offset_in_page(offset);
memcpy(to, from, chunk);
kunmap_local(to);
from += chunk;
offset += chunk;
len -= chunk;
} while (len > 0);
f_flush_dcache_folio(folio);
}
int symbol_fix(void);
int symbol_fixed(void);
#endif