All of lore.kernel.org
 help / color / mirror / Atom feed
From: cyril@ti.com (Cyril Chemparathy)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 04/22] ARM: LPAE: support 64-bit virt/phys patching
Date: Sun, 5 Aug 2012 10:21:17 -0400	[thread overview]
Message-ID: <501E815D.1050707@ti.com> (raw)
In-Reply-To: <alpine.LFD.2.02.1208040226060.5231@xanadu.home>

Hi Nicolas,

On 8/4/2012 2:49 AM, Nicolas Pitre wrote:
> On Tue, 31 Jul 2012, Cyril Chemparathy wrote:
>
>> This patch adds support for 64-bit physical addresses in virt_to_phys
>> patching.  This does not do real 64-bit add/sub, but instead patches in the
>> upper 32-bits of the phys_offset directly into the output of virt_to_phys.
>
> You should explain _why_ you do not a real aadd/sub.  I did deduce it
> but that might not be obvious to everyone.  Also this subtlety should be
> commented in the code as well.
>

We could not do an ADDS + ADC here because the carry is not guaranteed 
to be retained and passed into the ADC.  This is because the compiler is 
free to insert all kinds of stuff between the two non-volatile asm blocks.

Is there another subtlety here that I have missed out on entirely?

>> In addition to adding 64-bit support, this patch also adds a set_phys_offset()
>> helper that is needed on architectures that need to modify PHYS_OFFSET during
>> initialization.
>>
>> Signed-off-by: Cyril Chemparathy <cyril@ti.com>
>> ---
>>   arch/arm/include/asm/memory.h |   22 +++++++++++++++-------
>>   arch/arm/kernel/head.S        |    6 ++++++
>>   arch/arm/kernel/setup.c       |   14 ++++++++++++++
>>   3 files changed, 35 insertions(+), 7 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h
>> index 4a0108f..110495c 100644
>> --- a/arch/arm/include/asm/memory.h
>> +++ b/arch/arm/include/asm/memory.h
>> @@ -153,23 +153,31 @@
>>   #ifdef CONFIG_ARM_PATCH_PHYS_VIRT
>>
>>   extern unsigned long __pv_phys_offset;
>> -#define PHYS_OFFSET __pv_phys_offset
>> -
>> +extern unsigned long __pv_phys_offset_high;
>
> As mentioned previously, this is just too ugly.  Please make
> __pv_phys_offset into a phys_addr_t instead and mask the low/high parts
> as needed in __virt_to_phys().
>

Maybe u64 instead of phys_addr_t to keep the sizing non-variable?

>>   extern unsigned long __pv_offset;
>>
>> +extern void set_phys_offset(phys_addr_t po);
>> +
>> +#define PHYS_OFFSET	__virt_to_phys(PAGE_OFFSET)
>> +
>>   static inline phys_addr_t __virt_to_phys(unsigned long x)
>>   {
>> -	unsigned long t;
>> -	early_patch_imm8(x, t, "add", __pv_offset);
>> -	return t;
>> +	unsigned long tlo, thi = 0;
>> +
>> +	early_patch_imm8(x, tlo, "add", __pv_offset);
>> +	if (sizeof(phys_addr_t) > 4)
>> +		early_patch_imm8(0, thi, "add", __pv_phys_offset_high);
>
> Given the high part is always the same, isn't there a better way than an
> add with 0 that could be done here?  The add will force a load of 0 in a
> register needlessly just to add a constant value to it.  Your new
> patching framework ought to be able to patch a mov (or a mvn)
> instruction directly.
>

True.  I'll try and figure out a better way of doing this.

>
> Nicolas
>

Once again, thanks for the excellent feedback.

-- 
Thanks
- Cyril

WARNING: multiple messages have this Message-ID (diff)
From: Cyril Chemparathy <cyril@ti.com>
To: Nicolas Pitre <nicolas.pitre@linaro.org>
Cc: <linux-arm-kernel@lists.infradead.org>,
	<linux-kernel@vger.kernel.org>, <arnd@arndb.de>,
	<catalin.marinas@arm.com>, <linux@arm.linux.org.uk>,
	<will.deacon@arm.com>
Subject: Re: [PATCH 04/22] ARM: LPAE: support 64-bit virt/phys patching
Date: Sun, 5 Aug 2012 10:21:17 -0400	[thread overview]
Message-ID: <501E815D.1050707@ti.com> (raw)
In-Reply-To: <alpine.LFD.2.02.1208040226060.5231@xanadu.home>

Hi Nicolas,

On 8/4/2012 2:49 AM, Nicolas Pitre wrote:
> On Tue, 31 Jul 2012, Cyril Chemparathy wrote:
>
>> This patch adds support for 64-bit physical addresses in virt_to_phys
>> patching.  This does not do real 64-bit add/sub, but instead patches in the
>> upper 32-bits of the phys_offset directly into the output of virt_to_phys.
>
> You should explain _why_ you do not a real aadd/sub.  I did deduce it
> but that might not be obvious to everyone.  Also this subtlety should be
> commented in the code as well.
>

We could not do an ADDS + ADC here because the carry is not guaranteed 
to be retained and passed into the ADC.  This is because the compiler is 
free to insert all kinds of stuff between the two non-volatile asm blocks.

Is there another subtlety here that I have missed out on entirely?

>> In addition to adding 64-bit support, this patch also adds a set_phys_offset()
>> helper that is needed on architectures that need to modify PHYS_OFFSET during
>> initialization.
>>
>> Signed-off-by: Cyril Chemparathy <cyril@ti.com>
>> ---
>>   arch/arm/include/asm/memory.h |   22 +++++++++++++++-------
>>   arch/arm/kernel/head.S        |    6 ++++++
>>   arch/arm/kernel/setup.c       |   14 ++++++++++++++
>>   3 files changed, 35 insertions(+), 7 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h
>> index 4a0108f..110495c 100644
>> --- a/arch/arm/include/asm/memory.h
>> +++ b/arch/arm/include/asm/memory.h
>> @@ -153,23 +153,31 @@
>>   #ifdef CONFIG_ARM_PATCH_PHYS_VIRT
>>
>>   extern unsigned long __pv_phys_offset;
>> -#define PHYS_OFFSET __pv_phys_offset
>> -
>> +extern unsigned long __pv_phys_offset_high;
>
> As mentioned previously, this is just too ugly.  Please make
> __pv_phys_offset into a phys_addr_t instead and mask the low/high parts
> as needed in __virt_to_phys().
>

Maybe u64 instead of phys_addr_t to keep the sizing non-variable?

>>   extern unsigned long __pv_offset;
>>
>> +extern void set_phys_offset(phys_addr_t po);
>> +
>> +#define PHYS_OFFSET	__virt_to_phys(PAGE_OFFSET)
>> +
>>   static inline phys_addr_t __virt_to_phys(unsigned long x)
>>   {
>> -	unsigned long t;
>> -	early_patch_imm8(x, t, "add", __pv_offset);
>> -	return t;
>> +	unsigned long tlo, thi = 0;
>> +
>> +	early_patch_imm8(x, tlo, "add", __pv_offset);
>> +	if (sizeof(phys_addr_t) > 4)
>> +		early_patch_imm8(0, thi, "add", __pv_phys_offset_high);
>
> Given the high part is always the same, isn't there a better way than an
> add with 0 that could be done here?  The add will force a load of 0 in a
> register needlessly just to add a constant value to it.  Your new
> patching framework ought to be able to patch a mov (or a mvn)
> instruction directly.
>

True.  I'll try and figure out a better way of doing this.

>
> Nicolas
>

Once again, thanks for the excellent feedback.

-- 
Thanks
- Cyril

  reply	other threads:[~2012-08-05 14:21 UTC|newest]

Thread overview: 127+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-31 23:04 [PATCH 00/22] Introducing the TI Keystone platform Cyril Chemparathy
2012-07-31 23:04 ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 01/22] ARM: add mechanism for late code patching Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-08-04  5:38   ` Nicolas Pitre
2012-08-04  5:38     ` Nicolas Pitre
2012-08-05 13:56     ` Cyril Chemparathy
2012-08-05 13:56       ` Cyril Chemparathy
2012-08-07 22:52     ` Cyril Chemparathy
2012-08-07 22:52       ` Cyril Chemparathy
2012-08-08  5:56       ` Nicolas Pitre
2012-08-08  5:56         ` Nicolas Pitre
2012-08-08 13:18         ` Cyril Chemparathy
2012-08-08 13:18           ` Cyril Chemparathy
2012-08-08 13:55           ` Nicolas Pitre
2012-08-08 13:55             ` Nicolas Pitre
2012-08-08 16:05             ` Russell King - ARM Linux
2012-08-08 16:05               ` Russell King - ARM Linux
2012-08-08 16:56               ` Nicolas Pitre
2012-08-08 16:56                 ` Nicolas Pitre
2012-08-09  6:59                 ` Tixy
2012-08-09  6:59                   ` Tixy
2012-08-06 11:12   ` Russell King - ARM Linux
2012-08-06 11:12     ` Russell King - ARM Linux
2012-08-06 13:19     ` Cyril Chemparathy
2012-08-06 13:19       ` Cyril Chemparathy
2012-08-06 13:26       ` Russell King - ARM Linux
2012-08-06 13:26         ` Russell King - ARM Linux
2012-08-06 13:38         ` Cyril Chemparathy
2012-08-06 13:38           ` Cyril Chemparathy
2012-08-06 18:02         ` Nicolas Pitre
2012-08-06 18:02           ` Nicolas Pitre
2012-07-31 23:04 ` [PATCH 02/22] ARM: use late patch framework for phys-virt patching Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-08-04  6:15   ` Nicolas Pitre
2012-08-04  6:15     ` Nicolas Pitre
2012-08-05 14:03     ` Cyril Chemparathy
2012-08-05 14:03       ` Cyril Chemparathy
2012-08-06  2:06       ` Nicolas Pitre
2012-08-06  2:06         ` Nicolas Pitre
2012-07-31 23:04 ` [PATCH 03/22] ARM: LPAE: use phys_addr_t on virt <--> phys conversion Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-08-04  6:24   ` Nicolas Pitre
2012-08-04  6:24     ` Nicolas Pitre
2012-08-05 14:05     ` Cyril Chemparathy
2012-08-05 14:05       ` Cyril Chemparathy
2012-08-06 11:14   ` Russell King - ARM Linux
2012-08-06 11:14     ` Russell King - ARM Linux
2012-08-06 13:30     ` Cyril Chemparathy
2012-08-06 13:30       ` Cyril Chemparathy
2012-08-09 14:10     ` Cyril Chemparathy
2012-08-09 14:10       ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 04/22] ARM: LPAE: support 64-bit virt/phys patching Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-08-04  6:49   ` Nicolas Pitre
2012-08-04  6:49     ` Nicolas Pitre
2012-08-05 14:21     ` Cyril Chemparathy [this message]
2012-08-05 14:21       ` Cyril Chemparathy
2012-08-06  2:19       ` Nicolas Pitre
2012-08-06  2:19         ` Nicolas Pitre
2012-07-31 23:04 ` [PATCH 05/22] ARM: LPAE: use signed arithmetic for mask definitions Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 06/22] ARM: LPAE: use phys_addr_t in alloc_init_pud() Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-08-01 12:08   ` Sergei Shtylyov
2012-08-01 12:08     ` Sergei Shtylyov
2012-08-01 15:42     ` Cyril Chemparathy
2012-08-01 15:42       ` Cyril Chemparathy
2012-08-04  6:51   ` Nicolas Pitre
2012-08-04  6:51     ` Nicolas Pitre
2012-07-31 23:04 ` [PATCH 07/22] ARM: LPAE: use phys_addr_t in free_memmap() Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-08-04  6:54   ` Nicolas Pitre
2012-08-04  6:54     ` Nicolas Pitre
2012-07-31 23:04 ` [PATCH 08/22] ARM: LPAE: use phys_addr_t for initrd location and size Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-08-04  6:57   ` Nicolas Pitre
2012-08-04  6:57     ` Nicolas Pitre
2012-08-05 14:23     ` Cyril Chemparathy
2012-08-05 14:23       ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 09/22] ARM: LPAE: use 64-bit pgd physical address in switch_mm() Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-08-04  7:04   ` Nicolas Pitre
2012-08-04  7:04     ` Nicolas Pitre
2012-08-05 14:29     ` Cyril Chemparathy
2012-08-05 14:29       ` Cyril Chemparathy
2012-08-06  2:35       ` Nicolas Pitre
2012-08-06  2:35         ` Nicolas Pitre
2012-07-31 23:04 ` [PATCH 10/22] ARM: LPAE: use 64-bit accessors for TTBR registers Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 11/22] ARM: LPAE: define ARCH_LOW_ADDRESS_LIMIT for bootmem Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 12/22] ARM: LPAE: factor out T1SZ and TTBR1 computations Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 13/22] ARM: LPAE: allow proc override of TTB setup Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 14/22] ARM: LPAE: accomodate >32-bit addresses for page table base Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 15/22] ARM: mm: use physical addresses in highmem sanity checks Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 16/22] ARM: mm: cleanup checks for membank overlap with vmalloc area Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 17/22] ARM: mm: clean up membank size limit checks Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 18/22] ARM: add virt_to_idmap for interconnect aliasing Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-07-31 23:04 ` [PATCH 19/22] ARM: recreate kernel mappings in early_paging_init() Cyril Chemparathy
2012-07-31 23:04   ` Cyril Chemparathy
2012-07-31 23:04 ` [RFC 20/22] ARM: keystone: introducing TI Keystone platform Cyril Chemparathy
2012-07-31 23:06   ` Cyril Chemparathy
2012-07-31 23:16   ` Arnd Bergmann
2012-07-31 23:16     ` Arnd Bergmann
2012-08-01 15:41     ` Cyril Chemparathy
2012-08-01 15:41       ` Cyril Chemparathy
2012-08-01 17:20       ` Arnd Bergmann
2012-07-31 23:04 ` [RFC 21/22] ARM: keystone: enable SMP on Keystone machines Cyril Chemparathy
2012-07-31 23:05   ` Cyril Chemparathy
2012-07-31 23:04 ` [RFC 22/22] ARM: keystone: add switch over to high physical address range Cyril Chemparathy
2012-07-31 23:05   ` Cyril Chemparathy
2012-08-04  8:39 ` [PATCH 00/22] Introducing the TI Keystone platform Russell King - ARM Linux
2012-08-04  8:39   ` Russell King - ARM Linux
2012-08-05 15:10   ` Cyril Chemparathy
2012-08-05 15:10     ` Cyril Chemparathy
2012-08-08 15:43     ` Catalin Marinas
2012-08-08 15:43       ` Catalin Marinas
2012-08-08 13:57 ` Will Deacon
2012-08-08 13:57   ` Will Deacon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=501E815D.1050707@ti.com \
    --to=cyril@ti.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.