#include <asm/irq.h>
#include <asm/cpufeature.h>
#include <asm/vfp.h>
+#include <asm/processor-ca15.h>
#include <asm/gic.h>
#include "vtimer.h"
p->arch.csselr = READ_SYSREG(CSSELR_EL1);
/* Control Registers */
- p->arch.actlr = READ_SYSREG(ACTLR_EL1);
p->arch.sctlr = READ_SYSREG(SCTLR_EL1);
p->arch.cpacr = READ_SYSREG(CPACR_EL1);
isb();
/* Control Registers */
- WRITE_SYSREG(n->arch.actlr, ACTLR_EL1);
WRITE_SYSREG(n->arch.sctlr, SCTLR_EL1);
WRITE_SYSREG(n->arch.cpacr, CPACR_EL1);
return rc;
v->arch.sctlr = SCTLR_BASE;
+ v->arch.actlr = READ_SYSREG32(ACTLR_EL1);
+ /* XXX: Handle other than CA15 cpus */
+ if ( v->domain->max_vcpus > 1 )
+ v->arch.actlr |= ACTLR_CA15_SMP;
+ else
+ v->arch.actlr &= ~ACTLR_CA15_SMP;
if ( (rc = vcpu_vgic_init(v)) != 0 )
return rc;
WRITE_SYSREG((vaddr_t)hyp_traps_vector, VBAR_EL2);
/* Setup hypervisor traps */
- WRITE_SYSREG(HCR_PTW|HCR_BSU_OUTER|HCR_AMO|HCR_IMO|HCR_VM|HCR_TWI|HCR_TSC, HCR_EL2);
+ WRITE_SYSREG(HCR_PTW|HCR_BSU_OUTER|HCR_AMO|HCR_IMO|HCR_VM|HCR_TWI|HCR_TSC|
+ HCR_TAC, HCR_EL2);
isb();
}
{
struct hsr_cp32 cp32 = hsr.cp32;
uint32_t *r = (uint32_t*)select_user_reg(regs, cp32.reg);
+ struct vcpu *v = current;
if ( !cp32.ccvalid ) {
dprintk(XENLOG_ERR, "cp_15(32): need to handle invalid condition codes\n");
domain_crash_synchronous();
}
break;
+ case HSR_CPREG32(ACTLR):
+ if ( cp32.read )
+ *r = v->arch.actlr;
+ break;
default:
printk("%s p15, %d, r%d, cr%d, cr%d, %d @ 0x%"PRIregister"\n",
cp32.read ? "mrc" : "mcr",