[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] PPC: mpc8544ds: Span initial TLB entry over as
From: |
Alexander Graf |
Subject: |
Re: [Qemu-devel] [PATCH] PPC: mpc8544ds: Span initial TLB entry over as much RAM as we need |
Date: |
Sun, 20 May 2012 17:21:47 +0200 |
On 20.05.2012, at 15:58, Andreas Färber <address@hidden> 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 <address@hidden>
>> Signed-off-by: Alexander Graf <address@hidden>
>> ---
>> 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