|
21 | 21 | //#include <atomic> |
22 | 22 | static int diag_failures = 0; |
23 | 23 | static int diag_successes = 0; |
| 24 | +static bool fieldmedic_registered = false; |
24 | 25 |
|
25 | 26 | #define DIAGNOSE(TEST, TEXT, ...) \ |
26 | 27 | try { \ |
@@ -63,6 +64,7 @@ namespace medic{ |
63 | 64 | __attribute__ ((constructor)) |
64 | 65 | void register_medic() { |
65 | 66 | os::register_plugin(medic::init, "Field medic"); |
| 67 | + fieldmedic_registered = true; |
66 | 68 | } |
67 | 69 |
|
68 | 70 |
|
@@ -93,3 +95,21 @@ extern "C" char get_single_tbss(){ |
93 | 95 | extern "C" int get_single_tdata(){ |
94 | 96 | return medic::diag::__tl_data[0]; |
95 | 97 | } |
| 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