Unlike bx, eret will not update the instruction set (THUMB,ARM) according to
the return address. This will result to an unpredicable behaviour for the
processor if the address doesn't match the right instruction set.
When the kernel is compiled with THUMB2, THUMB bit needs to be set in CPSR
for the secondary cpus.
Signed-off-by: Julien Grall <julien.grall@linaro.org>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
struct domain *d = current->domain;
struct vcpu_guest_context *ctxt;
int rc;
+ int is_thumb = entry_point & 1;
if ( (vcpuid < 0) || (vcpuid >= MAX_VIRT_CPUS) )
return PSCI_EINVAL;
if ( vcpuid >= d->max_vcpus || (v = d->vcpu[vcpuid]) == NULL )
return PSCI_EINVAL;
+ /* THUMB set is not allowed with 64-bit domain */
+ if ( is_pv64_domain(d) && is_thumb )
+ return PSCI_EINVAL;
+
if ( (ctxt = alloc_vcpu_guest_context()) == NULL )
return PSCI_DENIED;
ctxt->ttbr1 = 0;
ctxt->ttbcr = 0; /* Defined Reset Value */
ctxt->user_regs.cpsr = PSR_GUEST_INIT;
+ /* Start the VCPU with THUMB set if it's requested by the kernel */
+ if ( is_thumb )
+ ctxt->user_regs.cpsr |= PSR_THUMB;
ctxt->flags = VGCF_online;
domain_lock(d);