* [PATCH v2 0/6] Consolidate identity mapping code in idmap.c
@ 2011-11-28 18:28 Will Deacon
2011-11-28 18:28 ` [PATCH v2 1/6] ARM: idmap: populate identity map pgd at init time using .init.text Will Deacon
` (6 more replies)
0 siblings, 7 replies; 12+ messages in thread
From: Will Deacon @ 2011-11-28 18:28 UTC (permalink / raw)
To: linux-arm-kernel
Hello,
This is version 2 of the patch series originally posted here:
http://lists.infradead.org/pipermail/linux-arm-kernel/2011-November/073033.html
Changes from v1 include:
* Updated following Catalin's comments
* Rebased onto rmk/devel-stable
* Includes update to SMP booting so that the idmap_pgd can be
used there too
This is a pre-requisite for my kexec patches, which I will post separately.
All feedback welcome.
Thanks,
Will
Will Deacon (6):
ARM: idmap: populate identity map pgd at init time using .init.text
ARM: suspend: use idmap_pgd instead of suspend_pgd
ARM: proc-*.S: place cpu_reset functions into .idmap.text section
ARM: idmap: use idmap_pgd when setting up mm for reboot
ARM: head.S: only include __turn_mmu_on in the initial identity
mapping
ARM: SMP: use idmap_pgd for mapping MMU enable during secondary
booting
arch/arm/include/asm/idmap.h | 14 +++++++++
arch/arm/include/asm/pgtable.h | 3 --
arch/arm/kernel/head.S | 18 ++++++-----
arch/arm/kernel/sleep.S | 2 +
arch/arm/kernel/smp.c | 32 +-------------------
arch/arm/kernel/suspend.c | 18 ++---------
arch/arm/kernel/vmlinux.lds.S | 7 ++++
arch/arm/mm/idmap.c | 63 +++++++++++++++++++---------------------
arch/arm/mm/proc-arm1020.S | 3 ++
arch/arm/mm/proc-arm1020e.S | 3 ++
arch/arm/mm/proc-arm1022.S | 3 ++
arch/arm/mm/proc-arm1026.S | 3 ++
arch/arm/mm/proc-arm6_7.S | 4 ++
arch/arm/mm/proc-arm720.S | 3 ++
arch/arm/mm/proc-arm740.S | 3 ++
arch/arm/mm/proc-arm7tdmi.S | 3 ++
arch/arm/mm/proc-arm920.S | 3 ++
arch/arm/mm/proc-arm922.S | 3 ++
arch/arm/mm/proc-arm925.S | 3 ++
arch/arm/mm/proc-arm926.S | 3 ++
arch/arm/mm/proc-arm940.S | 3 ++
arch/arm/mm/proc-arm946.S | 3 ++
arch/arm/mm/proc-arm9tdmi.S | 3 ++
arch/arm/mm/proc-fa526.S | 3 ++
arch/arm/mm/proc-feroceon.S | 3 ++
arch/arm/mm/proc-mohawk.S | 3 ++
arch/arm/mm/proc-sa110.S | 3 ++
arch/arm/mm/proc-sa1100.S | 3 ++
arch/arm/mm/proc-v6.S | 3 ++
arch/arm/mm/proc-v7.S | 2 +
arch/arm/mm/proc-xsc3.S | 3 ++
arch/arm/mm/proc-xscale.S | 3 ++
32 files changed, 140 insertions(+), 89 deletions(-)
create mode 100644 arch/arm/include/asm/idmap.h
--
1.7.4.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 1/6] ARM: idmap: populate identity map pgd at init time using .init.text
2011-11-28 18:28 [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Will Deacon
@ 2011-11-28 18:28 ` Will Deacon
2011-11-30 11:29 ` Catalin Marinas
2011-11-28 18:28 ` [PATCH v2 2/6] ARM: suspend: use idmap_pgd instead of suspend_pgd Will Deacon
` (5 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Will Deacon @ 2011-11-28 18:28 UTC (permalink / raw)
To: linux-arm-kernel
When disabling and re-enabling the MMU, it is necessary to take out an
identity mapping for the code that manipulates the SCTLR in order to
avoid it disappearing from under our feet. This is useful when soft
rebooting and returning from CPU suspend.
This patch allocates a set of page tables during boot and populates them
with an identity mapping for the .idmap.text section. This means that
users of the identity map do not need to manage their own pgd and can
instead annotate their functions with __idmap or, in the case of assembly
code, place them in the correct section.
Acked-by: Dave Martin <dave.martin@linaro.org>
Tested-by: Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
---
arch/arm/include/asm/idmap.h | 17 +++++++++++++++++
arch/arm/include/asm/pgtable.h | 3 ---
arch/arm/kernel/smp.c | 1 +
arch/arm/kernel/vmlinux.lds.S | 7 +++++++
arch/arm/mm/idmap.c | 26 ++++++++++++++++++++++++++
5 files changed, 51 insertions(+), 3 deletions(-)
create mode 100644 arch/arm/include/asm/idmap.h
diff --git a/arch/arm/include/asm/idmap.h b/arch/arm/include/asm/idmap.h
new file mode 100644
index 0000000..62e3d19
--- /dev/null
+++ b/arch/arm/include/asm/idmap.h
@@ -0,0 +1,17 @@
+#ifndef __ASM_IDMAP_H
+#define __ASM_IDMAP_H
+
+#include <linux/compiler.h>
+#include <asm/pgtable.h>
+
+/* Tag a function as requiring to be executed via an identity mapping. */
+#define __idmap __section(.idmap.text) noinline notrace
+
+extern pgd_t *idmap_pgd;
+
+void identity_mapping_add(pgd_t *, unsigned long, unsigned long);
+void identity_mapping_del(pgd_t *, unsigned long, unsigned long);
+
+void setup_mm_for_reboot(void);
+
+#endif /* __ASM_IDMAP_H */
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h
index 9451dce..03893a5 100644
--- a/arch/arm/include/asm/pgtable.h
+++ b/arch/arm/include/asm/pgtable.h
@@ -346,9 +346,6 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
#define pgtable_cache_init() do { } while (0)
-void identity_mapping_add(pgd_t *, unsigned long, unsigned long);
-void identity_mapping_del(pgd_t *, unsigned long, unsigned long);
-
#endif /* !__ASSEMBLY__ */
#endif /* CONFIG_MMU */
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index ef5640b..8afadda 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -31,6 +31,7 @@
#include <asm/cpu.h>
#include <asm/cputype.h>
#include <asm/exception.h>
+#include <asm/idmap.h>
#include <asm/topology.h>
#include <asm/mmu_context.h>
#include <asm/pgtable.h>
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index 20b3041..f76e755 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -13,6 +13,12 @@
*(.proc.info.init) \
VMLINUX_SYMBOL(__proc_info_end) = .;
+#define IDMAP_TEXT \
+ ALIGN_FUNCTION(); \
+ VMLINUX_SYMBOL(__idmap_text_start) = .; \
+ *(.idmap.text) \
+ VMLINUX_SYMBOL(__idmap_text_end) = .;
+
#ifdef CONFIG_HOTPLUG_CPU
#define ARM_CPU_DISCARD(x)
#define ARM_CPU_KEEP(x) x
@@ -92,6 +98,7 @@ SECTIONS
SCHED_TEXT
LOCK_TEXT
KPROBES_TEXT
+ IDMAP_TEXT
#ifdef CONFIG_MMU
*(.fixup)
#endif
diff --git a/arch/arm/mm/idmap.c b/arch/arm/mm/idmap.c
index 296ad2e..cda5ea3 100644
--- a/arch/arm/mm/idmap.c
+++ b/arch/arm/mm/idmap.c
@@ -1,8 +1,12 @@
#include <linux/kernel.h>
#include <asm/cputype.h>
+#include <asm/idmap.h>
#include <asm/pgalloc.h>
#include <asm/pgtable.h>
+#include <asm/sections.h>
+
+pgd_t *idmap_pgd;
static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end,
unsigned long prot)
@@ -73,6 +77,28 @@ void identity_mapping_del(pgd_t *pgd, unsigned long addr, unsigned long end)
}
#endif
+extern char __idmap_text_start[], __idmap_text_end[];
+
+static int __init init_static_idmap(void)
+{
+ phys_addr_t idmap_start, idmap_end;
+
+ idmap_pgd = pgd_alloc(&init_mm);
+ if (!idmap_pgd)
+ return -ENOMEM;
+
+ /* Add an identity mapping for the physical address of the section. */
+ idmap_start = virt_to_phys((void *)__idmap_text_start);
+ idmap_end = virt_to_phys((void *)__idmap_text_end);
+
+ pr_info("Setting up static identity map for 0x%llx - 0x%llx\n",
+ (long long)idmap_start, (long long)idmap_end);
+ identity_mapping_add(idmap_pgd, idmap_start, idmap_end);
+
+ return 0;
+}
+arch_initcall(init_static_idmap);
+
/*
* In order to soft-boot, we need to insert a 1:1 mapping in place of
* the user-mode pages. This will then ensure that we have predictable
--
1.7.4.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 2/6] ARM: suspend: use idmap_pgd instead of suspend_pgd
2011-11-28 18:28 [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Will Deacon
2011-11-28 18:28 ` [PATCH v2 1/6] ARM: idmap: populate identity map pgd at init time using .init.text Will Deacon
@ 2011-11-28 18:28 ` Will Deacon
2011-11-28 18:28 ` [PATCH v2 3/6] ARM: proc-*.S: place cpu_reset functions into .idmap.text section Will Deacon
` (4 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Will Deacon @ 2011-11-28 18:28 UTC (permalink / raw)
To: linux-arm-kernel
The ARM CPU suspend code requires cpu_resume_mmu to be identity mapped
in order to re-enable the MMU when coming out of suspend. Currently,
this is accomplished by maintaining a suspend_pgd with the relevant
mapping put in place at init time.
This patch replaces the use of suspend_pgd with the new idmap_pgd.
cpu_resume_mmu is placed in the .idmap.text section so that it is
included in the identity map.
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Dave Martin <dave.martin@linaro.org>
Tested-by: Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
---
arch/arm/kernel/sleep.S | 2 ++
arch/arm/kernel/suspend.c | 18 +++---------------
2 files changed, 5 insertions(+), 15 deletions(-)
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
index 020e99c..9e64231 100644
--- a/arch/arm/kernel/sleep.S
+++ b/arch/arm/kernel/sleep.S
@@ -54,6 +54,7 @@ ENDPROC(cpu_suspend_abort)
* r0 = control register value
*/
.align 5
+ .pushsection .idmap.text,"ax"
ENTRY(cpu_resume_mmu)
ldr r3, =cpu_resume_after_mmu
mcr p15, 0, r0, c1, c0, 0 @ turn on MMU, I-cache, etc
@@ -62,6 +63,7 @@ ENTRY(cpu_resume_mmu)
mov r0, r0
mov pc, r3 @ jump to virtual address
ENDPROC(cpu_resume_mmu)
+ .popsection
cpu_resume_after_mmu:
bl cpu_init @ restore the und/abt/irq banked regs
mov r0, #0 @ return zero on success
diff --git a/arch/arm/kernel/suspend.c b/arch/arm/kernel/suspend.c
index 93a22d2..1794cc3 100644
--- a/arch/arm/kernel/suspend.c
+++ b/arch/arm/kernel/suspend.c
@@ -1,13 +1,12 @@
#include <linux/init.h>
+#include <asm/idmap.h>
#include <asm/pgalloc.h>
#include <asm/pgtable.h>
#include <asm/memory.h>
#include <asm/suspend.h>
#include <asm/tlbflush.h>
-static pgd_t *suspend_pgd;
-
extern int __cpu_suspend(unsigned long, int (*)(unsigned long));
extern void cpu_resume_mmu(void);
@@ -21,7 +20,7 @@ void __cpu_suspend_save(u32 *ptr, u32 ptrsz, u32 sp, u32 *save_ptr)
*save_ptr = virt_to_phys(ptr);
/* This must correspond to the LDM in cpu_resume() assembly */
- *ptr++ = virt_to_phys(suspend_pgd);
+ *ptr++ = virt_to_phys(idmap_pgd);
*ptr++ = sp;
*ptr++ = virt_to_phys(cpu_do_resume);
@@ -42,7 +41,7 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
struct mm_struct *mm = current->active_mm;
int ret;
- if (!suspend_pgd)
+ if (!idmap_pgd)
return -EINVAL;
/*
@@ -59,14 +58,3 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
return ret;
}
-
-static int __init cpu_suspend_init(void)
-{
- suspend_pgd = pgd_alloc(&init_mm);
- if (suspend_pgd) {
- unsigned long addr = virt_to_phys(cpu_resume_mmu);
- identity_mapping_add(suspend_pgd, addr, addr + SECTION_SIZE);
- }
- return suspend_pgd ? 0 : -ENOMEM;
-}
-core_initcall(cpu_suspend_init);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 3/6] ARM: proc-*.S: place cpu_reset functions into .idmap.text section
2011-11-28 18:28 [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Will Deacon
2011-11-28 18:28 ` [PATCH v2 1/6] ARM: idmap: populate identity map pgd at init time using .init.text Will Deacon
2011-11-28 18:28 ` [PATCH v2 2/6] ARM: suspend: use idmap_pgd instead of suspend_pgd Will Deacon
@ 2011-11-28 18:28 ` Will Deacon
2011-11-28 18:28 ` [PATCH v2 4/6] ARM: idmap: use idmap_pgd when setting up mm for reboot Will Deacon
` (3 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Will Deacon @ 2011-11-28 18:28 UTC (permalink / raw)
To: linux-arm-kernel
The CPU reset functions disable the MMU and therefore must be executed
with an identity mapping in place.
This patch places the CPU reset functions into the .idmap.text section,
causing the idmap code to include them as part of the identity mapping.
Acked-by: Dave Martin <dave.martin@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
---
arch/arm/mm/proc-arm1020.S | 3 +++
arch/arm/mm/proc-arm1020e.S | 3 +++
arch/arm/mm/proc-arm1022.S | 3 +++
arch/arm/mm/proc-arm1026.S | 3 +++
arch/arm/mm/proc-arm6_7.S | 4 ++++
arch/arm/mm/proc-arm720.S | 3 +++
arch/arm/mm/proc-arm740.S | 3 +++
arch/arm/mm/proc-arm7tdmi.S | 3 +++
arch/arm/mm/proc-arm920.S | 3 +++
arch/arm/mm/proc-arm922.S | 3 +++
arch/arm/mm/proc-arm925.S | 3 +++
arch/arm/mm/proc-arm926.S | 3 +++
arch/arm/mm/proc-arm940.S | 3 +++
arch/arm/mm/proc-arm946.S | 3 +++
arch/arm/mm/proc-arm9tdmi.S | 3 +++
arch/arm/mm/proc-fa526.S | 3 +++
arch/arm/mm/proc-feroceon.S | 3 +++
arch/arm/mm/proc-mohawk.S | 3 +++
arch/arm/mm/proc-sa110.S | 3 +++
arch/arm/mm/proc-sa1100.S | 3 +++
arch/arm/mm/proc-v6.S | 3 +++
arch/arm/mm/proc-v7.S | 2 ++
arch/arm/mm/proc-xsc3.S | 3 +++
arch/arm/mm/proc-xscale.S | 3 +++
24 files changed, 72 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S
index 6746966..2349513 100644
--- a/arch/arm/mm/proc-arm1020.S
+++ b/arch/arm/mm/proc-arm1020.S
@@ -95,6 +95,7 @@ ENTRY(cpu_arm1020_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm1020_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
@@ -107,6 +108,8 @@ ENTRY(cpu_arm1020_reset)
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_arm1020_reset)
+ .popsection
/*
* cpu_arm1020_do_idle()
diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S
index 4251421..c244b06 100644
--- a/arch/arm/mm/proc-arm1020e.S
+++ b/arch/arm/mm/proc-arm1020e.S
@@ -95,6 +95,7 @@ ENTRY(cpu_arm1020e_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm1020e_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
@@ -107,6 +108,8 @@ ENTRY(cpu_arm1020e_reset)
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_arm1020e_reset)
+ .popsection
/*
* cpu_arm1020e_do_idle()
diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S
index d283cf3..38fe22e 100644
--- a/arch/arm/mm/proc-arm1022.S
+++ b/arch/arm/mm/proc-arm1022.S
@@ -84,6 +84,7 @@ ENTRY(cpu_arm1022_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm1022_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
@@ -96,6 +97,8 @@ ENTRY(cpu_arm1022_reset)
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_arm1022_reset)
+ .popsection
/*
* cpu_arm1022_do_idle()
diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S
index 678a1ce..3eb9c3c 100644
--- a/arch/arm/mm/proc-arm1026.S
+++ b/arch/arm/mm/proc-arm1026.S
@@ -84,6 +84,7 @@ ENTRY(cpu_arm1026_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm1026_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
@@ -96,6 +97,8 @@ ENTRY(cpu_arm1026_reset)
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_arm1026_reset)
+ .popsection
/*
* cpu_arm1026_do_idle()
diff --git a/arch/arm/mm/proc-arm6_7.S b/arch/arm/mm/proc-arm6_7.S
index e5b974c..4fbeb5b 100644
--- a/arch/arm/mm/proc-arm6_7.S
+++ b/arch/arm/mm/proc-arm6_7.S
@@ -225,6 +225,7 @@ ENTRY(cpu_arm7_set_pte_ext)
* Params : r0 = address to jump to
* Notes : This sets up everything for a reset
*/
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm6_reset)
ENTRY(cpu_arm7_reset)
mov r1, #0
@@ -235,6 +236,9 @@ ENTRY(cpu_arm7_reset)
mov r1, #0x30
mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc
mov pc, r0
+ENDPROC(cpu_arm6_reset)
+ENDPROC(cpu_arm7_reset)
+ .popsection
__CPUINIT
diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S
index 55f4e29..0ac908c 100644
--- a/arch/arm/mm/proc-arm720.S
+++ b/arch/arm/mm/proc-arm720.S
@@ -101,6 +101,7 @@ ENTRY(cpu_arm720_set_pte_ext)
* Params : r0 = address to jump to
* Notes : This sets up everything for a reset
*/
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm720_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate cache
@@ -112,6 +113,8 @@ ENTRY(cpu_arm720_reset)
bic ip, ip, #0x2100 @ ..v....s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_arm720_reset)
+ .popsection
__CPUINIT
diff --git a/arch/arm/mm/proc-arm740.S b/arch/arm/mm/proc-arm740.S
index 4506be3..dc5de5d 100644
--- a/arch/arm/mm/proc-arm740.S
+++ b/arch/arm/mm/proc-arm740.S
@@ -49,6 +49,7 @@ ENTRY(cpu_arm740_proc_fin)
* Params : r0 = address to jump to
* Notes : This sets up everything for a reset
*/
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm740_reset)
mov ip, #0
mcr p15, 0, ip, c7, c0, 0 @ invalidate cache
@@ -56,6 +57,8 @@ ENTRY(cpu_arm740_reset)
bic ip, ip, #0x0000000c @ ............wc..
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_arm740_reset)
+ .popsection
__CPUINIT
diff --git a/arch/arm/mm/proc-arm7tdmi.S b/arch/arm/mm/proc-arm7tdmi.S
index 7e0e1fe..6ddea3e 100644
--- a/arch/arm/mm/proc-arm7tdmi.S
+++ b/arch/arm/mm/proc-arm7tdmi.S
@@ -45,8 +45,11 @@ ENTRY(cpu_arm7tdmi_proc_fin)
* Params : loc(r0) address to jump to
* Purpose : Sets up everything for a reset and jump to the location for soft reset.
*/
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm7tdmi_reset)
mov pc, r0
+ENDPROC(cpu_arm7tdmi_reset)
+ .popsection
__CPUINIT
diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S
index 88fb3d9..cb941ae 100644
--- a/arch/arm/mm/proc-arm920.S
+++ b/arch/arm/mm/proc-arm920.S
@@ -85,6 +85,7 @@ ENTRY(cpu_arm920_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm920_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
@@ -97,6 +98,8 @@ ENTRY(cpu_arm920_reset)
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_arm920_reset)
+ .popsection
/*
* cpu_arm920_do_idle()
diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S
index 490e188..4ec0e07 100644
--- a/arch/arm/mm/proc-arm922.S
+++ b/arch/arm/mm/proc-arm922.S
@@ -87,6 +87,7 @@ ENTRY(cpu_arm922_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm922_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
@@ -99,6 +100,8 @@ ENTRY(cpu_arm922_reset)
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_arm922_reset)
+ .popsection
/*
* cpu_arm922_do_idle()
diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S
index 51d494b..9dccd9a 100644
--- a/arch/arm/mm/proc-arm925.S
+++ b/arch/arm/mm/proc-arm925.S
@@ -108,6 +108,7 @@ ENTRY(cpu_arm925_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm925_reset)
/* Send software reset to MPU and DSP */
mov ip, #0xff000000
@@ -115,6 +116,8 @@ ENTRY(cpu_arm925_reset)
orr ip, ip, #0x0000ce00
mov r4, #1
strh r4, [ip, #0x10]
+ENDPROC(cpu_arm925_reset)
+ .popsection
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S
index 9f8fd91..820259b 100644
--- a/arch/arm/mm/proc-arm926.S
+++ b/arch/arm/mm/proc-arm926.S
@@ -77,6 +77,7 @@ ENTRY(cpu_arm926_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm926_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
@@ -89,6 +90,8 @@ ENTRY(cpu_arm926_reset)
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_arm926_reset)
+ .popsection
/*
* cpu_arm926_do_idle()
diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S
index ac750d5..9fdc0a1 100644
--- a/arch/arm/mm/proc-arm940.S
+++ b/arch/arm/mm/proc-arm940.S
@@ -48,6 +48,7 @@ ENTRY(cpu_arm940_proc_fin)
* Params : r0 = address to jump to
* Notes : This sets up everything for a reset
*/
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm940_reset)
mov ip, #0
mcr p15, 0, ip, c7, c5, 0 @ flush I cache
@@ -58,6 +59,8 @@ ENTRY(cpu_arm940_reset)
bic ip, ip, #0x00001000 @ i-cache
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_arm940_reset)
+ .popsection
/*
* cpu_arm940_do_idle()
diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S
index 683af3a..f684cfe 100644
--- a/arch/arm/mm/proc-arm946.S
+++ b/arch/arm/mm/proc-arm946.S
@@ -55,6 +55,7 @@ ENTRY(cpu_arm946_proc_fin)
* Params : r0 = address to jump to
* Notes : This sets up everything for a reset
*/
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm946_reset)
mov ip, #0
mcr p15, 0, ip, c7, c5, 0 @ flush I cache
@@ -65,6 +66,8 @@ ENTRY(cpu_arm946_reset)
bic ip, ip, #0x00001000 @ i-cache
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_arm946_reset)
+ .popsection
/*
* cpu_arm946_do_idle()
diff --git a/arch/arm/mm/proc-arm9tdmi.S b/arch/arm/mm/proc-arm9tdmi.S
index 2120f9e..8881391 100644
--- a/arch/arm/mm/proc-arm9tdmi.S
+++ b/arch/arm/mm/proc-arm9tdmi.S
@@ -45,8 +45,11 @@ ENTRY(cpu_arm9tdmi_proc_fin)
* Params : loc(r0) address to jump to
* Purpose : Sets up everything for a reset and jump to the location for soft reset.
*/
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_arm9tdmi_reset)
mov pc, r0
+ENDPROC(cpu_arm9tdmi_reset)
+ .popsection
__CPUINIT
diff --git a/arch/arm/mm/proc-fa526.S b/arch/arm/mm/proc-fa526.S
index 4c7a571..272558a 100644
--- a/arch/arm/mm/proc-fa526.S
+++ b/arch/arm/mm/proc-fa526.S
@@ -57,6 +57,7 @@ ENTRY(cpu_fa526_proc_fin)
* loc: location to jump to for soft reset
*/
.align 4
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_fa526_reset)
/* TODO: Use CP8 if possible... */
mov ip, #0
@@ -73,6 +74,8 @@ ENTRY(cpu_fa526_reset)
nop
nop
mov pc, r0
+ENDPROC(cpu_fa526_reset)
+ .popsection
/*
* cpu_fa526_do_idle()
diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S
index 8a6c2f7..ba3c500 100644
--- a/arch/arm/mm/proc-feroceon.S
+++ b/arch/arm/mm/proc-feroceon.S
@@ -98,6 +98,7 @@ ENTRY(cpu_feroceon_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_feroceon_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
@@ -110,6 +111,8 @@ ENTRY(cpu_feroceon_reset)
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_feroceon_reset)
+ .popsection
/*
* cpu_feroceon_do_idle()
diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S
index db52b0f..cdfedc5 100644
--- a/arch/arm/mm/proc-mohawk.S
+++ b/arch/arm/mm/proc-mohawk.S
@@ -69,6 +69,7 @@ ENTRY(cpu_mohawk_proc_fin)
* (same as arm926)
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_mohawk_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
@@ -79,6 +80,8 @@ ENTRY(cpu_mohawk_reset)
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_mohawk_reset)
+ .popsection
/*
* cpu_mohawk_do_idle()
diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S
index d50ada2..775d70f 100644
--- a/arch/arm/mm/proc-sa110.S
+++ b/arch/arm/mm/proc-sa110.S
@@ -62,6 +62,7 @@ ENTRY(cpu_sa110_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_sa110_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
@@ -74,6 +75,8 @@ ENTRY(cpu_sa110_reset)
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_sa110_reset)
+ .popsection
/*
* cpu_sa110_do_idle(type)
diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S
index 7d91545..3aa0da1 100644
--- a/arch/arm/mm/proc-sa1100.S
+++ b/arch/arm/mm/proc-sa1100.S
@@ -70,6 +70,7 @@ ENTRY(cpu_sa1100_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_sa1100_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
@@ -82,6 +83,8 @@ ENTRY(cpu_sa1100_reset)
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
+ENDPROC(cpu_sa1100_reset)
+ .popsection
/*
* cpu_sa1100_do_idle(type)
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S
index d061d2f..5900cd5 100644
--- a/arch/arm/mm/proc-v6.S
+++ b/arch/arm/mm/proc-v6.S
@@ -55,6 +55,7 @@ ENTRY(cpu_v6_proc_fin)
* - loc - location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_v6_reset)
mrc p15, 0, r1, c1, c0, 0 @ ctrl register
bic r1, r1, #0x1 @ ...............m
@@ -62,6 +63,8 @@ ENTRY(cpu_v6_reset)
mov r1, #0
mcr p15, 0, r1, c7, c5, 4 @ ISB
mov pc, r0
+ENDPROC(cpu_v6_reset)
+ .popsection
/*
* cpu_v6_do_idle()
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S
index 2c559ac..66a185f 100644
--- a/arch/arm/mm/proc-v7.S
+++ b/arch/arm/mm/proc-v7.S
@@ -63,6 +63,7 @@ ENDPROC(cpu_v7_proc_fin)
* caches disabled.
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_v7_reset)
mrc p15, 0, r1, c1, c0, 0 @ ctrl register
bic r1, r1, #0x1 @ ...............m
@@ -71,6 +72,7 @@ ENTRY(cpu_v7_reset)
isb
mov pc, r0
ENDPROC(cpu_v7_reset)
+ .popsection
/*
* cpu_v7_do_idle()
diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S
index abf0507..b0d5786 100644
--- a/arch/arm/mm/proc-xsc3.S
+++ b/arch/arm/mm/proc-xsc3.S
@@ -105,6 +105,7 @@ ENTRY(cpu_xsc3_proc_fin)
* loc: location to jump to for soft reset
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_xsc3_reset)
mov r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE
msr cpsr_c, r1 @ reset CPSR
@@ -119,6 +120,8 @@ ENTRY(cpu_xsc3_reset)
@ already containing those two last instructions to survive.
mcr p15, 0, ip, c8, c7, 0 @ invalidate I and D TLBs
mov pc, r0
+ENDPROC(cpu_xsc3_reset)
+ .popsection
/*
* cpu_xsc3_do_idle()
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S
index 3277904..4ffebaa 100644
--- a/arch/arm/mm/proc-xscale.S
+++ b/arch/arm/mm/proc-xscale.S
@@ -142,6 +142,7 @@ ENTRY(cpu_xscale_proc_fin)
* Beware PXA270 erratum E7.
*/
.align 5
+ .pushsection .idmap.text, "ax"
ENTRY(cpu_xscale_reset)
mov r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE
msr cpsr_c, r1 @ reset CPSR
@@ -160,6 +161,8 @@ ENTRY(cpu_xscale_reset)
@ already containing those two last instructions to survive.
mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
mov pc, r0
+ENDPROC(cpu_xscale_reset)
+ .popsection
/*
* cpu_xscale_do_idle()
--
1.7.4.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 4/6] ARM: idmap: use idmap_pgd when setting up mm for reboot
2011-11-28 18:28 [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Will Deacon
` (2 preceding siblings ...)
2011-11-28 18:28 ` [PATCH v2 3/6] ARM: proc-*.S: place cpu_reset functions into .idmap.text section Will Deacon
@ 2011-11-28 18:28 ` Will Deacon
2011-11-30 11:31 ` Catalin Marinas
2011-11-28 18:28 ` [PATCH v2 5/6] ARM: head.S: only include __turn_mmu_on in the initial identity mapping Will Deacon
` (2 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Will Deacon @ 2011-11-28 18:28 UTC (permalink / raw)
To: linux-arm-kernel
For soft-rebooting a system, it is necessary to map the MMU-off code
with an identity mapping so that execution can continue safely once the
MMU has been switched off.
Currently, switch_mm_for_reboot takes out a 1:1 mapping from 0x0 to
TASK_SIZE during reboot in the hope that the reset code lives at a
physical address corresponding to a userspace virtual address.
This patch modifies the code so that we switch to the idmap_pgd tables,
which contain a 1:1 mapping of the cpu_reset code. This has the
advantage of only remapping the code that we need and also means we
don't need to worry about allocating a pgd from an atomic context in the
case that the physical address of the cpu_reset code aliases with the
virtual space used by the kernel.
Acked-by: Dave Martin <dave.martin@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
---
arch/arm/mm/idmap.c | 19 ++++++++++---------
1 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/arch/arm/mm/idmap.c b/arch/arm/mm/idmap.c
index cda5ea3..b01760e 100644
--- a/arch/arm/mm/idmap.c
+++ b/arch/arm/mm/idmap.c
@@ -100,17 +100,18 @@ static int __init init_static_idmap(void)
arch_initcall(init_static_idmap);
/*
- * In order to soft-boot, we need to insert a 1:1 mapping in place of
- * the user-mode pages. This will then ensure that we have predictable
- * results when turning the mmu off
+ * In order to soft-boot, we need to switch to a 1:1 mapping for the
+ * cpu_reset functions. This will then ensure that we have predictable
+ * results when turning off the mmu.
*/
void setup_mm_for_reboot(void)
{
- /*
- * We need to access to user-mode page tables here. For kernel threads
- * we don't have any user-mode mappings so we use the context that we
- * "borrowed".
- */
- identity_mapping_add(current->active_mm->pgd, 0, TASK_SIZE);
+ /* Clean and invalidate L1. */
+ flush_cache_all();
+
+ /* Switch to the identity mapping. */
+ cpu_switch_mm(idmap_pgd, &init_mm);
+
+ /* Flush the TLB. */
local_flush_tlb_all();
}
--
1.7.4.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 5/6] ARM: head.S: only include __turn_mmu_on in the initial identity mapping
2011-11-28 18:28 [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Will Deacon
` (3 preceding siblings ...)
2011-11-28 18:28 ` [PATCH v2 4/6] ARM: idmap: use idmap_pgd when setting up mm for reboot Will Deacon
@ 2011-11-28 18:28 ` Will Deacon
2011-11-28 18:28 ` [PATCH v2 6/6] ARM: SMP: use idmap_pgd for mapping MMU enable during secondary booting Will Deacon
2011-11-30 22:18 ` [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Russell King - ARM Linux
6 siblings, 0 replies; 12+ messages in thread
From: Will Deacon @ 2011-11-28 18:28 UTC (permalink / raw)
To: linux-arm-kernel
__create_page_tables identity maps the region of memory from
__enable_mmu to the end of __turn_mmu_on.
In preparation for including __turn_mmu_on in the .idmap.text section,
this patch modifies the identity mapping so that it only includes the
__turn_mmu_on code.
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
---
arch/arm/kernel/head.S | 14 +++++++-------
1 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
index 566c54c..43e3aa3 100644
--- a/arch/arm/kernel/head.S
+++ b/arch/arm/kernel/head.S
@@ -170,11 +170,11 @@ __create_page_tables:
* Create identity mapping to cater for __enable_mmu.
* This identity mapping will be removed by paging_init().
*/
- adr r0, __enable_mmu_loc
+ adr r0, __turn_mmu_on_loc
ldmia r0, {r3, r5, r6}
sub r0, r0, r3 @ virt->phys offset
- add r5, r5, r0 @ phys __enable_mmu
- add r6, r6, r0 @ phys __enable_mmu_end
+ add r5, r5, r0 @ phys __turn_mmu_on
+ add r6, r6, r0 @ phys __turn_mmu_on_end
mov r5, r5, lsr #SECTION_SHIFT
mov r6, r6, lsr #SECTION_SHIFT
@@ -287,10 +287,10 @@ __create_page_tables:
ENDPROC(__create_page_tables)
.ltorg
.align
-__enable_mmu_loc:
+__turn_mmu_on_loc:
.long .
- .long __enable_mmu
- .long __enable_mmu_end
+ .long __turn_mmu_on
+ .long __turn_mmu_on_end
#if defined(CONFIG_SMP)
__CPUINIT
@@ -405,7 +405,7 @@ __turn_mmu_on:
mov r3, r3
mov r3, r13
mov pc, r3
-__enable_mmu_end:
+__turn_mmu_on_end:
ENDPROC(__turn_mmu_on)
--
1.7.4.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 6/6] ARM: SMP: use idmap_pgd for mapping MMU enable during secondary booting
2011-11-28 18:28 [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Will Deacon
` (4 preceding siblings ...)
2011-11-28 18:28 ` [PATCH v2 5/6] ARM: head.S: only include __turn_mmu_on in the initial identity mapping Will Deacon
@ 2011-11-28 18:28 ` Will Deacon
2011-11-30 22:18 ` [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Russell King - ARM Linux
6 siblings, 0 replies; 12+ messages in thread
From: Will Deacon @ 2011-11-28 18:28 UTC (permalink / raw)
To: linux-arm-kernel
The ARM SMP booting code allocates a temporary set of page tables
containing an identity mapping of the kernel image and provides this
to secondary CPUs for initial booting.
In reality, we only need to include the __turn_mmu_on function in the
identity mapping since the rest of the kernel is executing from virtual
addresses after this point.
This patch adds __turn_mmu_on to the .idmap.text section, allowing the
SMP booting code to use the idmap_pgd directly and not have to populate
its own set of page table.
As a result of this patch, we can make the identity_mapping_add function
static (since it is only used within mm/idmap.c) and also remove the
identity_mapping_del function. The identity map population is moved to
an early initcall so that it is setup in time for secondary CPU bringup.
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
---
arch/arm/include/asm/idmap.h | 3 ---
arch/arm/kernel/head.S | 4 +++-
arch/arm/kernel/smp.c | 31 +------------------------------
arch/arm/mm/idmap.c | 34 ++--------------------------------
4 files changed, 6 insertions(+), 66 deletions(-)
diff --git a/arch/arm/include/asm/idmap.h b/arch/arm/include/asm/idmap.h
index 62e3d19..bf863ed 100644
--- a/arch/arm/include/asm/idmap.h
+++ b/arch/arm/include/asm/idmap.h
@@ -9,9 +9,6 @@
extern pgd_t *idmap_pgd;
-void identity_mapping_add(pgd_t *, unsigned long, unsigned long);
-void identity_mapping_del(pgd_t *, unsigned long, unsigned long);
-
void setup_mm_for_reboot(void);
#endif /* __ASM_IDMAP_H */
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
index 43e3aa3..64e9943 100644
--- a/arch/arm/kernel/head.S
+++ b/arch/arm/kernel/head.S
@@ -398,7 +398,8 @@ ENDPROC(__enable_mmu)
* other registers depend on the function called upon completion
*/
.align 5
-__turn_mmu_on:
+ .pushsection .idmap.text, "ax"
+ENTRY(__turn_mmu_on)
mov r0, r0
mcr p15, 0, r0, c1, c0, 0 @ write control reg
mrc p15, 0, r3, c0, c0, 0 @ read id reg
@@ -407,6 +408,7 @@ __turn_mmu_on:
mov pc, r3
__turn_mmu_on_end:
ENDPROC(__turn_mmu_on)
+ .popsection
#ifdef CONFIG_SMP_ON_UP
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index 8afadda..76ff28d 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -62,7 +62,6 @@ int __cpuinit __cpu_up(unsigned int cpu)
{
struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu);
struct task_struct *idle = ci->idle;
- pgd_t *pgd;
int ret;
/*
@@ -85,29 +84,11 @@ int __cpuinit __cpu_up(unsigned int cpu)
}
/*
- * Allocate initial page tables to allow the new CPU to
- * enable the MMU safely. This essentially means a set
- * of our "standard" page tables, with the addition of
- * a 1:1 mapping for the physical address of the kernel.
- */
- pgd = pgd_alloc(&init_mm);
- if (!pgd)
- return -ENOMEM;
-
- if (PHYS_OFFSET != PAGE_OFFSET) {
-#ifndef CONFIG_HOTPLUG_CPU
- identity_mapping_add(pgd, __pa(__init_begin), __pa(__init_end));
-#endif
- identity_mapping_add(pgd, __pa(_stext), __pa(_etext));
- identity_mapping_add(pgd, __pa(_sdata), __pa(_edata));
- }
-
- /*
* We need to tell the secondary core where to find
* its stack and the page tables.
*/
secondary_data.stack = task_stack_page(idle) + THREAD_START_SP;
- secondary_data.pgdir = virt_to_phys(pgd);
+ secondary_data.pgdir = virt_to_phys(idmap_pgd);
secondary_data.swapper_pg_dir = virt_to_phys(swapper_pg_dir);
__cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data));
outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1));
@@ -143,16 +124,6 @@ int __cpuinit __cpu_up(unsigned int cpu)
secondary_data.stack = NULL;
secondary_data.pgdir = 0;
- if (PHYS_OFFSET != PAGE_OFFSET) {
-#ifndef CONFIG_HOTPLUG_CPU
- identity_mapping_del(pgd, __pa(__init_begin), __pa(__init_end));
-#endif
- identity_mapping_del(pgd, __pa(_stext), __pa(_etext));
- identity_mapping_del(pgd, __pa(_sdata), __pa(_edata));
- }
-
- pgd_free(&init_mm, pgd);
-
return ret;
}
diff --git a/arch/arm/mm/idmap.c b/arch/arm/mm/idmap.c
index b01760e..660f1bc 100644
--- a/arch/arm/mm/idmap.c
+++ b/arch/arm/mm/idmap.c
@@ -32,7 +32,7 @@ static void idmap_add_pud(pgd_t *pgd, unsigned long addr, unsigned long end,
} while (pud++, addr = next, addr != end);
}
-void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long end)
+static void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long end)
{
unsigned long prot, next;
@@ -47,36 +47,6 @@ void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long end)
} while (pgd++, addr = next, addr != end);
}
-#ifdef CONFIG_SMP
-static void idmap_del_pmd(pud_t *pud, unsigned long addr, unsigned long end)
-{
- pmd_t *pmd = pmd_offset(pud, addr);
- pmd_clear(pmd);
-}
-
-static void idmap_del_pud(pgd_t *pgd, unsigned long addr, unsigned long end)
-{
- pud_t *pud = pud_offset(pgd, addr);
- unsigned long next;
-
- do {
- next = pud_addr_end(addr, end);
- idmap_del_pmd(pud, addr, next);
- } while (pud++, addr = next, addr != end);
-}
-
-void identity_mapping_del(pgd_t *pgd, unsigned long addr, unsigned long end)
-{
- unsigned long next;
-
- pgd += pgd_index(addr);
- do {
- next = pgd_addr_end(addr, end);
- idmap_del_pud(pgd, addr, next);
- } while (pgd++, addr = next, addr != end);
-}
-#endif
-
extern char __idmap_text_start[], __idmap_text_end[];
static int __init init_static_idmap(void)
@@ -97,7 +67,7 @@ static int __init init_static_idmap(void)
return 0;
}
-arch_initcall(init_static_idmap);
+early_initcall(init_static_idmap);
/*
* In order to soft-boot, we need to switch to a 1:1 mapping for the
--
1.7.4.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 1/6] ARM: idmap: populate identity map pgd at init time using .init.text
2011-11-28 18:28 ` [PATCH v2 1/6] ARM: idmap: populate identity map pgd at init time using .init.text Will Deacon
@ 2011-11-30 11:29 ` Catalin Marinas
0 siblings, 0 replies; 12+ messages in thread
From: Catalin Marinas @ 2011-11-30 11:29 UTC (permalink / raw)
To: linux-arm-kernel
On 28 November 2011 18:28, Will Deacon <will.deacon@arm.com> wrote:
> When disabling and re-enabling the MMU, it is necessary to take out an
> identity mapping for the code that manipulates the SCTLR in order to
> avoid it disappearing from under our feet. This is useful when soft
> rebooting and returning from CPU suspend.
>
> This patch allocates a set of page tables during boot and populates them
> with an identity mapping for the .idmap.text section. This means that
> users of the identity map do not need to manage their own pgd and can
> instead annotate their functions with __idmap or, in the case of assembly
> code, place them in the correct section.
>
> Acked-by: Dave Martin <dave.martin@linaro.org>
> Tested-by: Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
--
Catalin
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 4/6] ARM: idmap: use idmap_pgd when setting up mm for reboot
2011-11-28 18:28 ` [PATCH v2 4/6] ARM: idmap: use idmap_pgd when setting up mm for reboot Will Deacon
@ 2011-11-30 11:31 ` Catalin Marinas
2011-11-30 14:37 ` Will Deacon
0 siblings, 1 reply; 12+ messages in thread
From: Catalin Marinas @ 2011-11-30 11:31 UTC (permalink / raw)
To: linux-arm-kernel
On 28 November 2011 18:28, Will Deacon <will.deacon@arm.com> wrote:
> For soft-rebooting a system, it is necessary to map the MMU-off code
> with an identity mapping so that execution can continue safely once the
> MMU has been switched off.
>
> Currently, switch_mm_for_reboot takes out a 1:1 mapping from 0x0 to
> TASK_SIZE during reboot in the hope that the reset code lives at a
> physical address corresponding to a userspace virtual address.
>
> This patch modifies the code so that we switch to the idmap_pgd tables,
> which contain a 1:1 mapping of the cpu_reset code. This has the
> advantage of only remapping the code that we need and also means we
> don't need to worry about allocating a pgd from an atomic context in the
> case that the physical address of the cpu_reset code aliases with the
> virtual space used by the kernel.
>
> Acked-by: Dave Martin <dave.martin@linaro.org>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
--
Catalin
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 4/6] ARM: idmap: use idmap_pgd when setting up mm for reboot
2011-11-30 11:31 ` Catalin Marinas
@ 2011-11-30 14:37 ` Will Deacon
0 siblings, 0 replies; 12+ messages in thread
From: Will Deacon @ 2011-11-30 14:37 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Nov 30, 2011 at 11:31:13AM +0000, Catalin Marinas wrote:
> On 28 November 2011 18:28, Will Deacon <will.deacon@arm.com> wrote:
> > For soft-rebooting a system, it is necessary to map the MMU-off code
> > with an identity mapping so that execution can continue safely once the
> > MMU has been switched off.
> >
> > Currently, switch_mm_for_reboot takes out a 1:1 mapping from 0x0 to
> > TASK_SIZE during reboot in the hope that the reset code lives at a
> > physical address corresponding to a userspace virtual address.
> >
> > This patch modifies the code so that we switch to the idmap_pgd tables,
> > which contain a 1:1 mapping of the cpu_reset code. This has the
> > advantage of only remapping the code that we need and also means we
> > don't need to worry about allocating a pgd from an atomic context in the
> > case that the physical address of the cpu_reset code aliases with the
> > virtual space used by the kernel.
> >
> > Acked-by: Dave Martin <dave.martin@linaro.org>
> > Signed-off-by: Will Deacon <will.deacon@arm.com>
>
> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Thanks Catalin.
Russell - could you have a quick look at these please as the changes to
setup_mm_for_reboot are required for the LPAE stuff?
Cheers,
Will
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 0/6] Consolidate identity mapping code in idmap.c
2011-11-28 18:28 [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Will Deacon
` (5 preceding siblings ...)
2011-11-28 18:28 ` [PATCH v2 6/6] ARM: SMP: use idmap_pgd for mapping MMU enable during secondary booting Will Deacon
@ 2011-11-30 22:18 ` Russell King - ARM Linux
2011-12-01 13:26 ` Will Deacon
6 siblings, 1 reply; 12+ messages in thread
From: Russell King - ARM Linux @ 2011-11-30 22:18 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Nov 28, 2011 at 06:28:51PM +0000, Will Deacon wrote:
> Hello,
>
> This is version 2 of the patch series originally posted here:
>
> http://lists.infradead.org/pipermail/linux-arm-kernel/2011-November/073033.html
>
> Changes from v1 include:
> * Updated following Catalin's comments
> * Rebased onto rmk/devel-stable
> * Includes update to SMP booting so that the idmap_pgd can be
> used there too
>
> This is a pre-requisite for my kexec patches, which I will post separately.
>
> All feedback welcome.
This patch set looks fine.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 0/6] Consolidate identity mapping code in idmap.c
2011-11-30 22:18 ` [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Russell King - ARM Linux
@ 2011-12-01 13:26 ` Will Deacon
0 siblings, 0 replies; 12+ messages in thread
From: Will Deacon @ 2011-12-01 13:26 UTC (permalink / raw)
To: linux-arm-kernel
Hi Russell,
On Wed, Nov 30, 2011 at 10:18:00PM +0000, Russell King - ARM Linux wrote:
> On Mon, Nov 28, 2011 at 06:28:51PM +0000, Will Deacon wrote:
> > This is version 2 of the patch series originally posted here:
> >
> > http://lists.infradead.org/pipermail/linux-arm-kernel/2011-November/073033.html
> >
> > Changes from v1 include:
> > * Updated following Catalin's comments
> > * Rebased onto rmk/devel-stable
> > * Includes update to SMP booting so that the idmap_pgd can be
> > used there too
> >
> > This is a pre-requisite for my kexec patches, which I will post separately.
> >
> > All feedback welcome.
>
> This patch set looks fine.
Great, thanks for looking at it. Here's the pull request against
devel-stable. I can use another commit as a base if you prefer.
Once you've taken this, I'll post another series of my soft reboot patch
series to the list (not required for LPAE but I think it could be merged for
3.3 since it fixes soft reboot along with the reset changes you've made).
Cheers,
Will
The following changes since commit 2d13ccaa8797d7e599f3792aed4b1e44b47f94a5:
Merge branch 'irqchip-consolidation' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into devel-stable (2011-11-21 21:56:56 +0000)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/will/linux.git kexec/idmap
Will Deacon (6):
ARM: idmap: populate identity map pgd at init time using .init.text
ARM: suspend: use idmap_pgd instead of suspend_pgd
ARM: proc-*.S: place cpu_reset functions into .idmap.text section
ARM: idmap: use idmap_pgd when setting up mm for reboot
ARM: head.S: only include __turn_mmu_on in the initial identity mapping
ARM: SMP: use idmap_pgd for mapping MMU enable during secondary booting
arch/arm/include/asm/idmap.h | 14 +++++++++
arch/arm/include/asm/pgtable.h | 3 --
arch/arm/kernel/head.S | 18 ++++++-----
arch/arm/kernel/sleep.S | 2 +
arch/arm/kernel/smp.c | 32 +-------------------
arch/arm/kernel/suspend.c | 18 ++---------
arch/arm/kernel/vmlinux.lds.S | 7 ++++
arch/arm/mm/idmap.c | 63 +++++++++++++++++++---------------------
arch/arm/mm/proc-arm1020.S | 3 ++
arch/arm/mm/proc-arm1020e.S | 3 ++
arch/arm/mm/proc-arm1022.S | 3 ++
arch/arm/mm/proc-arm1026.S | 3 ++
arch/arm/mm/proc-arm6_7.S | 4 ++
arch/arm/mm/proc-arm720.S | 3 ++
arch/arm/mm/proc-arm740.S | 3 ++
arch/arm/mm/proc-arm7tdmi.S | 3 ++
arch/arm/mm/proc-arm920.S | 3 ++
arch/arm/mm/proc-arm922.S | 3 ++
arch/arm/mm/proc-arm925.S | 3 ++
arch/arm/mm/proc-arm926.S | 3 ++
arch/arm/mm/proc-arm940.S | 3 ++
arch/arm/mm/proc-arm946.S | 3 ++
arch/arm/mm/proc-arm9tdmi.S | 3 ++
arch/arm/mm/proc-fa526.S | 3 ++
arch/arm/mm/proc-feroceon.S | 3 ++
arch/arm/mm/proc-mohawk.S | 3 ++
arch/arm/mm/proc-sa110.S | 3 ++
arch/arm/mm/proc-sa1100.S | 3 ++
arch/arm/mm/proc-v6.S | 3 ++
arch/arm/mm/proc-v7.S | 2 +
arch/arm/mm/proc-xsc3.S | 3 ++
arch/arm/mm/proc-xscale.S | 3 ++
32 files changed, 140 insertions(+), 89 deletions(-)
create mode 100644 arch/arm/include/asm/idmap.h
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2011-12-01 13:26 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-28 18:28 [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Will Deacon
2011-11-28 18:28 ` [PATCH v2 1/6] ARM: idmap: populate identity map pgd at init time using .init.text Will Deacon
2011-11-30 11:29 ` Catalin Marinas
2011-11-28 18:28 ` [PATCH v2 2/6] ARM: suspend: use idmap_pgd instead of suspend_pgd Will Deacon
2011-11-28 18:28 ` [PATCH v2 3/6] ARM: proc-*.S: place cpu_reset functions into .idmap.text section Will Deacon
2011-11-28 18:28 ` [PATCH v2 4/6] ARM: idmap: use idmap_pgd when setting up mm for reboot Will Deacon
2011-11-30 11:31 ` Catalin Marinas
2011-11-30 14:37 ` Will Deacon
2011-11-28 18:28 ` [PATCH v2 5/6] ARM: head.S: only include __turn_mmu_on in the initial identity mapping Will Deacon
2011-11-28 18:28 ` [PATCH v2 6/6] ARM: SMP: use idmap_pgd for mapping MMU enable during secondary booting Will Deacon
2011-11-30 22:18 ` [PATCH v2 0/6] Consolidate identity mapping code in idmap.c Russell King - ARM Linux
2011-12-01 13:26 ` Will Deacon
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).