From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stephen Boyd Subject: Re: [PATCH] ARM: avoid mis-detecting some V7 cores in the decompressor Date: Mon, 03 Jun 2013 14:13:39 -0700 Message-ID: <51AD0703.6050408@codeaurora.org> References: <1368049671-22879-1-git-send-email-sboyd@codeaurora.org> <5193E424.9090605@codeaurora.org> <519E57D2.3050000@codeaurora.org> <20130523231531.GT18614@n2100.arm.linux.org.uk> <20130524220539.GB599@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Return-path: Received: from smtp.codeaurora.org ([198.145.11.231]:48166 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755170Ab3FCVNk (ORCPT ); Mon, 3 Jun 2013 17:13:40 -0400 In-Reply-To: <20130524220539.GB599@codeaurora.org> Sender: linux-arm-msm-owner@vger.kernel.org List-Id: linux-arm-msm@vger.kernel.org To: Russell King - ARM Linux Cc: Brian Swetland , linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Nicolas Pitre Resending due to rmk's vacation. On 05/24/13 15:05, Stephen Boyd wrote: > I've noticed another problem now that our caches are used. On MSM > we have TEXT_OFFSET set to at least 0x208000 if we've built-in > support for MSM8x60/8960. If I boot a kernel with the MSM code > built-in that requires the higher text offset, but I load my > compressed kernel below that address (such as 0x0) the > decompression fails. > > This happens because the page tables are written into the > compressed data region before we relocate ourself to a higher > location. > > Here's some ascii art to show the problem > > We start off at 0x0 > > 0x000000 +---------+ > | | > | zImage | > 0x208000 |---------| <- r4 (zreladdr) > | zImage | > 0x300000 +---------+ <- _edata > > Then we run far enough to call cache_on which goes ahead and > calls __setup_mmu and sets up our page tables. > > 0x008000 +---------+ > | | > | zImage | > | | > 0x204000 |---------| > | pgdir | > 0x208000 |---------| <- r4 (zreladdr) > | | > | zImage | > | | > 0x300000 +---------+ <- _edata > > This is bad because we just wrote our page tables into the > compressed data. Nobody notices though and we finish relocating > ourselves and then we call decompress_kernel() which fails > randomly. (BTW, why does error() sit in a while loop forever? We > can't get any information about why the decompression failed if > we have debug_ll enabled. I had to patch the error() routine to > not while loop forever to get that print after do_decompress to > be useful.) > > I see a few solutions. > > 1) Relocate with caches off and then turn on caches after we're > running in a location where we won't overwrite ourselves. > > 2) Have temporary page tables for the relocation phase that live > just below the location we're going to relocate to. > > 3) Force bootloaders loading these types of images to load the > zImage at least as high as the TEXT_OFFSET is compiled to. > > I don't think we can convince everyone that #3 is ok to do. I'm > leaning towards #2 since we get all the benefits of the cache > during the relocation phase but #1 is the obviously simple fix. > -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation