Commit 2586a4d7 authored by Fabiano Rosas's avatar Fabiano Rosas Committed by David Gibson
Browse files

target/ppc: Move exception vector offset computation into a function



Signed-off-by: default avatarFabiano Rosas <farosas@linux.ibm.com>
Reviewed-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
Message-Id: <20190228225759.21328-2-farosas@linux.ibm.com>
Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
parent 2782ad4c
Loading
Loading
Loading
Loading
+19 −11
Original line number Diff line number Diff line
@@ -107,6 +107,24 @@ static int powerpc_reset_wakeup(CPUState *cs, CPUPPCState *env, int excp,
    return POWERPC_EXCP_RESET;
}

static uint64_t ppc_excp_vector_offset(CPUState *cs, int ail)
{
    uint64_t offset = 0;

    switch (ail) {
    case AIL_0001_8000:
        offset = 0x18000;
        break;
    case AIL_C000_0000_0000_4000:
        offset = 0xc000000000004000ull;
        break;
    default:
        cpu_abort(cs, "Invalid AIL combination %d\n", ail);
        break;
    }

    return offset;
}

/* Note that this function should be greatly optimized
 * when called with a constant excp, from ppc_hw_interrupt
@@ -708,17 +726,7 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int excp_model, int excp)
    /* Handle AIL */
    if (ail) {
        new_msr |= (1 << MSR_IR) | (1 << MSR_DR);
        switch(ail) {
        case AIL_0001_8000:
            vector |= 0x18000;
            break;
        case AIL_C000_0000_0000_4000:
            vector |= 0xc000000000004000ull;
            break;
        default:
            cpu_abort(cs, "Invalid AIL combination %d\n", ail);
            break;
        }
        vector |= ppc_excp_vector_offset(cs, ail);
    }

#if defined(TARGET_PPC64)