2023-03-06 06:11:11

by Jungseung Lee

[permalink] [raw]
Subject: [PATCH 1/2] arm/mm : omit [_text, _stext) from kernel code region

The resource reservations in /proc/iomem made for the kernel code did
not reflect the gaps between pagetable and text.

In particular, if the CONFIG_STRICT_KERNEL_RWX option is turned on,
the wrong area is shown as the kernel code area.

Fix it by removing [_text, _stext) from kernel code region.

Before:
04000000-2f7fffff : System RAM
04008000-04cfffff : Kernel code
04e00000-05369a27 : Kernel data

After :
04000000-2f7fffff : System RAM
04100000-04cfffff : Kernel code
04e00000-05369a27 : Kernel data

Signed-off-by: Jungseung Lee <[email protected]>
---
arch/arm/kernel/setup.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 75cd469..3059860 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -865,7 +865,7 @@ static void __init request_standard_resources(const struct machine_desc *mdesc)
struct resource *res;
u64 i;

- kernel_code.start = virt_to_phys(_text);
+ kernel_code.start = virt_to_phys(_stext);
kernel_code.end = virt_to_phys(__init_begin - 1);
kernel_data.start = virt_to_phys(_sdata);
kernel_data.end = virt_to_phys(_end - 1);
@@ -1139,7 +1139,7 @@ void __init setup_arch(char **cmdline_p)
if (mdesc->reboot_mode != REBOOT_HARD)
reboot_mode = mdesc->reboot_mode;

- setup_initial_init_mm(_text, _etext, _edata, _end);
+ setup_initial_init_mm(_stext, _etext, _edata, _end);

/* populate cmd_line too for later use, preserving boot_command_line */
strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);
--
2.7.4



2023-03-06 06:11:14

by Jungseung Lee

[permalink] [raw]
Subject: [PATCH 2/2] arm/mm : Report actual image regions in /proc/iomem

The resource reservations in /proc/iomem made for the kernel image did
not reflect the gaps between text, rodata, and data.
Add the "rodata" resource and update the start/end calculations.

Before :
04000000-2f7fffff : System RAM
04100000-04cfffff : Kernel code
04e00000-05369a27 : Kernel data

After :
04000000-2f7fffff : System RAM
04100000-049fffff : Kernel code
04a00000-04cb2fff : Kernel rodata
04e00000-05369a27 : Kernel data

Signed-off-by: Jungseung Lee <[email protected]>
---
arch/arm/kernel/setup.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 3059860..85af967 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -181,6 +181,12 @@ static struct resource mem_res[] = {
.flags = IORESOURCE_SYSTEM_RAM
},
{
+ .name = "Kernel rodata",
+ .start = 0,
+ .end = 0,
+ .flags = IORESOURCE_SYSTEM_RAM
+ },
+ {
.name = "Kernel data",
.start = 0,
.end = 0,
@@ -188,9 +194,10 @@ static struct resource mem_res[] = {
}
};

-#define video_ram mem_res[0]
-#define kernel_code mem_res[1]
-#define kernel_data mem_res[2]
+#define video_ram mem_res[0]
+#define kernel_code mem_res[1]
+#define kernel_rodata mem_res[2]
+#define kernel_data mem_res[3]

static struct resource io_res[] = {
{
@@ -866,7 +873,9 @@ static void __init request_standard_resources(const struct machine_desc *mdesc)
u64 i;

kernel_code.start = virt_to_phys(_stext);
- kernel_code.end = virt_to_phys(__init_begin - 1);
+ kernel_code.end = virt_to_phys(_etext - 1);
+ kernel_rodata.start = virt_to_phys(__start_rodata);
+ kernel_rodata.end = virt_to_phys(__end_rodata - 1);
kernel_data.start = virt_to_phys(_sdata);
kernel_data.end = virt_to_phys(_end - 1);

@@ -912,6 +921,9 @@ static void __init request_standard_resources(const struct machine_desc *mdesc)
if (kernel_code.start >= res->start &&
kernel_code.end <= res->end)
request_resource(res, &kernel_code);
+ if (kernel_rodata.start >= res->start &&
+ kernel_rodata.end <= res->end)
+ request_resource(res, &kernel_rodata);
if (kernel_data.start >= res->start &&
kernel_data.end <= res->end)
request_resource(res, &kernel_data);
--
2.7.4


2023-03-06 11:06:30

by Russell King (Oracle)

[permalink] [raw]
Subject: Re: [PATCH 1/2] arm/mm : omit [_text, _stext) from kernel code region

On Mon, Mar 06, 2023 at 02:51:54PM +0900, Jungseung Lee wrote:
> The resource reservations in /proc/iomem made for the kernel code did
> not reflect the gaps between pagetable and text.
>
> In particular, if the CONFIG_STRICT_KERNEL_RWX option is turned on,
> the wrong area is shown as the kernel code area.
>
> Fix it by removing [_text, _stext) from kernel code region.
>
> Before:
> 04000000-2f7fffff : System RAM
> 04008000-04cfffff : Kernel code
> 04e00000-05369a27 : Kernel data
>
> After :
> 04000000-2f7fffff : System RAM
> 04100000-04cfffff : Kernel code
> 04e00000-05369a27 : Kernel data

And why do you think this is correct? Isn't the head text, which
isn't discarded and is located at 0x04008000, still part of kernel
code?

--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!

2023-03-06 11:11:40

by Russell King (Oracle)

[permalink] [raw]
Subject: Re: [PATCH 2/2] arm/mm : Report actual image regions in /proc/iomem

On Mon, Mar 06, 2023 at 02:51:55PM +0900, Jungseung Lee wrote:
> The resource reservations in /proc/iomem made for the kernel image did
> not reflect the gaps between text, rodata, and data.
> Add the "rodata" resource and update the start/end calculations.
>
> Before :
> 04000000-2f7fffff : System RAM
> 04100000-04cfffff : Kernel code
> 04e00000-05369a27 : Kernel data
>
> After :
> 04000000-2f7fffff : System RAM
> 04100000-049fffff : Kernel code
> 04a00000-04cb2fff : Kernel rodata
> 04e00000-05369a27 : Kernel data

NAK. This is API, and programs do read and parse this file. It is
important that this file reports these parameters in a similar way
to other architectures. Other architectures do not split up the
individual regions.

--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!

2023-03-06 12:15:05

by Jungseung Lee

[permalink] [raw]
Subject: RE: [PATCH 2/2] arm/mm : Report actual image regions in /proc/iomem

Hi, Russell

> -----Original Message-----
> From: Russell King (Oracle) <[email protected]>
> Sent: Monday, March 6, 2023 8:10 PM
> To: Jungseung Lee <[email protected]>
> Cc: [email protected]; [email protected]; [email protected];
> [email protected]; [email protected];
> [email protected]; [email protected]
> Subject: Re: [PATCH 2/2] arm/mm : Report actual image regions in
> /proc/iomem
>
> On Mon, Mar 06, 2023 at 02:51:55PM +0900, Jungseung Lee wrote:
> > The resource reservations in /proc/iomem made for the kernel image
> > did not reflect the gaps between text, rodata, and data.
> > Add the "rodata" resource and update the start/end calculations.
> >
> > Before :
> > 04000000-2f7fffff : System RAM
> > 04100000-04cfffff : Kernel code
> > 04e00000-05369a27 : Kernel data
> >
> > After :
> > 04000000-2f7fffff : System RAM
> > 04100000-049fffff : Kernel code
> > 04a00000-04cb2fff : Kernel rodata
> > 04e00000-05369a27 : Kernel data
>
> NAK. This is API, and programs do read and parse this file. It is
> important that this file reports these parameters in a similar way to
> other architectures. Other architectures do not split up the
> individual regions.
>

Sounds like an important point, but I failed to find which programs use it
as an API. Could you tell me which program uses it as an API?

In fact, x86 architecture also split up the individual regions in this way.
In addition, most architectures separate the "Kernel bss" area, but arm does
not.

> --
> RMK's Patch system: https://protect2.fireeye.com/v1/url?k=e44d6839-
> 85c67d00-e44ce376-000babffae10-dcec955b544dea43&q=1&e=b53fe1bc-de29-
> 4c29-a20d-
> e39d10be6f3e&u=https%3A%2F%2Fhttp://www.armlinux.org.uk%2Fdeveloper%2Fpatches
> %2F
> FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!


2023-03-06 12:28:51

by Russell King (Oracle)

[permalink] [raw]
Subject: Re: [PATCH 2/2] arm/mm : Report actual image regions in /proc/iomem

On Mon, Mar 06, 2023 at 09:14:23PM +0900, Jungseung Lee wrote:
> Hi, Russell
>
> > -----Original Message-----
> > From: Russell King (Oracle) <[email protected]>
> > Sent: Monday, March 6, 2023 8:10 PM
> > To: Jungseung Lee <[email protected]>
> > Cc: [email protected]; [email protected]; [email protected];
> > [email protected]; [email protected];
> > [email protected]; [email protected]
> > Subject: Re: [PATCH 2/2] arm/mm : Report actual image regions in
> > /proc/iomem
> >
> > On Mon, Mar 06, 2023 at 02:51:55PM +0900, Jungseung Lee wrote:
> > > The resource reservations in /proc/iomem made for the kernel image
> > > did not reflect the gaps between text, rodata, and data.
> > > Add the "rodata" resource and update the start/end calculations.
> > >
> > > Before :
> > > 04000000-2f7fffff : System RAM
> > > 04100000-04cfffff : Kernel code
> > > 04e00000-05369a27 : Kernel data
> > >
> > > After :
> > > 04000000-2f7fffff : System RAM
> > > 04100000-049fffff : Kernel code
> > > 04a00000-04cb2fff : Kernel rodata
> > > 04e00000-05369a27 : Kernel data
> >
> > NAK. This is API, and programs do read and parse this file. It is
> > important that this file reports these parameters in a similar way to
> > other architectures. Other architectures do not split up the
> > individual regions.
> >
>
> Sounds like an important point, but I failed to find which programs use it
> as an API. Could you tell me which program uses it as an API?
>
> In fact, x86 architecture also split up the individual regions in this way.
> In addition, most architectures separate the "Kernel bss" area, but arm does
> not.

Take a look at kexec-tools - that certainly does parse /proc/iomem
looking for entries such as "Kernel code" and "Kernel data".

It's fine for an architecture to decide to do something else if it
started to do it early on, but not when something has been established
for decades.

--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!

2023-03-06 13:01:51

by Ard Biesheuvel

[permalink] [raw]
Subject: Re: [PATCH 2/2] arm/mm : Report actual image regions in /proc/iomem

On Mon, 6 Mar 2023 at 13:28, Russell King (Oracle)
<[email protected]> wrote:
>
> On Mon, Mar 06, 2023 at 09:14:23PM +0900, Jungseung Lee wrote:
> > Hi, Russell
> >
> > > -----Original Message-----
> > > From: Russell King (Oracle) <[email protected]>
> > > Sent: Monday, March 6, 2023 8:10 PM
> > > To: Jungseung Lee <[email protected]>
> > > Cc: [email protected]; [email protected]; [email protected];
> > > [email protected]; [email protected];
> > > [email protected]; [email protected]
> > > Subject: Re: [PATCH 2/2] arm/mm : Report actual image regions in
> > > /proc/iomem
> > >
> > > On Mon, Mar 06, 2023 at 02:51:55PM +0900, Jungseung Lee wrote:
> > > > The resource reservations in /proc/iomem made for the kernel image
> > > > did not reflect the gaps between text, rodata, and data.
> > > > Add the "rodata" resource and update the start/end calculations.
> > > >
> > > > Before :
> > > > 04000000-2f7fffff : System RAM
> > > > 04100000-04cfffff : Kernel code
> > > > 04e00000-05369a27 : Kernel data
> > > >
> > > > After :
> > > > 04000000-2f7fffff : System RAM
> > > > 04100000-049fffff : Kernel code
> > > > 04a00000-04cb2fff : Kernel rodata
> > > > 04e00000-05369a27 : Kernel data
> > >
> > > NAK. This is API, and programs do read and parse this file. It is
> > > important that this file reports these parameters in a similar way to
> > > other architectures. Other architectures do not split up the
> > > individual regions.
> > >
> >
> > Sounds like an important point, but I failed to find which programs use it
> > as an API. Could you tell me which program uses it as an API?
> >
> > In fact, x86 architecture also split up the individual regions in this way.
> > In addition, most architectures separate the "Kernel bss" area, but arm does
> > not.
>
> Take a look at kexec-tools - that certainly does parse /proc/iomem
> looking for entries such as "Kernel code" and "Kernel data".
>
> It's fine for an architecture to decide to do something else if it
> started to do it early on, but not when something has been established
> for decades.
>

Agree with Russell here.

It would be helpful if you could explain why you think this needs to be changed.