dl: Add support for persistent modules
This type of modules cannot be unloaded. This is useful if a given functionality, e.g. UEFI secure boot shim signature verification, should not be disabled if it was enabled at some point in time. Somebody may say that we can use standalone GRUB2 here. That is true. However, the code is not so big nor complicated hence it make sense to support modularized configs too. Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com> Reviewed-by: Ross Philipson <ross.philipson@oracle.com>
This commit is contained in:
parent
3d612924c3
commit
ee7808e219
2 changed files with 16 additions and 0 deletions
|
@ -137,6 +137,9 @@ grub_mini_cmd_rmmod (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
if (! mod)
|
if (! mod)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such module");
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such module");
|
||||||
|
|
||||||
|
if (grub_dl_is_persistent (mod))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "cannot unload persistent module");
|
||||||
|
|
||||||
if (grub_dl_unref (mod) <= 0)
|
if (grub_dl_unref (mod) <= 0)
|
||||||
grub_dl_unload (mod);
|
grub_dl_unload (mod);
|
||||||
|
|
||||||
|
|
|
@ -175,6 +175,7 @@ struct grub_dl
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
int ref_count;
|
int ref_count;
|
||||||
|
int persistent;
|
||||||
grub_dl_dep_t dep;
|
grub_dl_dep_t dep;
|
||||||
grub_dl_segment_t segment;
|
grub_dl_segment_t segment;
|
||||||
Elf_Sym *symtab;
|
Elf_Sym *symtab;
|
||||||
|
@ -240,6 +241,18 @@ grub_dl_get (const char *name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_dl_set_persistent (grub_dl_t mod)
|
||||||
|
{
|
||||||
|
mod->persistent = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_dl_is_persistent (grub_dl_t mod)
|
||||||
|
{
|
||||||
|
return mod->persistent;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
grub_err_t grub_dl_register_symbol (const char *name, void *addr,
|
grub_err_t grub_dl_register_symbol (const char *name, void *addr,
|
||||||
|
|
Loading…
Reference in a new issue