/** * struct klp_func - function structure for live patching * @old_name: name of the function to be patched * @new_func: pointer to the patched function code * @old_sympos: a hint indicating which symbol position the old function * can be found (optional) * @old_func: pointer to the function being patched * @kobj: kobject for sysfs resources * @node: list node for klp_object func_list * @stack_node: list node for klp_ops func_stack list * @old_size: size of the old function * @new_size: size of the new function * @nop: temporary patch to use the original code again; dyn. allocated * @patched: the func has been added to the klp_ops list * @transition: the func is currently being applied or reverted * * The patched and transition variables define the func's patching state. When * patching, a func is always in one of the following states: * * patched=0 transition=0: unpatched * patched=0 transition=1: unpatched, temporary starting state * patched=1 transition=1: patched, may be visible to some tasks * patched=1 transition=0: patched, visible to all tasks * * And when unpatching, it goes in the reverse order: * * patched=1 transition=0: patched, visible to all tasks * patched=1 transition=1: patched, may be visible to some tasks * patched=0 transition=1: unpatched, temporary ending state * patched=0 transition=0: unpatched
*/ struct klp_func { /* external */ constchar *old_name; void *new_func; /* * The old_sympos field is optional and can be used to resolve * duplicate symbol names in livepatch objects. If this field is zero, * it is expected the symbol is unique, otherwise patching fails. If * this value is greater than zero then that occurrence of the symbol * in kallsyms for the given object is used.
*/ unsignedlong old_sympos;
/** * struct klp_callbacks - pre/post live-(un)patch callback structure * @pre_patch: executed before code patching * @post_patch: executed after code patching * @pre_unpatch: executed before code unpatching * @post_unpatch: executed after code unpatching * @post_unpatch_enabled: flag indicating if post-unpatch callback * should run * * All callbacks are optional. Only the pre-patch callback, if provided, * will be unconditionally executed. If the parent klp_object fails to * patch for any reason, including a non-zero error status returned from * the pre-patch callback, no further callbacks will be executed.
*/ struct klp_callbacks { int (*pre_patch)(struct klp_object *obj); void (*post_patch)(struct klp_object *obj); void (*pre_unpatch)(struct klp_object *obj); void (*post_unpatch)(struct klp_object *obj); bool post_unpatch_enabled;
};
/** * struct klp_object - kernel object structure for live patching * @name: module name (or NULL for vmlinux) * @funcs: function entries for functions to be patched in the object * @callbacks: functions to be executed pre/post (un)patching * @kobj: kobject for sysfs resources * @func_list: dynamic list of the function entries * @node: list node for klp_patch obj_list * @mod: kernel module associated with the patched object * (NULL for vmlinux) * @dynamic: temporary object for nop functions; dynamically allocated * @patched: the object's funcs have been added to the klp_ops list
*/ struct klp_object { /* external */ constchar *name; struct klp_func *funcs; struct klp_callbacks callbacks;
/** * struct klp_state - state of the system modified by the livepatch * @id: system state identifier (non-zero) * @version: version of the change * @data: custom data
*/ struct klp_state { unsignedlong id; unsignedint version; void *data;
};
/** * struct klp_patch - patch structure for live patching * @mod: reference to the live patch module * @objs: object entries for kernel objects to be patched * @states: system states that can get modified * @replace: replace all actively used patches * @list: list node for global list of actively used patches * @kobj: kobject for sysfs resources * @obj_list: dynamic list of the object entries * @enabled: the patch is enabled (but operation may be incomplete) * @forced: was involved in a forced transition * @free_work: patch cleanup from workqueue-context * @finish: for waiting till it is safe to remove the patch module
*/ struct klp_patch { /* external */ struct module *mod; struct klp_object *objs; struct klp_state *states; bool replace;
/* Called from the module loader during module coming/going states */ int klp_module_coming(struct module *mod); void klp_module_going(struct module *mod);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.