From: mark.rutland@arm.com (Mark Rutland)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 2/7] arm64: vmlinux.ld: Add .mmuoff.{text,data} sections
Date: Tue, 28 Jun 2016 18:16:10 +0100 [thread overview]
Message-ID: <20160628171610.GT31744@leverpostej> (raw)
In-Reply-To: <1467125510-18758-3-git-send-email-james.morse@arm.com>
Hi James,
This looks mostly fine.
On Tue, Jun 28, 2016 at 03:51:45PM +0100, James Morse wrote:
> Resume from hibernate needs to clean any text executed by the kernel with
> the MMU off to the PoC. Collect these functions together into a new
> .mmuoff.text section. __boot_cpu_mode and secondary_holding_pen_release
> are data that is read or written with the MMU off. Add these to a new
> .mmuoff.data section.
>
> This covers booting of secondary cores and the cpu_suspend() path used
> by cpu-idle and suspend-to-ram.
>
> The bulk of head.S is not included, as the primary boot code is only ever
> executed once, the kernel never needs to ensure it is cleaned to a
> particular point in the cache.
>
> Signed-off-by: James Morse <james.morse@arm.com>
> ---
> Changes since v2:
> * mmuoff.data section added
> * secondary_holding_pen_release initialisation moved to head.S
> * secondary_holding_pen and set_cpu_boot_mode_flag moved into mmuoff.text
>
> arch/arm64/include/asm/sections.h | 2 ++
> arch/arm64/kernel/head.S | 10 +++++++++-
> arch/arm64/kernel/sleep.S | 2 ++
> arch/arm64/kernel/smp_spin_table.c | 2 +-
> arch/arm64/kernel/vmlinux.lds.S | 8 ++++++++
> arch/arm64/mm/proc.S | 4 ++++
> 6 files changed, 26 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/include/asm/sections.h b/arch/arm64/include/asm/sections.h
> index cb68eb348566..7eecfa110330 100644
> --- a/arch/arm64/include/asm/sections.h
> +++ b/arch/arm64/include/asm/sections.h
> @@ -24,5 +24,7 @@ extern char __hibernate_exit_text_start[], __hibernate_exit_text_end[];
> extern char __hyp_idmap_text_start[], __hyp_idmap_text_end[];
> extern char __hyp_text_start[], __hyp_text_end[];
> extern char __idmap_text_start[], __idmap_text_end[];
> +extern char __mmuoff_text_start[], __mmuoff_text_end[];
> +extern char __mmuoff_data_start[], __mmuoff_data_end[];
>
> #endif /* __ASM_SECTIONS_H */
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index 2c6e598a94dc..6e56cd136d27 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -52,6 +52,9 @@
> #error TEXT_OFFSET must be less than 2MB
> #endif
>
> +/* INVALID_HWID is defined as ULONG_MAX, but we can't include linux/kernel.h */
> +#define ULONG_MAX ~0
We could avoid the duplication and simplify the change using __section()
in smp_spin_table.c, e.g.
volatile unsigned long __section(".mmuoff.data)
secondary_holding_pen_release = INVALID_HWID
> +
> /*
> * Kernel startup entry point.
> * ---------------------------
> @@ -477,6 +480,7 @@ ENTRY(kimage_vaddr)
> * Returns either BOOT_CPU_MODE_EL1 or BOOT_CPU_MODE_EL2 in x20 if
> * booted in EL1 or EL2 respectively.
> */
> + .pushsection ".mmuoff.text", "ax"
> ENTRY(el2_setup)
> mrs x0, CurrentEL
> cmp x0, #CurrentEL_EL2
> @@ -627,11 +631,14 @@ ENDPROC(set_cpu_boot_mode_flag)
> * This is not in .bss, because we set it sufficiently early that the boot-time
> * zeroing of .bss would clobber it.
> */
> - .pushsection .data..cacheline_aligned
> + .pushsection ".mmuoff.data", "aw"
> .align L1_CACHE_SHIFT
> ENTRY(__boot_cpu_mode)
> .long BOOT_CPU_MODE_EL2
> .long BOOT_CPU_MODE_EL1
We might need to pad things in .mmuoff.data to the CWG.
__boot_cpu_mode is written with the MMU off, and read with the MMU on,
while secondary_holding_pen_release is written with the MMU on and read
with the MMU off.
Maintenance for either could corrupt one or the other, if they fall in
the same CWG.
Other than that, this looks good to me.
Thanks,
Mark.
next prev parent reply other threads:[~2016-06-28 17:16 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-28 14:51 [PATCH v3 0/7] arm64: hibernate: Support DEBUG_PAGEALLOC and hibernate on non-boot cpu James Morse
2016-06-28 14:51 ` [PATCH v3 1/7] arm64: Create sections.h James Morse
2016-06-28 14:51 ` [PATCH v3 2/7] arm64: vmlinux.ld: Add .mmuoff.{text,data} sections James Morse
2016-06-28 17:16 ` Mark Rutland [this message]
2016-06-28 14:51 ` [PATCH v3 3/7] arm64: hibernate: Support DEBUG_PAGEALLOC James Morse
2016-06-28 14:51 ` [PATCH v3 4/7] arm64: hibernate: Detect hibernate image created on non-boot CPU James Morse
2016-06-28 14:51 ` [PATCH v3 5/7] PM / Hibernate: Allow arch code to influence CPU hotplug during hibernate James Morse
2016-06-29 0:10 ` Rafael J. Wysocki
2016-06-29 10:02 ` Chen Yu
2016-07-04 9:04 ` James Morse
2016-07-04 12:04 ` Rafael J. Wysocki
2016-06-28 14:51 ` [PATCH v3 6/7] arm64: hibernate: Resume on the CPU that created the hibernate image James Morse
2016-07-05 14:55 ` Lorenzo Pieralisi
2016-07-07 16:58 ` James Morse
2016-07-08 10:57 ` Lorenzo Pieralisi
2016-06-28 14:51 ` [PATCH v3 7/7] Revert "arm64: hibernate: Refuse to hibernate if the boot cpu is offline" James Morse
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=20160628171610.GT31744@leverpostej \
--to=mark.rutland@arm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox