AArch64 EL2 hypervisor for QEMU virt that boots at EL2
1

Configure Feed

Select the types of activity you want to include in your feed.

Add canonical IPA interval validation for monitor memory access

+20 -2
+1 -1
core/monitor.c
··· 106 106 } 107 107 if (!stage2_translate(ipa, &tr) || 108 108 hv_add_overflow_u64(tr.ipa_base, tr.size, &tr_end) || 109 - end > tr_end) { 109 + !hv_range_contains(tr.ipa_base, tr.size, ipa, len)) { 110 110 return false; 111 111 } 112 112 off = ipa - tr.ipa_base;
+1 -1
core/policy.c
··· 66 66 action == POLICY_PANIC; 67 67 } 68 68 69 - static bool policy_class_valid(enum policy_class access_class) 69 + static bool policy_class_valid(enum policy_access_class access_class) 70 70 { 71 71 return access_class == POLICY_CLASS_ID || 72 72 access_class == POLICY_CLASS_MMU ||
+15
include/hv/types.h
··· 42 42 return a_base < b_end && b_base < a_end; 43 43 } 44 44 45 + static inline bool hv_range_contains(uint64_t base, uint64_t size, uint64_t addr, uint64_t len) 46 + { 47 + uint64_t end; 48 + uint64_t range_end; 49 + 50 + if (len == 0u || size == 0u) { 51 + return false; 52 + } 53 + if (hv_add_overflow_u64(addr, len, &end) || 54 + hv_add_overflow_u64(base, size, &range_end)) { 55 + return false; 56 + } 57 + return addr >= base && end <= range_end; 58 + } 59 + 45 60 #endif
+3
tests/host/test_hv_types.c
··· 13 13 assert(hv_range_overlaps(10u, 5u, 14u, 3u)); 14 14 assert(!hv_range_overlaps(10u, 4u, 14u, 3u)); 15 15 assert(hv_range_overlaps(UINT64_MAX - 1u, 4u, 0u, 1u)); 16 + assert(hv_range_contains(10u, 8u, 12u, 4u)); 17 + assert(!hv_range_contains(10u, 8u, 12u, 8u)); 18 + assert(!hv_range_contains(UINT64_MAX - 1u, 4u, UINT64_MAX - 1u, 2u)); 16 19 assert(hv_is_aligned_u64(0x4000u, 0x1000u)); 17 20 assert(!hv_is_aligned_u64(0x4001u, 0x1000u)); 18 21 assert(!hv_is_aligned_u64(0x4000u, 0u));