mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 10:34:58 -06:00
hw/ppc: Consolidate ppc440 initial mapping creation functions
Add a utility function and use it to replace very similar create_initial_mapping functions in 440 based machines. Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com> Tested-by: Edgar E. Iglesias <edgar.iglesias@amd.com> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
This commit is contained in:
parent
779a30df98
commit
afff880071
5 changed files with 28 additions and 85 deletions
|
@ -213,38 +213,6 @@ static int sam460ex_load_device_tree(MachineState *machine,
|
|||
return fdt_size;
|
||||
}
|
||||
|
||||
/* Create reset TLB entries for BookE, mapping only the flash memory. */
|
||||
static void mmubooke_create_initial_mapping_uboot(CPUPPCState *env)
|
||||
{
|
||||
ppcemb_tlb_t *tlb = &env->tlb.tlbe[0];
|
||||
|
||||
/* on reset the flash is mapped by a shadow TLB,
|
||||
* but since we don't implement them we need to use
|
||||
* the same values U-Boot will use to avoid a fault.
|
||||
*/
|
||||
tlb->attr = 0;
|
||||
tlb->prot = PAGE_VALID | ((PAGE_READ | PAGE_WRITE | PAGE_EXEC) << 4);
|
||||
tlb->size = 0x10000000; /* up to 0xffffffff */
|
||||
tlb->EPN = 0xf0000000 & TARGET_PAGE_MASK;
|
||||
tlb->RPN = (0xf0000000 & TARGET_PAGE_MASK) | 0x4;
|
||||
tlb->PID = 0;
|
||||
}
|
||||
|
||||
/* Create reset TLB entries for BookE, spanning the 32bit addr space. */
|
||||
static void mmubooke_create_initial_mapping(CPUPPCState *env,
|
||||
target_ulong va,
|
||||
hwaddr pa)
|
||||
{
|
||||
ppcemb_tlb_t *tlb = &env->tlb.tlbe[0];
|
||||
|
||||
tlb->attr = 0;
|
||||
tlb->prot = PAGE_VALID | ((PAGE_READ | PAGE_WRITE | PAGE_EXEC) << 4);
|
||||
tlb->size = 1 << 31; /* up to 0x80000000 */
|
||||
tlb->EPN = va & TARGET_PAGE_MASK;
|
||||
tlb->RPN = pa & TARGET_PAGE_MASK;
|
||||
tlb->PID = 0;
|
||||
}
|
||||
|
||||
static void main_cpu_reset(void *opaque)
|
||||
{
|
||||
PowerPCCPU *cpu = opaque;
|
||||
|
@ -253,20 +221,27 @@ static void main_cpu_reset(void *opaque)
|
|||
|
||||
cpu_reset(CPU(cpu));
|
||||
|
||||
/* either we have a kernel to boot or we jump to U-Boot */
|
||||
/*
|
||||
* On reset the flash is mapped by a shadow TLB, but since we
|
||||
* don't implement them we need to use the same values U-Boot
|
||||
* will use to avoid a fault.
|
||||
* either we have a kernel to boot or we jump to U-Boot
|
||||
*/
|
||||
if (bi->entry != UBOOT_ENTRY) {
|
||||
env->gpr[1] = (16 * MiB) - 8;
|
||||
env->gpr[3] = FDT_ADDR;
|
||||
env->nip = bi->entry;
|
||||
|
||||
/* Create a mapping for the kernel. */
|
||||
mmubooke_create_initial_mapping(env, 0, 0);
|
||||
booke_set_tlb(&env->tlb.tlbe[0], 0, 0, 1 << 31);
|
||||
env->gpr[6] = tswap32(EPAPR_MAGIC);
|
||||
env->gpr[7] = (16 * MiB) - 8; /* bi->ima_size; */
|
||||
|
||||
} else {
|
||||
env->nip = UBOOT_ENTRY;
|
||||
mmubooke_create_initial_mapping_uboot(env);
|
||||
/* Create a mapping for U-Boot. */
|
||||
booke_set_tlb(&env->tlb.tlbe[0], 0xf0000000, 0xf0000000, 0x10000000);
|
||||
env->tlb.tlbe[0].RPN |= 4;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue