linux-mips
[Top] [All Lists]

Re: [PATCH] MIPS: Calculate proper ebase value for 64-bit kernels

To: David Daney <ddaney@caviumnetworks.com>
Subject: Re: [PATCH] MIPS: Calculate proper ebase value for 64-bit kernels
From: Wu Zhangjin <wuzhangjin@gmail.com>
Date: Tue, 13 Apr 2010 13:03:54 +0800
Cc: linux-mips@linux-mips.org, ralf@linux-mips.org
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:subject:from:reply-to:to:cc :in-reply-to:references:x-priority:content-type:organization:date :message-id:mime-version:x-mailer:content-transfer-encoding; bh=VCIsg488Y94CsX4qRUs4W4d8c5HkkeO/d7gARqWJld0=; b=Rxh67ftAozcSC4uTfV98nEAHebGmyLZhjDM//IwEYr/AdV6tOGgyJOD2+8OZaNi7ju Lk0sF8voTTeLOEUgqhCk7ipphdbWU/j73EuyidmZosog3jRn6Sxmlwyn9arc1aLI9ACd psZAbriIgH6rOm5JHrV60puMG4Ec7d7IjcHI0=
Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:from:reply-to:to:cc:in-reply-to:references:x-priority :content-type:organization:date:message-id:mime-version:x-mailer :content-transfer-encoding; b=aN+V5A//CUw80reeTqZyEcc4YLAiJ/Og58zSWDgZv97Zm8U+xoUCOYTmkYxVH9Xith 1p+Hrj611nSiH8l020RBPe3bgb1i7QS2YMHnXaF0tRpT8GfaDAD/Q5SdT1LLNVAlaRw+ n4SVmf/IcvPsQm4RAKbUScmCXi08gqueSZeT8=
In-reply-to: <1270585790-12730-1-git-send-email-ddaney@caviumnetworks.com>
Organization: DSLab, Lanzhou University, China
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <1270585790-12730-1-git-send-email-ddaney@caviumnetworks.com>
Reply-to: wuzhangjin@gmail.com
Sender: linux-mips-bounce@linux-mips.org
Hi, David and Ralf

This patch have broken the support to the MIPS variants whose
cpu_has_mips_r2 is 0 for the CAC_BASE and CKSEG0 is completely different
in these MIPSs.

With the patch, the kernel will exit when booting(later after
trap_init()).

A potential patch to fix the above problem is:

diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
index 1a4dd65..d8cb554 100644
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -1599,7 +1599,7 @@ void __init trap_init(void)
                ebase = (unsigned long)
                        __alloc_bootmem(size, 1 << fls(size), 0);
        } else {
-               ebase = CKSEG0;
+               ebase = (cpu_has_mips_r2) ? CKSEG0 : CAC_BASE;
                if (cpu_has_mips_r2)
                        ebase += (read_c0_ebase() & 0x3ffff000);
        }

Regards,
        Wu Zhangjin

On Tue, 2010-04-06 at 13:29 -0700, David Daney wrote:
> The ebase is relative to CKSEG0 not CAC_BASE.  On a 32-bit kernel they
> are the same thing, for a 64-bit kernel they are not.
> 
> It happens to kind of work on a 64-bit kernel as they both reference
> the same physical memory.  However since the CPU uses the CKSEG0 base,
> determining if a J instruction will reach always gives the wrong
> result unless we use the same number the CPU uses.
> 
> Signed-off-by: David Daney <ddaney@caviumnetworks.com>
> ---
>  arch/mips/kernel/traps.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
> index 7ce84bb..b122f76 100644
> --- a/arch/mips/kernel/traps.c
> +++ b/arch/mips/kernel/traps.c
> @@ -1706,7 +1706,7 @@ void __init trap_init(void)
>               ebase = (unsigned long)
>                       __alloc_bootmem(size, 1 << fls(size), 0);
>       } else {
> -             ebase = CAC_BASE;
> +             ebase = CKSEG0;
>               if (cpu_has_mips_r2)
>                       ebase += (read_c0_ebase() & 0x3ffff000);
>       }



<Prev in Thread] Current Thread [Next in Thread>