Hello Jeremy,
Regarding the interrupts, all the interrupts are routed to the either Cortex-A and Cortex-M, so each core must mask the interrupt to allow the IP to generate the interrupt or not, for example:
The interrupt controller for Cortex-A is the Global Interrupt Controller and if application must cause interrupt only on M side, then it should be masked at GIC to disable it to reach the A Core.
On the other hand, in case the interrupt is intended to Cortex-A, then the Cortex-M must mask the interrupt on the M interrupt controller, which is the Nested Vector Interrupt Controller (NVIC).
By masking the interrupts on GIC and NVIC, the application routes the interrupts to one core or other. If one interrupt goes to both cores, then the RDC must be used to correct control which core is allowed to use the resource that generated the interrupt.
The deeper information about GIC and NVIC are on CPU Technical Reference Manual provided by ARM, so in case you need detailed information about GIC or NVIC, please download the documentation directly from arm.com.
Regards