From: dave.martin@linaro.org (Dave Martin)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 RESEND 05/17] ARM: LPAE: support 64-bit virt_to_phys patching
Date: Mon, 24 Sep 2012 17:31:46 +0100 [thread overview]
Message-ID: <20120924163146.GD2122@linaro.org> (raw)
In-Reply-To: <1348242975-19184-6-git-send-email-cyril@ti.com>
On Fri, Sep 21, 2012 at 11:56:03AM -0400, 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.
>
> There is no corresponding change on the phys_to_virt() side, because
> computations on the upper 32-bits would be discarded anyway.
>
> Signed-off-by: Cyril Chemparathy <cyril@ti.com>
> ---
> arch/arm/include/asm/memory.h | 38 ++++++++++++++++++++++++++++++++++++--
> arch/arm/kernel/head.S | 4 ++++
> arch/arm/kernel/setup.c | 2 +-
> 3 files changed, 41 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h
> index 88ca206..f3e8f88 100644
> --- a/arch/arm/include/asm/memory.h
> +++ b/arch/arm/include/asm/memory.h
> @@ -154,13 +154,47 @@
> #ifdef CONFIG_ARM_PATCH_PHYS_VIRT
>
> extern unsigned long __pv_offset;
> -extern unsigned long __pv_phys_offset;
> +extern phys_addr_t __pv_phys_offset;
> #define PHYS_OFFSET __virt_to_phys(PAGE_OFFSET)
>
> static inline phys_addr_t __virt_to_phys(unsigned long x)
> {
> - unsigned long t;
> + phys_addr_t t;
> +
> +#ifndef CONFIG_ARM_LPAE
> early_patch_imm8("add", t, x, __pv_offset, 0);
> +#else
> + unsigned long __tmp;
> +
> +#ifndef __ARMEB__
> +#define PV_PHYS_HIGH "(__pv_phys_offset + 4)"
> +#else
> +#define PV_PHYS_HIGH "__pv_phys_offset"
> +#endif
> +
> + early_patch_stub(
> + /* type */ PATCH_IMM8,
> + /* code */
> + "ldr %[tmp], =__pv_offset\n"
> + "ldr %[tmp], [%[tmp]]\n"
> + "add %Q[to], %[from], %[tmp]\n"
> + "ldr %[tmp], =" PV_PHYS_HIGH "\n"
> + "ldr %[tmp], [%[tmp]]\n"
> + "mov %R[to], %[tmp]\n",
> + /* pad */ 4,
> + /* patch_data */
> + ".long __pv_offset\n"
> + "add %Q[to], %[from], %[imm]\n"
> + ".long " PV_PHYS_HIGH "\n"
> + "mov %R[to], %[imm]\n",
> + /* operands */
> + : [to] "=r" (t),
> + [tmp] "=&r" (__tmp)
> + : [from] "r" (x),
> + [imm] "I" (__IMM8),
> + "i" (&__pv_offset),
> + "i" (&__pv_phys_offset));
So, the actual offset we can apply is:
__pv_phys_offset + __pv_offset
where:
* the high 32 bits of the address being fixed up are assumed to be 0
(true, because the kernel is initially always fixed up to an address
range <4GB)
* the low 32 bits of __pv_phys_offset are assumed to be 0 (?)
* the full offset is of the form
([..0..]XX[..0..] << 32) | [..0..]YY[..0..]
Is this intentional? It seems like a rather weird constraint... but
it may be sensible. PAGE_OFFSET is probably 0xc0000000 or 0x80000000,
(so YY can handle that) and the actual RAM above 4GB will likely be
huge and aligned on some enormous boundary in such situations (so that
XX can handle that).
So long as the low RAM alias is not misaligned relative to the high alias
on a finer granularity than 16MB (so that YY = (PAGE_OFFSET +/- the
misalignment) is still a legal immediate), I guess there should not be a
problem.
[...]
Cheers
---Dave
next prev parent reply other threads:[~2012-09-24 16:31 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-21 15:55 [PATCH v3 RESEND 00/17] LPAE fixes and extensions for Keystone Cyril Chemparathy
2012-09-21 15:55 ` [PATCH v3 RESEND 01/17] ARM: add mechanism for late code patching Cyril Chemparathy
2012-09-22 15:10 ` Nicolas Pitre
2012-09-22 21:41 ` Cyril Chemparathy
2012-09-24 12:06 ` Dave Martin
2012-09-24 14:49 ` Cyril Chemparathy
2012-09-24 15:54 ` Dave Martin
2012-09-21 15:56 ` [PATCH v3 RESEND 02/17] ARM: add self test for runtime patch mechanism Cyril Chemparathy
2012-09-21 15:56 ` [PATCH v3 RESEND 03/17] ARM: use late patch framework for phys-virt patching Cyril Chemparathy
2012-09-21 15:56 ` [PATCH v3 RESEND 04/17] ARM: LPAE: use phys_addr_t on virt <--> phys conversion Cyril Chemparathy
2012-09-24 13:09 ` Catalin Marinas
2012-09-24 13:57 ` Cyril Chemparathy
2012-09-21 15:56 ` [PATCH v3 RESEND 05/17] ARM: LPAE: support 64-bit virt_to_phys patching Cyril Chemparathy
2012-09-22 15:24 ` Nicolas Pitre
2012-09-24 15:13 ` Catalin Marinas
2012-09-24 15:56 ` Nicolas Pitre
2012-09-24 20:59 ` Cyril Chemparathy
2012-09-24 21:20 ` Nicolas Pitre
2012-09-24 21:52 ` Catalin Marinas
2012-09-24 22:32 ` Nicolas Pitre
2012-09-24 22:40 ` Russell King - ARM Linux
2012-09-24 22:53 ` Cyril Chemparathy
2012-09-24 23:03 ` Nicolas Pitre
2012-09-24 23:08 ` Russell King - ARM Linux
2012-09-24 22:55 ` Nicolas Pitre
2012-09-25 12:55 ` Dave Martin
2012-09-25 13:53 ` Catalin Marinas
2012-09-24 21:53 ` Cyril Chemparathy
2012-09-24 22:06 ` Russell King - ARM Linux
2012-09-24 16:31 ` Dave Martin [this message]
2012-09-24 16:51 ` Nicolas Pitre
2012-09-21 15:56 ` [PATCH v3 RESEND 06/17] ARM: LPAE: use signed arithmetic for mask definitions Cyril Chemparathy
2012-09-24 13:09 ` Catalin Marinas
2012-09-24 13:54 ` Russell King - ARM Linux
2012-09-21 15:56 ` [PATCH v3 RESEND 07/17] ARM: LPAE: use phys_addr_t in alloc_init_pud() Cyril Chemparathy
2012-09-24 13:10 ` Catalin Marinas
2012-09-21 15:56 ` [PATCH v3 RESEND 08/17] ARM: LPAE: use phys_addr_t in free_memmap() Cyril Chemparathy
2012-09-24 13:29 ` Catalin Marinas
2012-09-24 13:41 ` Russell King - ARM Linux
2012-09-24 15:09 ` Cyril Chemparathy
2012-09-24 15:22 ` Russell King - ARM Linux
2012-09-24 16:41 ` Cyril Chemparathy
2012-09-24 16:51 ` Catalin Marinas
2012-09-24 17:06 ` Cyril Chemparathy
2012-09-24 17:14 ` Russell King - ARM Linux
2012-09-25 13:08 ` Catalin Marinas
2012-09-25 13:30 ` Russell King - ARM Linux
2012-09-24 16:55 ` Russell King - ARM Linux
2012-09-24 17:03 ` Catalin Marinas
2012-09-21 15:56 ` [PATCH v3 RESEND 09/17] ARM: LPAE: use phys_addr_t for initrd location and size Cyril Chemparathy
2012-09-24 13:30 ` Catalin Marinas
2012-09-24 13:38 ` Russell King - ARM Linux
2012-09-24 14:00 ` Cyril Chemparathy
2012-09-21 15:56 ` [PATCH v3 RESEND 10/17] ARM: LPAE: use phys_addr_t in switch_mm() Cyril Chemparathy
2012-09-24 14:05 ` Catalin Marinas
2012-09-24 14:32 ` Cyril Chemparathy
2012-09-21 15:56 ` [PATCH v3 RESEND 11/17] ARM: LPAE: use 64-bit accessors for TTBR registers Cyril Chemparathy
2012-09-24 14:10 ` Catalin Marinas
2012-09-21 15:56 ` [PATCH v3 RESEND 12/17] ARM: LPAE: define ARCH_LOW_ADDRESS_LIMIT for bootmem Cyril Chemparathy
2012-09-24 14:16 ` Catalin Marinas
2012-09-21 15:56 ` [PATCH v3 RESEND 13/17] ARM: LPAE: factor out T1SZ and TTBR1 computations Cyril Chemparathy
2012-09-24 14:45 ` Catalin Marinas
2012-09-24 14:58 ` Cyril Chemparathy
2012-09-21 15:56 ` [PATCH v3 RESEND 14/17] ARM: LPAE: accomodate >32-bit addresses for page table base Cyril Chemparathy
2012-09-24 15:17 ` Catalin Marinas
2012-09-21 15:56 ` [PATCH v3 RESEND 15/17] ARM: mm: use physical addresses in highmem sanity checks Cyril Chemparathy
2012-09-24 15:18 ` Catalin Marinas
2012-09-21 15:56 ` [PATCH v3 RESEND 16/17] ARM: mm: cleanup checks for membank overlap with vmalloc area Cyril Chemparathy
2012-09-21 15:56 ` [PATCH v3 RESEND 17/17] ARM: mm: clean up membank size limit checks Cyril Chemparathy
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=20120924163146.GD2122@linaro.org \
--to=dave.martin@linaro.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).