On 20.05.2012, at 15:58, Andreas Färber <afaer...@suse.de> wrote:
> Am 19.05.2012 00:53, schrieb Alexander Graf: >> The initial TLB entry is supposed to help us run the guest -kernel payload. >> This means the guest needs to be able to access its own memory, the initrd >> memory and the device tree. >> >> So far we only statically reserved a TLB entry from [0;256M[. This patch >> fixes it to span from [0;dt_end[, allowing the guest payload to access >> everything initially. >> >> Reported-by: Stuart Yoder <stuart.yo...@freescale.com> >> Signed-off-by: Alexander Graf <ag...@suse.de> >> --- >> hw/ppce500_mpc8544ds.c | 41 +++++++++++++++++++++++++++-------------- >> 1 files changed, 27 insertions(+), 14 deletions(-) >> >> diff --git a/hw/ppce500_mpc8544ds.c b/hw/ppce500_mpc8544ds.c >> index f1dfbe1..42a63aa 100644 >> --- a/hw/ppce500_mpc8544ds.c >> +++ b/hw/ppce500_mpc8544ds.c >> @@ -31,6 +31,7 @@ >> #include "elf.h" >> #include "sysbus.h" >> #include "exec-memory.h" >> +#include "host-utils.h" >> >> #define BINARY_DEVICE_TREE_FILE "mpc8544ds.dtb" >> #define UIMAGE_LOAD_BASE 0 >> @@ -55,6 +56,7 @@ >> struct boot_info >> { >> uint32_t dt_base; >> + uint32_t dt_size; >> uint32_t entry; >> }; >> >> @@ -164,7 +166,11 @@ static int mpc8544_load_device_tree(CPUPPCState *env, >> } >> >> ret = rom_add_blob_fixed(BINARY_DEVICE_TREE_FILE, fdt, fdt_size, addr); >> + if (ret < 0) { >> + goto out; >> + } >> g_free(fdt); >> + ret = fdt_size; >> >> out: >> #endif >> @@ -172,23 +178,27 @@ out: >> return ret; >> } >> >> -/* Create -kernel TLB entries for BookE, linearly spanning 256MB. */ >> +/* Create -kernel TLB entries for BookE. */ >> static inline target_phys_addr_t booke206_page_size_to_tlb(uint64_t size) >> { >> - return ffs(size >> 10) - 1; >> + return 63 - clz64(size >> 10); >> } >> >> -static void mmubooke_create_initial_mapping(CPUPPCState *env, >> - target_ulong va, >> - target_phys_addr_t pa) >> +static void mmubooke_create_initial_mapping(CPUPPCState *env) >> { >> + struct boot_info *bi = env->load_info; >> ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 0); >> - target_phys_addr_t size; >> - >> - size = (booke206_page_size_to_tlb(256 * 1024 * 1024) << >> MAS1_TSIZE_SHIFT); >> + target_phys_addr_t size, dt_end; >> + int ps; >> + >> + /* Our initial TLB entry needs to cover everything from 0 to >> + the device tree top */ >> + dt_end = bi->dt_base + bi->dt_size; >> + ps = booke206_page_size_to_tlb(dt_end) + 1; >> + size = (ps << MAS1_TSIZE_SHIFT); >> tlb->mas1 = MAS1_VALID | size; >> - tlb->mas2 = va & TARGET_PAGE_MASK; >> - tlb->mas7_3 = pa & TARGET_PAGE_MASK; >> + tlb->mas2 = 0; >> + tlb->mas7_3 = 0; >> tlb->mas7_3 |= MAS3_UR | MAS3_UW | MAS3_UX | MAS3_SR | MAS3_SW | MAS3_SX; >> >> env->tlb_dirty = true; >> @@ -218,7 +228,7 @@ static void mpc8544ds_cpu_reset(void *opaque) >> env->gpr[1] = (16<<20) - 8; >> env->gpr[3] = bi->dt_base; >> env->nip = bi->entry; >> - mmubooke_create_initial_mapping(env, 0, 0); >> + mmubooke_create_initial_mapping(env); >> } >> >> static void mpc8544ds_init(ram_addr_t ram_size, >> @@ -374,13 +384,15 @@ static void mpc8544ds_init(ram_addr_t ram_size, >> /* If we're loading a kernel directly, we must load the device tree too. >> */ >> if (kernel_filename) { >> struct boot_info *boot_info; >> + int dt_size; >> >> #ifndef CONFIG_FDT >> cpu_abort(env, "Compiled without FDT support - can't load kernel\n"); >> #endif >> - dt_base = (kernel_size + DTC_LOAD_PAD) & ~DTC_PAD_MASK; >> - if (mpc8544_load_device_tree(env, dt_base, ram_size, >> - initrd_base, initrd_size, kernel_cmdline) < 0) { >> + dt_base = (loadaddr + kernel_size + DTC_LOAD_PAD) & ~DTC_PAD_MASK; >> + dt_size = mpc8544_load_device_tree(env, dt_base, ram_size, >> initrd_base, >> + initrd_size, kernel_cmdline); >> + if (dt_size < 0) { >> fprintf(stderr, "couldn't load device tree\n"); >> exit(1); >> } >> @@ -388,6 +400,7 @@ static void mpc8544ds_init(ram_addr_t ram_size, >> boot_info = env->load_info; > > This is turned into cpu->load_info in my series. Since this patch is not > marked 1.1, please ack and apply my patches first, so that we don't run > into conflicts with qom-next. Thanks. Yeah, of course. Rebasing this on top of your series should be trivial - and it's not crucial for 1.1 IMHO. Alex > > Andreas > >> boot_info->entry = entry; >> boot_info->dt_base = dt_base; >> + boot_info->dt_size = dt_size; >> } >> >> if (kvm_enabled()) { > > > -- > SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany > GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg