/* SPDX-License-Identifier: GPL-2.0-or-later */ #ifndef _OBJTOOL_CHECKSUM_H #define _OBJTOOL_CHECKSUM_H #include #ifdef BUILD_KLP static inline void checksum_init(struct symbol *sym) { if (sym && !sym->csum.state) { sym->csum.state = XXH3_createState(); XXH3_64bits_reset(sym->csum.state); } } static inline void __checksum_update(struct symbol *sym, const void *data, size_t size) { XXH3_64bits_update(sym->csum.state, data, size); } static inline void __checksum_update_insn(struct symbol *sym, struct instruction *insn, const void *data, size_t size) { __checksum_update(sym, data, size); dbg_checksum_insn(sym, insn, XXH3_64bits_digest(sym->csum.state)); } static inline void __checksum_update_object(struct symbol *sym, unsigned long offset, const char *what, const void *data, size_t size) { __checksum_update(sym, &offset, sizeof(offset)); __checksum_update(sym, data, size); dbg_checksum_object(sym, offset, what, XXH3_64bits_digest(sym->csum.state)); } static inline void checksum_finish(struct symbol *sym) { if (sym && sym->csum.state) { sym->csum.checksum = XXH3_64bits_digest(sym->csum.state); XXH3_freeState(sym->csum.state); sym->csum.state = NULL; } } int calculate_checksums(struct objtool_file *file); int create_sym_checksum_section(struct objtool_file *file); #else /* !BUILD_KLP */ static inline int calculate_checksums(struct objtool_file *file) { return -ENOSYS; } static inline int create_sym_checksum_section(struct objtool_file *file) { return -EINVAL; } #endif /* !BUILD_KLP */ #endif /* _OBJTOOL_CHECKSUM_H */