events.c 990 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2023 Google LLC
  4. */
  5. #include <nvhe/trace.h>
  6. #include <nvhe/mm.h>
  7. extern struct hyp_event_id __hyp_event_ids_start[];
  8. extern struct hyp_event_id __hyp_event_ids_end[];
  9. #undef HYP_EVENT
  10. #define HYP_EVENT(__name, __proto, __struct, __assign, __printk) \
  11. atomic_t __ro_after_init __name##_enabled = ATOMIC_INIT(0); \
  12. struct hyp_event_id hyp_event_id_##__name __section(".hyp.event_ids") = { \
  13. .data = (void *)&__name##_enabled, \
  14. }
  15. #include <asm/kvm_hypevents.h>
  16. int __pkvm_enable_event(unsigned short id, bool enable)
  17. {
  18. struct hyp_event_id *event_id = __hyp_event_ids_start;
  19. atomic_t *enable_key;
  20. for (; (unsigned long)event_id < (unsigned long)__hyp_event_ids_end;
  21. event_id++) {
  22. if (event_id->id != id)
  23. continue;
  24. enable_key = (atomic_t *)event_id->data;
  25. enable_key = hyp_fixmap_map(__hyp_pa(enable_key));
  26. atomic_set(enable_key, enable);
  27. hyp_fixmap_unmap();
  28. return 0;
  29. }
  30. return -EINVAL;
  31. }