mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
[IA64] First step to support big-endian PV domUs
Signed-off-by: Dietmar Hahn <dietmar.hahn@fujitsu-siemens.com>
This commit is contained in:
1 parent
fafc90de8a
commit
9637322fed
3 files changed
+12
-16
No files matched your search
@@ -91,6 +91,8 @@ void reflect_interruption(unsigned long isr, struct pt_regs *regs,
|
||||
|
||||
regs->cr_iip = ((unsigned long)PSCBX(v, iva) + vector) & ~0xffUL;
|
||||
regs->cr_ipsr = (regs->cr_ipsr & ~DELIVER_PSR_CLR) | DELIVER_PSR_SET;
|
||||
if (PSCB(v, dcr) & IA64_DCR_BE)
|
||||
regs->cr_ipsr |= IA64_PSR_BE;
|
||||
|
||||
if (PSCB(v, hpsr_dfh))
|
||||
regs->cr_ipsr |= IA64_PSR_DFH;
|
||||
@@ -154,6 +156,8 @@ void reflect_event(void)
|
||||
|
||||
regs->cr_iip = v->arch.event_callback_ip;
|
||||
regs->cr_ipsr = (regs->cr_ipsr & ~DELIVER_PSR_CLR) | DELIVER_PSR_SET;
|
||||
if (PSCB(v, dcr) & IA64_DCR_BE)
|
||||
regs->cr_ipsr |= IA64_PSR_BE;
|
||||
|
||||
if (PSCB(v, hpsr_dfh))
|
||||
regs->cr_ipsr |= IA64_PSR_DFH;
|
||||
|
||||
@@ -326,7 +326,7 @@ IA64FAULT vcpu_set_psr_sm(VCPU * vcpu, u64 imm24)
|
||||
// just handle psr.sp,pp and psr.i,ic (and user mask) for now
|
||||
mask =
|
||||
IA64_PSR_PP | IA64_PSR_SP | IA64_PSR_I | IA64_PSR_IC | IA64_PSR_UM |
|
||||
IA64_PSR_DT | IA64_PSR_DFL | IA64_PSR_DFH;
|
||||
IA64_PSR_DT | IA64_PSR_DFL | IA64_PSR_DFH | IA64_PSR_BE;
|
||||
if (imm24 & ~mask)
|
||||
return IA64_ILLOP_FAULT;
|
||||
if (imm.dfh) {
|
||||
@@ -370,10 +370,8 @@ IA64FAULT vcpu_set_psr_sm(VCPU * vcpu, u64 imm24)
|
||||
ipsr->up = 1;
|
||||
psr.up = 1;
|
||||
}
|
||||
if (imm.be) {
|
||||
printk("*** DOMAIN TRYING TO TURN ON BIG-ENDIAN!!!\n");
|
||||
return IA64_ILLOP_FAULT;
|
||||
}
|
||||
if (imm.be)
|
||||
ipsr->be = 1;
|
||||
if (imm.dt)
|
||||
vcpu_set_metaphysical_mode(vcpu, FALSE);
|
||||
__asm__ __volatile(";; mov psr.l=%0;; srlz.d"::"r"(psr):"memory");
|
||||
@@ -450,10 +448,8 @@ IA64FAULT vcpu_set_psr_l(VCPU * vcpu, u64 val)
|
||||
vcpu_set_metaphysical_mode(vcpu, FALSE);
|
||||
else
|
||||
vcpu_set_metaphysical_mode(vcpu, TRUE);
|
||||
if (newpsr.be) {
|
||||
printk("*** DOMAIN TRYING TO TURN ON BIG-ENDIAN!!!\n");
|
||||
return IA64_ILLOP_FAULT;
|
||||
}
|
||||
if (newpsr.be)
|
||||
ipsr->be = 1;
|
||||
if (enabling_interrupts &&
|
||||
vcpu_check_pending_interrupts(vcpu) != SPURIOUS_VECTOR)
|
||||
PSCB(vcpu, pending_interruption) = 1;
|
||||
@@ -506,9 +502,6 @@ u64 vcpu_get_ipsr_int_state(VCPU * vcpu, u64 prevpsr)
|
||||
|
||||
//printk("*** vcpu_get_ipsr_int_state (0x%016lx)...\n",prevpsr);
|
||||
psr.i64 = prevpsr;
|
||||
psr.ia64_psr.be = 0;
|
||||
if (dcr & IA64_DCR_BE)
|
||||
psr.ia64_psr.be = 1;
|
||||
psr.ia64_psr.pp = 0;
|
||||
if (dcr & IA64_DCR_PP)
|
||||
psr.ia64_psr.pp = 1;
|
||||
@@ -1376,10 +1369,6 @@ IA64FAULT vcpu_rfi(VCPU * vcpu)
|
||||
psr.ia64_psr.it = 1;
|
||||
psr.ia64_psr.bn = 1;
|
||||
//psr.pk = 1; // checking pkeys shouldn't be a problem but seems broken
|
||||
if (psr.ia64_psr.be) {
|
||||
printk("*** DOMAIN TRYING TO TURN ON BIG-ENDIAN!!!\n");
|
||||
return IA64_ILLOP_FAULT;
|
||||
}
|
||||
|
||||
ifs = PSCB(vcpu, ifs);
|
||||
if (ifs & 0x8000000000000000UL)
|
||||
|
||||
@@ -561,6 +561,9 @@ void arch_get_xen_caps(xen_capabilities_info_t *info)
|
||||
snprintf(s, sizeof(s), "xen-%d.%d-ia64 ", major, minor);
|
||||
safe_strcat(*info, s);
|
||||
|
||||
snprintf(s, sizeof(s), "xen-%d.%d-ia64be ", major, minor);
|
||||
safe_strcat(*info, s);
|
||||
|
||||
if (vmx_enabled)
|
||||
{
|
||||
snprintf(s, sizeof(s), "hvm-%d.%d-ia64 ", major, minor);
|
||||
|
||||