cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

debugobjects.h (4085B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _LINUX_DEBUGOBJECTS_H
      3#define _LINUX_DEBUGOBJECTS_H
      4
      5#include <linux/list.h>
      6#include <linux/spinlock.h>
      7
      8enum debug_obj_state {
      9	ODEBUG_STATE_NONE,
     10	ODEBUG_STATE_INIT,
     11	ODEBUG_STATE_INACTIVE,
     12	ODEBUG_STATE_ACTIVE,
     13	ODEBUG_STATE_DESTROYED,
     14	ODEBUG_STATE_NOTAVAILABLE,
     15	ODEBUG_STATE_MAX,
     16};
     17
     18struct debug_obj_descr;
     19
     20/**
     21 * struct debug_obj - representation of an tracked object
     22 * @node:	hlist node to link the object into the tracker list
     23 * @state:	tracked object state
     24 * @astate:	current active state
     25 * @object:	pointer to the real object
     26 * @descr:	pointer to an object type specific debug description structure
     27 */
     28struct debug_obj {
     29	struct hlist_node	node;
     30	enum debug_obj_state	state;
     31	unsigned int		astate;
     32	void			*object;
     33	const struct debug_obj_descr *descr;
     34};
     35
     36/**
     37 * struct debug_obj_descr - object type specific debug description structure
     38 *
     39 * @name:		name of the object typee
     40 * @debug_hint:		function returning address, which have associated
     41 *			kernel symbol, to allow identify the object
     42 * @is_static_object:	return true if the obj is static, otherwise return false
     43 * @fixup_init:		fixup function, which is called when the init check
     44 *			fails. All fixup functions must return true if fixup
     45 *			was successful, otherwise return false
     46 * @fixup_activate:	fixup function, which is called when the activate check
     47 *			fails
     48 * @fixup_destroy:	fixup function, which is called when the destroy check
     49 *			fails
     50 * @fixup_free:		fixup function, which is called when the free check
     51 *			fails
     52 * @fixup_assert_init:  fixup function, which is called when the assert_init
     53 *			check fails
     54 */
     55struct debug_obj_descr {
     56	const char		*name;
     57	void *(*debug_hint)(void *addr);
     58	bool (*is_static_object)(void *addr);
     59	bool (*fixup_init)(void *addr, enum debug_obj_state state);
     60	bool (*fixup_activate)(void *addr, enum debug_obj_state state);
     61	bool (*fixup_destroy)(void *addr, enum debug_obj_state state);
     62	bool (*fixup_free)(void *addr, enum debug_obj_state state);
     63	bool (*fixup_assert_init)(void *addr, enum debug_obj_state state);
     64};
     65
     66#ifdef CONFIG_DEBUG_OBJECTS
     67extern void debug_object_init      (void *addr, const struct debug_obj_descr *descr);
     68extern void
     69debug_object_init_on_stack(void *addr, const struct debug_obj_descr *descr);
     70extern int debug_object_activate  (void *addr, const struct debug_obj_descr *descr);
     71extern void debug_object_deactivate(void *addr, const struct debug_obj_descr *descr);
     72extern void debug_object_destroy   (void *addr, const struct debug_obj_descr *descr);
     73extern void debug_object_free      (void *addr, const struct debug_obj_descr *descr);
     74extern void debug_object_assert_init(void *addr, const struct debug_obj_descr *descr);
     75
     76/*
     77 * Active state:
     78 * - Set at 0 upon initialization.
     79 * - Must return to 0 before deactivation.
     80 */
     81extern void
     82debug_object_active_state(void *addr, const struct debug_obj_descr *descr,
     83			  unsigned int expect, unsigned int next);
     84
     85extern void debug_objects_early_init(void);
     86extern void debug_objects_mem_init(void);
     87#else
     88static inline void
     89debug_object_init      (void *addr, const struct debug_obj_descr *descr) { }
     90static inline void
     91debug_object_init_on_stack(void *addr, const struct debug_obj_descr *descr) { }
     92static inline int
     93debug_object_activate  (void *addr, const struct debug_obj_descr *descr) { return 0; }
     94static inline void
     95debug_object_deactivate(void *addr, const struct debug_obj_descr *descr) { }
     96static inline void
     97debug_object_destroy   (void *addr, const struct debug_obj_descr *descr) { }
     98static inline void
     99debug_object_free      (void *addr, const struct debug_obj_descr *descr) { }
    100static inline void
    101debug_object_assert_init(void *addr, const struct debug_obj_descr *descr) { }
    102
    103static inline void debug_objects_early_init(void) { }
    104static inline void debug_objects_mem_init(void) { }
    105#endif
    106
    107#ifdef CONFIG_DEBUG_OBJECTS_FREE
    108extern void debug_check_no_obj_freed(const void *address, unsigned long size);
    109#else
    110static inline void
    111debug_check_no_obj_freed(const void *address, unsigned long size) { }
    112#endif
    113
    114#endif