#ifndef HV_POLICY_H #define HV_POLICY_H #include "hv/log.h" #include "hv/sysreg.h" #include "hv/vcpu.h" enum policy_access_class { POLICY_CLASS_ID = 1, POLICY_CLASS_MMU, POLICY_CLASS_TIMER, POLICY_CLASS_THREAD, POLICY_CLASS_DEBUG, POLICY_CLASS_PMU, POLICY_CLASS_EL2_EL3, POLICY_CLASS_MISC, }; enum policy_action { POLICY_ALLOW_NATIVE = 0, POLICY_EMULATE_READ, POLICY_EMULATE_WRITE, POLICY_WRITE_MASK, POLICY_DENY_SKIP, POLICY_DENY_UNDEF, POLICY_PAUSE, POLICY_PANIC, }; struct policy_entry { uint64_t key; const char *name; enum policy_access_class access_class; enum policy_action read_policy; enum policy_action write_policy; uint64_t reset_value; uint64_t writable_mask; uint32_t logging_level; uint32_t violation_reason; }; struct policy_decision { const struct policy_entry *entry; enum policy_action action; uint64_t value; uint32_t reason; }; enum policy_profile { POLICY_PROFILE_STRICT = 0, POLICY_PROFILE_DIAGNOSTIC, POLICY_PROFILE_LINUX_BOOT, POLICY_PROFILE_DEBUG, }; void policy_init(void); bool policy_set_profile(enum policy_profile profile); bool policy_set_profile_name(const char *name); enum policy_profile policy_get_profile(void); const char *policy_profile_name(enum policy_profile profile); const struct policy_entry *sysreg_policy_lookup(uint64_t key); bool policy_apply_sysreg(struct vcpu *vcpu, const struct sysreg_access *access, uint64_t operand, struct policy_decision *decision); void policy_dump(void); bool policy_selftest(void); #endif