linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Palmer Dabbelt <palmer@dabbelt.com>
To: vitaly.wool@konsulko.com
Cc: linux-riscv@lists.infradead.org, alex@ghiti.fr,
	jszhang@kernel.org, linux-mm@kvack.org, nico@fluxnic.net,
	vitaly.wool@konsulko.com
Subject: Re: [PATCH] riscv: remove .text section size limitation for XIP
Date: Tue, 26 Oct 2021 15:46:12 -0700 (PDT)	[thread overview]
Message-ID: <mhng-9c793de5-4223-4833-b244-4dd2636b2dd5@palmerdabbelt-glaptop> (raw)
In-Reply-To: <20211011091414.1998846-1-vitaly.wool@konsulko.com>

On Mon, 11 Oct 2021 02:14:14 PDT (-0700), vitaly.wool@konsulko.com wrote:
> Currently there's a limit of 8MB for the .text section of a RISC-V
> image in the XIP case. This breaks compilation of many automatic
> builds and is generally inconvenient. This patch removes that
> limitation and optimizes XIP image file size at the same time.
>
> Signed-off-by: Vitaly Wool <vitaly.wool@konsulko.com>
> ---
>  arch/riscv/include/asm/pgtable.h    |  6 ++++--
>  arch/riscv/kernel/head.S            | 12 ++++++++++++
>  arch/riscv/kernel/vmlinux-xip.lds.S | 10 +++++++---
>  arch/riscv/mm/init.c                |  7 +++----
>  4 files changed, 26 insertions(+), 9 deletions(-)
>
> diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h
> index 39b550310ec6..bf204e7c1f74 100644
> --- a/arch/riscv/include/asm/pgtable.h
> +++ b/arch/riscv/include/asm/pgtable.h
> @@ -75,7 +75,8 @@
>  #endif
>
>  #ifdef CONFIG_XIP_KERNEL
> -#define XIP_OFFSET		SZ_8M
> +#define XIP_OFFSET		SZ_32M
> +#define XIP_OFFSET_MASK		(SZ_32M - 1)
>  #else
>  #define XIP_OFFSET		0
>  #endif
> @@ -97,7 +98,8 @@
>  #ifdef CONFIG_XIP_KERNEL
>  #define XIP_FIXUP(addr) ({							\
>  	uintptr_t __a = (uintptr_t)(addr);					\
> -	(__a >= CONFIG_XIP_PHYS_ADDR && __a < CONFIG_XIP_PHYS_ADDR + SZ_16M) ?	\
> +	(__a >= CONFIG_XIP_PHYS_ADDR && \
> +	 __a < CONFIG_XIP_PHYS_ADDR + XIP_OFFSET * 2) ?	\
>  		__a - CONFIG_XIP_PHYS_ADDR + CONFIG_PHYS_RAM_BASE - XIP_OFFSET :\
>  		__a;								\
>  	})
> diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S
> index fce5184b22c3..ed316d02cd7e 100644
> --- a/arch/riscv/kernel/head.S
> +++ b/arch/riscv/kernel/head.S
> @@ -20,10 +20,20 @@
>  	REG_L t0, _xip_fixup
>  	add \reg, \reg, t0
>  .endm
> +.macro XIP_FIXUP_FLASH_OFFSET reg
> +	la t1, __data_loc
> +	li t0, XIP_OFFSET_MASK
> +	and t1, t1, t0
> +	li t1, XIP_OFFSET
> +	sub t0, t0, t1
> +	sub \reg, \reg, t0
> +.endm
>  _xip_fixup: .dword CONFIG_PHYS_RAM_BASE - CONFIG_XIP_PHYS_ADDR - XIP_OFFSET
>  #else
>  .macro XIP_FIXUP_OFFSET reg
>  .endm
> +.macro XIP_FIXUP_FLASH_OFFSET reg
> +.endm
>  #endif /* CONFIG_XIP_KERNEL */
>
>  __HEAD
> @@ -266,6 +276,7 @@ pmp_done:
>  	la a3, hart_lottery
>  	mv a2, a3
>  	XIP_FIXUP_OFFSET a2
> +	XIP_FIXUP_FLASH_OFFSET a3
>  	lw t1, (a3)
>  	amoswap.w t0, t1, (a2)
>  	/* first time here if hart_lottery in RAM is not set */
> @@ -304,6 +315,7 @@ clear_bss_done:
>  	XIP_FIXUP_OFFSET sp
>  #ifdef CONFIG_BUILTIN_DTB
>  	la a0, __dtb_start
> +	XIP_FIXUP_OFFSET a0
>  #else
>  	mv a0, s1
>  #endif /* CONFIG_BUILTIN_DTB */
> diff --git a/arch/riscv/kernel/vmlinux-xip.lds.S b/arch/riscv/kernel/vmlinux-xip.lds.S
> index 9c9f35091ef0..f5ed08262139 100644
> --- a/arch/riscv/kernel/vmlinux-xip.lds.S
> +++ b/arch/riscv/kernel/vmlinux-xip.lds.S
> @@ -64,8 +64,11 @@ SECTIONS
>  /*
>   * From this point, stuff is considered writable and will be copied to RAM
>   */
> -	__data_loc = ALIGN(16);		/* location in file */
> -	. = LOAD_OFFSET + XIP_OFFSET;	/* location in memory */
> +	__data_loc = ALIGN(PAGE_SIZE);		/* location in file */
> +	. = KERNEL_LINK_ADDR + XIP_OFFSET;	/* location in memory */
> +
> +#undef LOAD_OFFSET
> +#define LOAD_OFFSET (KERNEL_LINK_ADDR + XIP_OFFSET - (__data_loc & XIP_OFFSET_MASK))
>
>  	_sdata = .;			/* Start of data section */
>  	_data = .;
> @@ -96,7 +99,6 @@ SECTIONS
>  		KEEP(*(__soc_builtin_dtb_table))
>  		__soc_builtin_dtb_table_end = .;
>  	}
> -	PERCPU_SECTION(L1_CACHE_BYTES)
>
>  	. = ALIGN(8);
>  	.alternative : {
> @@ -122,6 +124,8 @@ SECTIONS
>
>  	BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0)
>
> +	PERCPU_SECTION(L1_CACHE_BYTES)
> +
>  	.rel.dyn : AT(ADDR(.rel.dyn) - LOAD_OFFSET) {
>  		*(.rel.dyn*)
>  	}
> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
> index c0cddf0fc22d..24b2b8044602 100644
> --- a/arch/riscv/mm/init.c
> +++ b/arch/riscv/mm/init.c
> @@ -41,7 +41,7 @@ phys_addr_t phys_ram_base __ro_after_init;
>  EXPORT_SYMBOL(phys_ram_base);
>
>  #ifdef CONFIG_XIP_KERNEL
> -extern char _xiprom[], _exiprom[];
> +extern char _xiprom[], _exiprom[], __data_loc;
>  #endif
>
>  unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]
> @@ -454,10 +454,9 @@ static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size)
>  /* called from head.S with MMU off */
>  asmlinkage void __init __copy_data(void)
>  {
> -	void *from = (void *)(&_sdata);
> -	void *end = (void *)(&_end);
> +	void *from = (void *)(&__data_loc);
>  	void *to = (void *)CONFIG_PHYS_RAM_BASE;
> -	size_t sz = (size_t)(end - from + 1);
> +	size_t sz = (size_t)((uintptr_t)(&_end) - (uintptr_t)(&_sdata));
>
>  	memcpy(to, from, sz);
>  }

Thanks, this is on for-next.


      reply	other threads:[~2021-10-26 22:46 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-11  9:14 Vitaly Wool
2021-10-26 22:46 ` Palmer Dabbelt [this message]

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=mhng-9c793de5-4223-4833-b244-4dd2636b2dd5@palmerdabbelt-glaptop \
    --to=palmer@dabbelt.com \
    --cc=alex@ghiti.fr \
    --cc=jszhang@kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=nico@fluxnic.net \
    --cc=vitaly.wool@konsulko.com \
    /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