|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN v4 2/2] xen/arm32: head Split and move MMU-specific head.S to mmu/head.S
Hi Ayan,
On 17/11/2023 16:31, Ayan Kumar Halder wrote:
> The MMU specific code in head.S will not be used on MPU systems.
> Instead of introducing more #ifdefs which will bring complexity
> to the code, move MMU related code to mmu/head.S and keep common
> code in head.S. Two notes while moving:
> - As "fail" in original head.S is very simple and this name is too
> easy to be conflicted, duplicate it in mmu/head.S instead of
> exporting it.
> - Realigned ".macro ret" so that the alignment matches to the other
> macros.
> - Rename puts to asm_puts, putn to asm_putn (this denotes that the
> macros are used within the context of assembly only).
> - Use ENTRY() for enable_secondary_cpu_mm, enable_boot_cpu_mm,
> setup_fixmap, asm_puts, asm_putn as they will be used externally.
>
> Also move the assembly macros shared by head.S and mmu/head.S to
> macros.h.
>
> This is based on 6734327d76be ("xen/arm64: Split and move MMU-specific head.S
> to mmu/head.S").
>
> Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@xxxxxxx>
Reviewed-by: Michal Orzel <michal.orzel@xxxxxxx>
with a few remarks...
> ---
>
> Changes from v1 :-
>
> 1. Added a commit message
> 2. Moved load_paddr to mmu/head.S
>
> v2 :-
>
> 1. Renamed puts to asm_puts and putn to asm_putn. Exported asm_putn().
> 2. Moved XEN_TEMPORARY_OFFSET to head.S.
> 3. Some style issues.
>
> v3 :-
>
> 1. Updated the comments on top of asm_puts() and asm_putn().
> 2. Removed some stubs.
> 3. PRINT() invokes asm_puts.
>
> xen/arch/arm/arm32/head.S | 630 +-----------------------
> xen/arch/arm/arm32/mmu/Makefile | 1 +
> xen/arch/arm/arm32/mmu/head.S | 573 +++++++++++++++++++++
> xen/arch/arm/include/asm/arm32/macros.h | 58 ++-
> 4 files changed, 638 insertions(+), 624 deletions(-)
> create mode 100644 xen/arch/arm/arm32/mmu/head.S
>
[...]
>
> @@ -947,8 +335,6 @@ RODATA_STR(hex, "0123456789abcdef")
>
> ENTRY(early_puts)
> init_uart:
> -puts:
> -putn: mov pc, lr
You removed putn, puts and even the return. Looking at the codebase, early_puts
global makes no sense
and init_uart is only used within #ifdef. So I would expect the entire block to
be removed.
>
> #endif /* !CONFIG_EARLY_PRINTK */
>
> diff --git a/xen/arch/arm/arm32/mmu/Makefile b/xen/arch/arm/arm32/mmu/Makefile
> index b18cec4836..a8a750a3d0 100644
> --- a/xen/arch/arm/arm32/mmu/Makefile
> +++ b/xen/arch/arm/arm32/mmu/Makefile
> @@ -1 +1,2 @@
> +obj-y += head.o
> obj-y += mm.o
> diff --git a/xen/arch/arm/arm32/mmu/head.S b/xen/arch/arm/arm32/mmu/head.S
> new file mode 100644
> index 0000000000..6d427328f3
> --- /dev/null
> +++ b/xen/arch/arm/arm32/mmu/head.S
> @@ -0,0 +1,573 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * xen/arch/arm/arm32/mmu/head.S
> + *
> + * Arm32 MMU specific start-of-day code.
> + */
> +
> +#include <asm/page.h>
> +#include <asm/early_printk.h>
> +
> +#define PT_PT 0xf7f /* nG=1 AF=1 SH=11 AP=01 NS=1 ATTR=111 T=1 P=1 */
> +#define PT_MEM 0xf7d /* nG=1 AF=1 SH=11 AP=01 NS=1 ATTR=111 T=0 P=1 */
> +#define PT_MEM_L3 0xf7f /* nG=1 AF=1 SH=11 AP=01 NS=1 ATTR=111 T=1 P=1 */
> +#define PT_DEV 0xe71 /* nG=1 AF=1 SH=10 AP=01 NS=1 ATTR=100 T=0 P=1 */
> +#define PT_DEV_L3 0xe73 /* nG=1 AF=1 SH=10 AP=01 NS=1 ATTR=100 T=1 P=1 */
> +
> +#define PT_UPPER(x) (PT_##x & 0xf00)
> +#define PT_LOWER(x) (PT_##x & 0x0ff)
> +
> +/* Convenience defines to get slot used by Xen mapping. */
> +#define XEN_FIRST_SLOT first_table_offset(XEN_VIRT_START)
> +#define XEN_SECOND_SLOT second_table_offset(XEN_VIRT_START)
> +
> +/* Offset between the early boot xen mapping and the runtime xen mapping */
> +#define XEN_TEMPORARY_OFFSET (TEMPORARY_XEN_VIRT_START - XEN_VIRT_START)
> +
> +.macro load_paddr rb, sym
> + mov_w \rb, \sym
> + add \rb, \rb, r10
> +.endm
> +
> +/*
> + * Flush local TLBs
> + *
> + * @tmp: Scratch register
> + *
> + * See asm/arm32/flushtlb.h for the explanation of the sequence.
> + */
> +.macro flush_xen_tlb_local tmp
> + dsb nshst
> + mcr CP32(\tmp, TLBIALLH)
> + dsb nsh
> + isb
> +.endm
> +
> +/*
> + * Enforce Xen page-tables do not contain mapping that are both
> + * Writable and eXecutables.
> + *
> + * This should be called on each secondary CPU.
> + */
> +.macro pt_enforce_wxn tmp
> + mrc CP32(\tmp, HSCTLR)
> + orr \tmp, \tmp, #SCTLR_Axx_ELx_WXN
> + dsb
> + mcr CP32(\tmp, HSCTLR)
> + /*
> + * The TLBs may cache SCTLR_EL2.WXN. So ensure it is synchronized
> + * before flushing the TLBs.
> + */
> + isb
> + flush_xen_tlb_local \tmp
> +.endm
> +
> +/* Macro to find the slot number at a given page-table level
> + *
> + * slot: slot computed
> + * virt: virtual address
> + * lvl: page-table level
> + *
> + * Note that ubxf is unpredictable when the end bit is above 32-bit. So we
> + * can't use it for first level offset.
> + */
> +.macro get_table_slot, slot, virt, lvl
> + .if \lvl == 1
> + lsr \slot, \virt, #XEN_PT_LEVEL_SHIFT(\lvl)
> + .else
> + ubfx \slot, \virt, #XEN_PT_LEVEL_SHIFT(\lvl), #XEN_PT_LPAE_SHIFT
> + .endif
> +.endm
> +
> +/*
> + * Macro to create a page table entry in \ptbl to \tbl (physical
> + * address)
> + *
> + * ptbl: table symbol where the entry will be created
> + * tbl: physical address of the table to point to
> + * virt: virtual address
> + * lvl: page-table level
> + *
> + * Preserves \virt
> + * Clobbers \tbl, r1 - r3
> + *
> + * Note that \tbl and \virt should be in a register other than r1 - r3
> + */
> +.macro create_table_entry_from_paddr, ptbl, tbl, virt, lvl
> + get_table_slot r1, \virt, \lvl /* r1 := slot in \tbl */
> + lsl r1, r1, #3 /* r1 := slot offset in \tbl */
> +
> + movw r2, #PT_PT /* r2:r3 := right for linear PT */
> + orr r2, r2, \tbl /* + \tbl paddr */
> + mov r3, #0
> +
> + adr_l \tbl, \ptbl /* \tbl := (v,p)addr of \ptbl */
> +
> + strd r2, r3, [\tbl, r1]
> +.endm
> +
> +
NIT: too many blank lines
[...]
> diff --git a/xen/arch/arm/include/asm/arm32/macros.h
> b/xen/arch/arm/include/asm/arm32/macros.h
> index a4e20aa520..c41861efbe 100644
> --- a/xen/arch/arm/include/asm/arm32/macros.h
> +++ b/xen/arch/arm/include/asm/arm32/macros.h
> @@ -1,8 +1,62 @@
> #ifndef __ASM_ARM_ARM32_MACROS_H
> #define __ASM_ARM_ARM32_MACROS_H
>
> - .macro ret
> +.macro ret
> mov pc, lr
> - .endm
> +.endm
>
> +/*
> + * Move an immediate constant into a 32-bit register using movw/movt
> + * instructions.
> + */
> +.macro mov_w reg, word
> + movw \reg, #:lower16:\word
> + movt \reg, #:upper16:\word
> +.endm
> +
> +/*
> + * Pseudo-op for PC relative adr <reg>, <symbol> where <symbol> is
> + * within the range +/- 4GB of the PC.
> + *
> + * @dst: destination register
> + * @sym: name of the symbol
> + */
> +.macro adr_l, dst, sym
> + mov_w \dst, \sym - .Lpc\@
> + .set .Lpc\@, .+ 8 /* PC bias */
> + add \dst, \dst, pc
> +.endm
> +
> +#ifdef CONFIG_EARLY_PRINTK
> +/*
> + * Macro to print a string to the UART, if there is one.
> + *
> + * Clobbers r0 - r3
> + */
> +#define PRINT(_s) \
> + mov r3, lr ;\
> + adr_l r0, 98f ;\
> + bl asm_puts ;\
> + mov lr, r3 ;\
> + RODATA_STR(98, _s)
> +
> +/*
> + * Macro to print the value of register \rb
> + *
> + * Clobbers r0 - r4
> + */
> +.macro print_reg rb
> + mov r0, \rb
> + mov r4, lr
> + bl asm_putn
> + mov lr, r4
> +.endm
> +
> +#else /* CONFIG_EARLY_PRINTK */
> +#define PRINT(s)
> +
> +.macro print_reg rb
> +.endm
> +
> +#endif /* !CONFIG_EARLY_PRINTK */
please add one blank line here to separate #endif's
> #endif /* __ASM_ARM_ARM32_MACROS_H */
~Michal
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |