[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 17/19] xen/arm: Isolate the SError between the context switch of 2 vCPUs
If there is a pending SError while we are doing context switch, if the SError handle option is "FORWARD", We have to guranatee this serror to be caught by current vCPU, otherwise it will be caught by next vCPU and be forwarded to this wrong vCPU. So we have to synchronize SError before switch to next vCPU. But this is only required by "FORWARD" option. In this case we added a new flag SKIP_CTXT_SWITCH_SERROR_SYNC in cpu_hwcaps to skip synchronizing SError in context switch for other options. In the meantime, we don't need to export serror_op accessing to other source files. Because we have umasked the Abort/SError bit in previous patch, we have to disable Abort/SError before doing context switch as we have done for IRQ. Signed-off-by: Wei Chen <Wei.Chen@xxxxxxx> --- v2->v3: 1. Use the macro instead of the function to synchronize SErrors. 2. Disable Abort/SError before doing context switch. --- xen/arch/arm/domain.c | 12 ++++++++++++ xen/arch/arm/traps.c | 3 +++ xen/include/asm-arm/cpufeature.h | 3 ++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 69c2854..e1a620a 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -29,6 +29,7 @@ #include <asm/cpufeature.h> #include <asm/vfp.h> #include <asm/procinfo.h> +#include <asm/alternative.h> #include <asm/gic.h> #include <asm/vgic.h> @@ -312,6 +313,17 @@ void context_switch(struct vcpu *prev, struct vcpu *next) local_irq_disable(); + /* + * If the SErrors option is "FORWARD", we have to prevent forwarding + * serror to wrong vCPU. So before context switch, we have to use the + * synchronize_serror to guarantee that the pending serror would be + * caught by current vCPU. + * + * The SKIP_CTXT_SWITCH_SERROR_SYNC will be set to cpu_hwcaps when the + * SErrors option is NOT "FORWARD". + */ + SYNCHRONIZE_SERROR(SKIP_CTXT_SWITCH_SERROR_SYNC); + set_current(next); prev = __context_switch(prev, next); diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 1c5cfb8..2c610c4 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -146,6 +146,9 @@ static int __init update_serrors_cpu_caps(void) if ( serrors_op != SERRORS_DIVERSE ) cpus_set_cap(SKIP_CHECK_PENDING_VSERROR); + if ( serrors_op != SERRORS_FORWARD ) + cpus_set_cap(SKIP_CTXT_SWITCH_SERROR_SYNC); + return 0; } __initcall(update_serrors_cpu_caps); diff --git a/xen/include/asm-arm/cpufeature.h b/xen/include/asm-arm/cpufeature.h index ec3f9e5..99ecb2b 100644 --- a/xen/include/asm-arm/cpufeature.h +++ b/xen/include/asm-arm/cpufeature.h @@ -41,8 +41,9 @@ #define ARM64_WORKAROUND_834220 3 #define LIVEPATCH_FEATURE 4 #define SKIP_CHECK_PENDING_VSERROR 5 +#define SKIP_CTXT_SWITCH_SERROR_SYNC 6 -#define ARM_NCAPS 6 +#define ARM_NCAPS 7 #ifndef __ASSEMBLY__ -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |