/* Clear pmscr in case of early return */
*pmscr_el1 = 0;
/* * At this point, we know that this CPU implements * SPE and is available to the host. * Check if the host is actually using it ?
*/
reg = read_sysreg_s(SYS_PMBLIMITR_EL1); if (!(reg & BIT(PMBLIMITR_EL1_E_SHIFT))) return;
/* Yes; save the control register and disable data generation */
*pmscr_el1 = read_sysreg_el1(SYS_PMSCR);
write_sysreg_el1(0, SYS_PMSCR);
isb();
/* Now drain all buffered data to memory */
psb_csync();
}
staticvoid __debug_restore_spe(u64 pmscr_el1)
{ if (!pmscr_el1) return;
/* The host page table is installed, but not yet synchronised */
isb();
/* Re-enable data generation */
write_sysreg_el1(pmscr_el1, SYS_PMSCR);
}
staticvoid __trace_switch_to_guest(void)
{ /* Unsupported with TRBE so disable */ if (host_data_test_flag(TRBE_ENABLED))
*host_data_ptr(trfcr_while_in_guest) = 0;
/* Check if the BRBE is enabled */ if (!(read_sysreg_el1(SYS_BRBCR) & (BRBCR_ELx_E0BRE | BRBCR_ELx_ExBRE))) return;
/* * Prohibit branch record generation while we are in guest. * Since access to BRBCR_EL1 is trapped, the guest can't * modify the filtering set by the host.
*/
*brbcr_el1 = read_sysreg_el1(SYS_BRBCR);
write_sysreg_el1(0, SYS_BRBCR);
}
staticvoid __debug_restore_brbe(u64 brbcr_el1)
{ if (!brbcr_el1) return;
void __debug_restore_host_buffers_nvhe(struct kvm_vcpu *vcpu)
{ if (host_data_test_flag(HAS_SPE))
__debug_restore_spe(*host_data_ptr(host_debug_state.pmscr_el1)); if (host_data_test_flag(HAS_BRBE))
__debug_restore_brbe(*host_data_ptr(host_debug_state.brbcr_el1)); if (__trace_needs_switch())
__trace_switch_to_host();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.