Skip to content

Commit cf56d4a

Browse files
committed
Add post service diagnostic hook
- osinit test: Validate all early phase invariants still hold after service
1 parent 7515855 commit cf56d4a

3 files changed

Lines changed: 25 additions & 0 deletions

File tree

api/kernel/diag.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace kernel::diag {
88
void post_bss() noexcept;
99
void post_machine_init() noexcept;
1010
void post_init_libc() noexcept;
11+
void post_service() noexcept;
1112

1213
void default_post_init_libc() noexcept;
1314

src/kernel/kernel.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <os.hpp>
1919
#include <kernel.hpp>
2020
#include <kernel/cpuid.hpp>
21+
#include <kernel/diag.hpp>
2122
#include <kernel/rng.hpp>
2223
#include <service>
2324
#include <cstdio>
@@ -168,6 +169,7 @@ void kernel::post_start()
168169

169170
// service program start
170171
Service::start();
172+
kernel::diag::hook<kernel::diag::post_service>();
171173
}
172174

173175
void os::add_stdout(os::print_func func)
@@ -227,3 +229,5 @@ void os::print_timestamps(const bool enabled)
227229
{
228230
kernel::state().timestamps = enabled;
229231
}
232+
233+
void __attribute__((weak)) kernel::diag::post_service() noexcept {}

src/plugins/field_medic/fieldmedic.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
//#include <atomic>
2222
static int diag_failures = 0;
2323
static int diag_successes = 0;
24+
static bool fieldmedic_registered = false;
2425

2526
#define DIAGNOSE(TEST, TEXT, ...) \
2627
try { \
@@ -63,6 +64,7 @@ namespace medic{
6364
__attribute__ ((constructor))
6465
void register_medic() {
6566
os::register_plugin(medic::init, "Field medic");
67+
fieldmedic_registered = true;
6668
}
6769

6870

@@ -93,3 +95,21 @@ extern "C" char get_single_tbss(){
9395
extern "C" int get_single_tdata(){
9496
return medic::diag::__tl_data[0];
9597
}
98+
99+
100+
using namespace medic::diag;
101+
102+
void kernel::diag::post_service() noexcept {
103+
MYINFO("Service finished. Diagnosing.");
104+
DIAGNOSE(fieldmedic_registered && diag_successes > 0 && diag_failures == 0,
105+
"Field medic plugin active");
106+
DIAGNOSE(invariant_post_bss(), "Post .bss invariant still holds");
107+
DIAGNOSE(invariant_post_machine_init(), "Post machine init invariant still holds");
108+
DIAGNOSE(invariant_post_init_libc(), "Post init libc invariant still holds");
109+
110+
if (diag_failures == 0){
111+
MYINFO("Diagnose complete. Healthy ✅");
112+
} else {
113+
MYINFO("Diagnose complete: %i / %i checks failed", diag_failures, (diag_failures + diag_successes));
114+
}
115+
}

0 commit comments

Comments
 (0)