2#include "pedigree/kernel/Log.h"
3#include "pedigree/kernel/linker/KernelElf.h"
5#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
7Module::UnloadAdmission decision = Module::UnloadAdmission::Busy;
10bool sawTerminal =
false;
11Module::UnloadAdmission admit(
bool terminal) {
13 sawTerminal = terminal;
19bool attempt(
Module& module,
bool terminal) {
20 if (KernelElf::claimModuleUnloadForTest(&module) != KernelElf::TestUnloadClaimed)
22 return KernelElf::completeGuardedModuleUnloadForTest(&module, terminal);
25bool runHostedModuleAdmissionRegressions() {
27 module.name.assign("unload-admission-fixture");
28 module.status = Module::Active;
29 module.unloadAdmission = admit;
30 module.exit = exitModule;
31 decision = Module::UnloadAdmission::Busy;
32 admissions = exits = 0;
33 bool passed = !attempt(module,
false) &&
module.isActive() && !module.unloadComplete &&
34 module.unloadable && admissions == 1 && exits == 0 && !sawTerminal;
35 decision = Module::UnloadAdmission::KeepMapped;
36 passed &= !attempt(module,
false) &&
module.isActive() && module.unloadable && exits == 0;
37 decision = Module::UnloadAdmission::Ready;
38 passed &= attempt(module,
false) &&
module.isUnloaded() && exits == 1 && admissions == 3;
41 provider.name.assign(
"retained-storage-provider");
42 provider.status = Module::Active;
44 consumer.name.assign(
"retained-storage-consumer");
45 consumer.status = Module::Active;
46 consumer.unloadAdmission = admit;
47 consumer.exit = exitModule;
48 const char* dependencies[] = {
"retained-storage-provider",
nullptr};
49 consumer.depends = dependencies;
50 decision = Module::UnloadAdmission::KeepMapped;
51 passed &= !attempt(consumer,
true) && consumer.isActive() && !consumer.unloadable &&
52 !consumer.unloadComplete && sawTerminal && exits == 1;
53 Module* modules[] = {&provider, &consumer};
55 passed &= KernelElf::planModuleUnloadOrderForTest(modules, 2, order, 2) == 0 &&
56 provider.isActive() && consumer.isActive();
58 NOTICE(
"HOSTED-STORAGE-PAGING: PASS module-admission-retention");
60 ERROR(
"HOSTED-STORAGE-PAGING: FAIL module-admission-retention");