diff mbox series

[bootwrapper,v2,11/13] Announce locations of memory objects

Message ID 20220114105653.3003399-12-mark.rutland@arm.com (mailing list archive)
State New, archived
Headers show
Series Cleanups and improvements | expand

Commit Message

Mark Rutland Jan. 14, 2022, 10:56 a.m. UTC
To make it easier to debug boot failures, log the location of memory
objects at boot time.

This is logged to the serial console as:

| Boot-wrapper v0.2
| Entered at EL3
| Memory layout:
| [0000000080000000..0000000080001f90] => boot-wrapper
| [000000008000fff8..0000000080010000] => mbox
| [0000000080200000..00000000822af200] => kernel
| [0000000088000000..0000000088002857] => dtb

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
---
 common/init.c      | 27 +++++++++++++++++++++++++++
 common/platform.c  | 13 +++++++++++++
 include/platform.h |  2 ++
 model.lds.S        | 20 ++++++++++++++------
 4 files changed, 56 insertions(+), 6 deletions(-)

Comments

Andre Przywara Jan. 14, 2022, 3:30 p.m. UTC | #1
On Fri, 14 Jan 2022 10:56:51 +0000
Mark Rutland <mark.rutland@arm.com> wrote:

Hi Mark,

> To make it easier to debug boot failures, log the location of memory
> objects at boot time.
> 
> This is logged to the serial console as:
> 
> | Boot-wrapper v0.2
> | Entered at EL3
> | Memory layout:
> | [0000000080000000..0000000080001f90] => boot-wrapper
> | [000000008000fff8..0000000080010000] => mbox
> | [0000000080200000..00000000822af200] => kernel
> | [0000000088000000..0000000088002857] => dtb
> 
> Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> ---
>  common/init.c      | 27 +++++++++++++++++++++++++++
>  common/platform.c  | 13 +++++++++++++
>  include/platform.h |  2 ++
>  model.lds.S        | 20 ++++++++++++++------
>  4 files changed, 56 insertions(+), 6 deletions(-)
> 
> diff --git a/common/init.c b/common/init.c
> index 2600f73..fc74b9e 100644
> --- a/common/init.c
> +++ b/common/init.c
> @@ -14,6 +14,32 @@ static void announce_bootwrapper(void)
>  	print_string("Boot-wrapper v0.2\r\n");
>  }
>  
> +#define announce_object(object, desc)				\
> +do {								\
> +	extern char object##__start[];				\
> +	extern char object##__end[];				\
> +	print_string("[");					\
> +	print_ulong_hex((unsigned long)object##__start);	\
> +	print_string("..");					\
> +	print_ulong_hex((unsigned long)object##__end);		\
> +	print_string("] => " desc "\r\n");			\
> +} while (0)
> +
> +static void announce_objects(void)
> +{
> +	print_string("Memory layout:\r\n");
> +	announce_object(text, "boot-wrapper");
> +	announce_object(mbox, "mbox");
> +	announce_object(kernel, "kernel");
> +#ifdef XEN
> +	announce_object(xen, "xen");
> +#endif
> +	announce_object(dtb, "dtb");
> +#ifdef USE_INITRD
> +	announce_object(filesystem, "initrd");
> +#endif
> +}
> +
>  void announce_arch(void);
>  
>  void cpu_init_bootwrapper(void)
> @@ -22,6 +48,7 @@ void cpu_init_bootwrapper(void)
>  		init_uart();
>  		announce_bootwrapper();
>  		announce_arch();
> +		announce_objects();
>  		print_string("\r\n");
>  		init_platform();
>  	}
> diff --git a/common/platform.c b/common/platform.c
> index 80d0562..26e5944 100644
> --- a/common/platform.c
> +++ b/common/platform.c
> @@ -52,6 +52,19 @@ void print_string(const char *str)
>  		print_char(*str++);
>  }
>  
> +#define HEX_CHARS_PER_LONG (2 * sizeof(long))
> +
> +void print_ulong_hex(unsigned long val)
> +{
> +	const char hex_chars[16] = "0123456789abcdef";

This breaks the build for me (I guess because of the const?):
-------------------
ld --gc-sections arch/aarch64/boot.o arch/aarch64/stack.o arch/aarch64/utils.o arch/aarch64/init.o arch/aarch64/psci.o common/boot.o common/bakery_lock.o common/platform.o common/lib.o common/init.o common/psci.o common/gic-v3.o -o linux-system.axf --script=model.lds
ld: common/platform.o: in function `print_ulong_hex':
/src/boot-wrapper-aarch64.git/common/platform.c:58: undefined reference to `__stack_chk_guard'
ld: /src/boot-wrapper-aarch64.git/common/platform.c:58: undefined reference to `__stack_chk_guard'
ld: /src/boot-wrapper-aarch64.git/common/platform.c:66: undefined reference to `__stack_chk_fail'
/src/boot-wrapper-aarch64.git/common/platform.c:66:(.text.print_ulong_hex+0xa0): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `__stack_chk_fail'
make: *** [Makefile:684: linux-system.axf] Error 1
------------------

Adding -fno-stack-protector fixes it again.

I am still checking on each one of those compiler options, shall I send a
smaller version of that patch 3/9 of mine, meanwhile, just carrying the
uncontested -ffreestanding and -nostdlib, plus -fno-stack-protector?

Cheers,
Andre

> +	int i;
> +
> +	for (i = HEX_CHARS_PER_LONG - 1; i >= 0; i--) {
> +		int v = (val >> (4 * i)) & 0xf;
> +		print_char(hex_chars[v]);
> +	}
> +}
> +
>  void init_uart(void)
>  {
>  	/*
> diff --git a/include/platform.h b/include/platform.h
> index 237b481..c88e124 100644
> --- a/include/platform.h
> +++ b/include/platform.h
> @@ -11,6 +11,8 @@
>  
>  void print_char(char c);
>  void print_string(const char *str);
> +void print_ulong_hex(unsigned long val);
> +
>  void init_uart(void);
>  
>  void init_platform(void);
> diff --git a/model.lds.S b/model.lds.S
> index d4e7e13..dacaa25 100644
> --- a/model.lds.S
> +++ b/model.lds.S
> @@ -35,46 +35,54 @@ SECTIONS
>  	 * the boot section's *(.data)
>  	 */
>  	.kernel (PHYS_OFFSET + KERNEL_OFFSET): {
> -		kernel = .;
> +		kernel__start = .;
>  		KERNEL
> +		kernel__end = .;
>  	}
>  
>  #ifdef XEN
>  	.xen (PHYS_OFFSET + XEN_OFFSET): {
> -		xen = .;
> +		xen__start = .;
>  		XEN
> +		xen__end = .;
>  	}
>  
> -	entrypoint = xen;
> +	entrypoint = xen__start;
>  #else
> -	entrypoint = kernel;
> +	entrypoint = kernel__start;
>  #endif
>  
>  	.dtb (PHYS_OFFSET + FDT_OFFSET): {
> +		dtb__start = .;
>  		dtb = .;
>  		./fdt.dtb
> +		dtb__end = .;
>  	}
>  
>  #ifdef USE_INITRD
>  	.filesystem (PHYS_OFFSET + FS_OFFSET): {
> -		filesystem = .;
> +		filesystem__start = .;
>  		FILESYSTEM
> -		fs_size = . - filesystem;
> +		filesystem__end = .;
>  	}
>  #endif
>  
>  	.boot PHYS_OFFSET: {
> +		text__start = .;
>  		*(.init)
>  		*(.text*)
>  		*(.data* .rodata* .bss* COMMON)
>  		*(.vectors)
>  		*(.stack)
>  		PROVIDE(etext = .);
> +		text__end = .;
>  	}
>  
>  	.mbox (PHYS_OFFSET + MBOX_OFFSET): {
> +		mbox__start = .;
>  		mbox = .;
>  		QUAD(0x0)
> +		mbox__end = .;
>  	}
>  
>  	ASSERT(etext <= (PHYS_OFFSET + TEXT_LIMIT), ".text overflow!")
Robin Murphy Jan. 14, 2022, 4:04 p.m. UTC | #2
On 2022-01-14 15:30, Andre Przywara wrote:
> On Fri, 14 Jan 2022 10:56:51 +0000
> Mark Rutland <mark.rutland@arm.com> wrote:
> 
> Hi Mark,
> 
>> To make it easier to debug boot failures, log the location of memory
>> objects at boot time.
>>
>> This is logged to the serial console as:
>>
>> | Boot-wrapper v0.2
>> | Entered at EL3
>> | Memory layout:
>> | [0000000080000000..0000000080001f90] => boot-wrapper
>> | [000000008000fff8..0000000080010000] => mbox
>> | [0000000080200000..00000000822af200] => kernel
>> | [0000000088000000..0000000088002857] => dtb
>>
>> Signed-off-by: Mark Rutland <mark.rutland@arm.com>
>> ---
>>   common/init.c      | 27 +++++++++++++++++++++++++++
>>   common/platform.c  | 13 +++++++++++++
>>   include/platform.h |  2 ++
>>   model.lds.S        | 20 ++++++++++++++------
>>   4 files changed, 56 insertions(+), 6 deletions(-)
>>
>> diff --git a/common/init.c b/common/init.c
>> index 2600f73..fc74b9e 100644
>> --- a/common/init.c
>> +++ b/common/init.c
>> @@ -14,6 +14,32 @@ static void announce_bootwrapper(void)
>>   	print_string("Boot-wrapper v0.2\r\n");
>>   }
>>   
>> +#define announce_object(object, desc)				\
>> +do {								\
>> +	extern char object##__start[];				\
>> +	extern char object##__end[];				\
>> +	print_string("[");					\
>> +	print_ulong_hex((unsigned long)object##__start);	\
>> +	print_string("..");					\
>> +	print_ulong_hex((unsigned long)object##__end);		\
>> +	print_string("] => " desc "\r\n");			\
>> +} while (0)
>> +
>> +static void announce_objects(void)
>> +{
>> +	print_string("Memory layout:\r\n");
>> +	announce_object(text, "boot-wrapper");
>> +	announce_object(mbox, "mbox");
>> +	announce_object(kernel, "kernel");
>> +#ifdef XEN
>> +	announce_object(xen, "xen");
>> +#endif
>> +	announce_object(dtb, "dtb");
>> +#ifdef USE_INITRD
>> +	announce_object(filesystem, "initrd");
>> +#endif
>> +}
>> +
>>   void announce_arch(void);
>>   
>>   void cpu_init_bootwrapper(void)
>> @@ -22,6 +48,7 @@ void cpu_init_bootwrapper(void)
>>   		init_uart();
>>   		announce_bootwrapper();
>>   		announce_arch();
>> +		announce_objects();
>>   		print_string("\r\n");
>>   		init_platform();
>>   	}
>> diff --git a/common/platform.c b/common/platform.c
>> index 80d0562..26e5944 100644
>> --- a/common/platform.c
>> +++ b/common/platform.c
>> @@ -52,6 +52,19 @@ void print_string(const char *str)
>>   		print_char(*str++);
>>   }
>>   
>> +#define HEX_CHARS_PER_LONG (2 * sizeof(long))
>> +
>> +void print_ulong_hex(unsigned long val)
>> +{
>> +	const char hex_chars[16] = "0123456789abcdef";
> 
> This breaks the build for me (I guess because of the const?):
> -------------------
> ld --gc-sections arch/aarch64/boot.o arch/aarch64/stack.o arch/aarch64/utils.o arch/aarch64/init.o arch/aarch64/psci.o common/boot.o common/bakery_lock.o common/platform.o common/lib.o common/init.o common/psci.o common/gic-v3.o -o linux-system.axf --script=model.lds
> ld: common/platform.o: in function `print_ulong_hex':
> /src/boot-wrapper-aarch64.git/common/platform.c:58: undefined reference to `__stack_chk_guard'
> ld: /src/boot-wrapper-aarch64.git/common/platform.c:58: undefined reference to `__stack_chk_guard'
> ld: /src/boot-wrapper-aarch64.git/common/platform.c:66: undefined reference to `__stack_chk_fail'
> /src/boot-wrapper-aarch64.git/common/platform.c:66:(.text.print_ulong_hex+0xa0): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `__stack_chk_fail'
> make: *** [Makefile:684: linux-system.axf] Error 1
> ------------------

I got curious and tried a quick test compiling this function in 
isolation, and indeed for some reason GCC (9.3.0 at -O2) seems to end up 
allocating 80 bytes of stack, which is apparently large enough to 
trigger insertion of a stack check, and laboriously copying the string 
from static data into it. FWIW either making hex_chars static const, or 
simply '#define hex_chars "01234567abcdef"', not only avoids a stack 
check but also leads to notably nicer code.

Of course, something like "print_char(v + (v > 9 ? 'a' : '0'));" is best 
of all in terms of code/data, but risks venturing into "too clever" 
territory.

Robin.

> Adding -fno-stack-protector fixes it again.
> 
> I am still checking on each one of those compiler options, shall I send a
> smaller version of that patch 3/9 of mine, meanwhile, just carrying the
> uncontested -ffreestanding and -nostdlib, plus -fno-stack-protector?
> 
> Cheers,
> Andre
> 
>> +	int i;
>> +
>> +	for (i = HEX_CHARS_PER_LONG - 1; i >= 0; i--) {
>> +		int v = (val >> (4 * i)) & 0xf;
>> +		print_char(hex_chars[v]);
>> +	}
>> +}
>> +
>>   void init_uart(void)
>>   {
>>   	/*
>> diff --git a/include/platform.h b/include/platform.h
>> index 237b481..c88e124 100644
>> --- a/include/platform.h
>> +++ b/include/platform.h
>> @@ -11,6 +11,8 @@
>>   
>>   void print_char(char c);
>>   void print_string(const char *str);
>> +void print_ulong_hex(unsigned long val);
>> +
>>   void init_uart(void);
>>   
>>   void init_platform(void);
>> diff --git a/model.lds.S b/model.lds.S
>> index d4e7e13..dacaa25 100644
>> --- a/model.lds.S
>> +++ b/model.lds.S
>> @@ -35,46 +35,54 @@ SECTIONS
>>   	 * the boot section's *(.data)
>>   	 */
>>   	.kernel (PHYS_OFFSET + KERNEL_OFFSET): {
>> -		kernel = .;
>> +		kernel__start = .;
>>   		KERNEL
>> +		kernel__end = .;
>>   	}
>>   
>>   #ifdef XEN
>>   	.xen (PHYS_OFFSET + XEN_OFFSET): {
>> -		xen = .;
>> +		xen__start = .;
>>   		XEN
>> +		xen__end = .;
>>   	}
>>   
>> -	entrypoint = xen;
>> +	entrypoint = xen__start;
>>   #else
>> -	entrypoint = kernel;
>> +	entrypoint = kernel__start;
>>   #endif
>>   
>>   	.dtb (PHYS_OFFSET + FDT_OFFSET): {
>> +		dtb__start = .;
>>   		dtb = .;
>>   		./fdt.dtb
>> +		dtb__end = .;
>>   	}
>>   
>>   #ifdef USE_INITRD
>>   	.filesystem (PHYS_OFFSET + FS_OFFSET): {
>> -		filesystem = .;
>> +		filesystem__start = .;
>>   		FILESYSTEM
>> -		fs_size = . - filesystem;
>> +		filesystem__end = .;
>>   	}
>>   #endif
>>   
>>   	.boot PHYS_OFFSET: {
>> +		text__start = .;
>>   		*(.init)
>>   		*(.text*)
>>   		*(.data* .rodata* .bss* COMMON)
>>   		*(.vectors)
>>   		*(.stack)
>>   		PROVIDE(etext = .);
>> +		text__end = .;
>>   	}
>>   
>>   	.mbox (PHYS_OFFSET + MBOX_OFFSET): {
>> +		mbox__start = .;
>>   		mbox = .;
>>   		QUAD(0x0)
>> +		mbox__end = .;
>>   	}
>>   
>>   	ASSERT(etext <= (PHYS_OFFSET + TEXT_LIMIT), ".text overflow!")
>
Mark Rutland Jan. 14, 2022, 4:21 p.m. UTC | #3
On Fri, Jan 14, 2022 at 03:30:53PM +0000, Andre Przywara wrote:
> On Fri, 14 Jan 2022 10:56:51 +0000
> Mark Rutland <mark.rutland@arm.com> wrote:
> > To make it easier to debug boot failures, log the location of memory
> > objects at boot time.
> > 
> > This is logged to the serial console as:
> > 
> > | Boot-wrapper v0.2
> > | Entered at EL3
> > | Memory layout:
> > | [0000000080000000..0000000080001f90] => boot-wrapper
> > | [000000008000fff8..0000000080010000] => mbox
> > | [0000000080200000..00000000822af200] => kernel
> > | [0000000088000000..0000000088002857] => dtb
> > 
> > Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> > ---

> > +void print_ulong_hex(unsigned long val)
> > +{
> > +	const char hex_chars[16] = "0123456789abcdef";
> 
> This breaks the build for me (I guess because of the const?):
> -------------------
> ld --gc-sections arch/aarch64/boot.o arch/aarch64/stack.o arch/aarch64/utils.o arch/aarch64/init.o arch/aarch64/psci.o common/boot.o common/bakery_lock.o common/platform.o common/lib.o common/init.o common/psci.o common/gic-v3.o -o linux-system.axf --script=model.lds
> ld: common/platform.o: in function `print_ulong_hex':
> /src/boot-wrapper-aarch64.git/common/platform.c:58: undefined reference to `__stack_chk_guard'
> ld: /src/boot-wrapper-aarch64.git/common/platform.c:58: undefined reference to `__stack_chk_guard'
> ld: /src/boot-wrapper-aarch64.git/common/platform.c:66: undefined reference to `__stack_chk_fail'
> /src/boot-wrapper-aarch64.git/common/platform.c:66:(.text.print_ulong_hex+0xa0): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `__stack_chk_fail'
> make: *** [Makefile:684: linux-system.axf] Error 1
> ------------------
> 
> Adding -fno-stack-protector fixes it again.
> 
> I am still checking on each one of those compiler options, shall I send a
> smaller version of that patch 3/9 of mine, meanwhile, just carrying the
> uncontested -ffreestanding and -nostdlib, plus -fno-stack-protector?

Yes please!

Thanks,
Mark.
Mark Rutland Jan. 14, 2022, 4:30 p.m. UTC | #4
On Fri, Jan 14, 2022 at 04:04:19PM +0000, Robin Murphy wrote:
> On 2022-01-14 15:30, Andre Przywara wrote:
> > On Fri, 14 Jan 2022 10:56:51 +0000
> > Mark Rutland <mark.rutland@arm.com> wrote:
> > > +void print_ulong_hex(unsigned long val)
> > > +{
> > > +	const char hex_chars[16] = "0123456789abcdef";
> > 
> > This breaks the build for me (I guess because of the const?):
> > -------------------
> > ld --gc-sections arch/aarch64/boot.o arch/aarch64/stack.o arch/aarch64/utils.o arch/aarch64/init.o arch/aarch64/psci.o common/boot.o common/bakery_lock.o common/platform.o common/lib.o common/init.o common/psci.o common/gic-v3.o -o linux-system.axf --script=model.lds
> > ld: common/platform.o: in function `print_ulong_hex':
> > /src/boot-wrapper-aarch64.git/common/platform.c:58: undefined reference to `__stack_chk_guard'
> > ld: /src/boot-wrapper-aarch64.git/common/platform.c:58: undefined reference to `__stack_chk_guard'
> > ld: /src/boot-wrapper-aarch64.git/common/platform.c:66: undefined reference to `__stack_chk_fail'
> > /src/boot-wrapper-aarch64.git/common/platform.c:66:(.text.print_ulong_hex+0xa0): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `__stack_chk_fail'
> > make: *** [Makefile:684: linux-system.axf] Error 1
> > ------------------
> 
> I got curious and tried a quick test compiling this function in isolation,
> and indeed for some reason GCC (9.3.0 at -O2) seems to end up allocating 80
> bytes of stack, which is apparently large enough to trigger insertion of a
> stack check, and laboriously copying the string from static data into it.
> FWIW either making hex_chars static const, or simply '#define hex_chars
> "01234567abcdef"', not only avoids a stack check but also leads to notably
> nicer code.

For the stack check, I think Andre's patch to add -fno-stack-protector is the
correct fix, so I'd like to take that as a prerequisite.

To avoid using the stack unnecessarily and to make the code nicer, I'll also
take your suggestion with the fixup below.

Thanks,
Mark.

---->8----
-#define HEX_CHARS_PER_LONG (2 * sizeof(long))
+#define HEX_CHARS_PER_LONG     (2 * sizeof(long))
+#define HEX_CHARS              "0123456789abcdef"
 
 void print_ulong_hex(unsigned long val)
 {
-       const char hex_chars[16] = "0123456789abcdef";
        int i;
 
        for (i = HEX_CHARS_PER_LONG - 1; i >= 0; i--) {
                int v = (val >> (4 * i)) & 0xf;
-               print_char(hex_chars[v]);
+               print_char(HEX_CHARS[v]);
        }
 }
Andre Przywara Jan. 17, 2022, 2:59 p.m. UTC | #5
On Fri, 14 Jan 2022 10:56:51 +0000
Mark Rutland <mark.rutland@arm.com> wrote:

Hi Mark,

> To make it easier to debug boot failures, log the location of memory
> objects at boot time.
> 
> This is logged to the serial console as:
> 
> | Boot-wrapper v0.2
> | Entered at EL3
> | Memory layout:
> | [0000000080000000..0000000080001f90] => boot-wrapper
> | [000000008000fff8..0000000080010000] => mbox
> | [0000000080200000..00000000822af200] => kernel
> | [0000000088000000..0000000088002857] => dtb

That looks indeed very useful!

> Signed-off-by: Mark Rutland <mark.rutland@arm.com>

Reviewed-by: Andre Przywara <andre.przywara@arm.com>

Cheers,
Andre

> ---
>  common/init.c      | 27 +++++++++++++++++++++++++++
>  common/platform.c  | 13 +++++++++++++
>  include/platform.h |  2 ++
>  model.lds.S        | 20 ++++++++++++++------
>  4 files changed, 56 insertions(+), 6 deletions(-)
> 
> diff --git a/common/init.c b/common/init.c
> index 2600f73..fc74b9e 100644
> --- a/common/init.c
> +++ b/common/init.c
> @@ -14,6 +14,32 @@ static void announce_bootwrapper(void)
>  	print_string("Boot-wrapper v0.2\r\n");
>  }
>  
> +#define announce_object(object, desc)				\
> +do {								\
> +	extern char object##__start[];				\
> +	extern char object##__end[];				\
> +	print_string("[");					\
> +	print_ulong_hex((unsigned long)object##__start);	\
> +	print_string("..");					\
> +	print_ulong_hex((unsigned long)object##__end);		\
> +	print_string("] => " desc "\r\n");			\
> +} while (0)
> +
> +static void announce_objects(void)
> +{
> +	print_string("Memory layout:\r\n");
> +	announce_object(text, "boot-wrapper");
> +	announce_object(mbox, "mbox");
> +	announce_object(kernel, "kernel");
> +#ifdef XEN
> +	announce_object(xen, "xen");
> +#endif
> +	announce_object(dtb, "dtb");
> +#ifdef USE_INITRD
> +	announce_object(filesystem, "initrd");
> +#endif
> +}
> +
>  void announce_arch(void);
>  
>  void cpu_init_bootwrapper(void)
> @@ -22,6 +48,7 @@ void cpu_init_bootwrapper(void)
>  		init_uart();
>  		announce_bootwrapper();
>  		announce_arch();
> +		announce_objects();
>  		print_string("\r\n");
>  		init_platform();
>  	}
> diff --git a/common/platform.c b/common/platform.c
> index 80d0562..26e5944 100644
> --- a/common/platform.c
> +++ b/common/platform.c
> @@ -52,6 +52,19 @@ void print_string(const char *str)
>  		print_char(*str++);
>  }
>  
> +#define HEX_CHARS_PER_LONG (2 * sizeof(long))
> +
> +void print_ulong_hex(unsigned long val)
> +{
> +	const char hex_chars[16] = "0123456789abcdef";
> +	int i;
> +
> +	for (i = HEX_CHARS_PER_LONG - 1; i >= 0; i--) {
> +		int v = (val >> (4 * i)) & 0xf;
> +		print_char(hex_chars[v]);
> +	}
> +}
> +
>  void init_uart(void)
>  {
>  	/*
> diff --git a/include/platform.h b/include/platform.h
> index 237b481..c88e124 100644
> --- a/include/platform.h
> +++ b/include/platform.h
> @@ -11,6 +11,8 @@
>  
>  void print_char(char c);
>  void print_string(const char *str);
> +void print_ulong_hex(unsigned long val);
> +
>  void init_uart(void);
>  
>  void init_platform(void);
> diff --git a/model.lds.S b/model.lds.S
> index d4e7e13..dacaa25 100644
> --- a/model.lds.S
> +++ b/model.lds.S
> @@ -35,46 +35,54 @@ SECTIONS
>  	 * the boot section's *(.data)
>  	 */
>  	.kernel (PHYS_OFFSET + KERNEL_OFFSET): {
> -		kernel = .;
> +		kernel__start = .;
>  		KERNEL
> +		kernel__end = .;
>  	}
>  
>  #ifdef XEN
>  	.xen (PHYS_OFFSET + XEN_OFFSET): {
> -		xen = .;
> +		xen__start = .;
>  		XEN
> +		xen__end = .;
>  	}
>  
> -	entrypoint = xen;
> +	entrypoint = xen__start;
>  #else
> -	entrypoint = kernel;
> +	entrypoint = kernel__start;
>  #endif
>  
>  	.dtb (PHYS_OFFSET + FDT_OFFSET): {
> +		dtb__start = .;
>  		dtb = .;
>  		./fdt.dtb
> +		dtb__end = .;
>  	}
>  
>  #ifdef USE_INITRD
>  	.filesystem (PHYS_OFFSET + FS_OFFSET): {
> -		filesystem = .;
> +		filesystem__start = .;
>  		FILESYSTEM
> -		fs_size = . - filesystem;
> +		filesystem__end = .;
>  	}
>  #endif
>  
>  	.boot PHYS_OFFSET: {
> +		text__start = .;
>  		*(.init)
>  		*(.text*)
>  		*(.data* .rodata* .bss* COMMON)
>  		*(.vectors)
>  		*(.stack)
>  		PROVIDE(etext = .);
> +		text__end = .;
>  	}
>  
>  	.mbox (PHYS_OFFSET + MBOX_OFFSET): {
> +		mbox__start = .;
>  		mbox = .;
>  		QUAD(0x0)
> +		mbox__end = .;
>  	}
>  
>  	ASSERT(etext <= (PHYS_OFFSET + TEXT_LIMIT), ".text overflow!")
diff mbox series

Patch

diff --git a/common/init.c b/common/init.c
index 2600f73..fc74b9e 100644
--- a/common/init.c
+++ b/common/init.c
@@ -14,6 +14,32 @@  static void announce_bootwrapper(void)
 	print_string("Boot-wrapper v0.2\r\n");
 }
 
+#define announce_object(object, desc)				\
+do {								\
+	extern char object##__start[];				\
+	extern char object##__end[];				\
+	print_string("[");					\
+	print_ulong_hex((unsigned long)object##__start);	\
+	print_string("..");					\
+	print_ulong_hex((unsigned long)object##__end);		\
+	print_string("] => " desc "\r\n");			\
+} while (0)
+
+static void announce_objects(void)
+{
+	print_string("Memory layout:\r\n");
+	announce_object(text, "boot-wrapper");
+	announce_object(mbox, "mbox");
+	announce_object(kernel, "kernel");
+#ifdef XEN
+	announce_object(xen, "xen");
+#endif
+	announce_object(dtb, "dtb");
+#ifdef USE_INITRD
+	announce_object(filesystem, "initrd");
+#endif
+}
+
 void announce_arch(void);
 
 void cpu_init_bootwrapper(void)
@@ -22,6 +48,7 @@  void cpu_init_bootwrapper(void)
 		init_uart();
 		announce_bootwrapper();
 		announce_arch();
+		announce_objects();
 		print_string("\r\n");
 		init_platform();
 	}
diff --git a/common/platform.c b/common/platform.c
index 80d0562..26e5944 100644
--- a/common/platform.c
+++ b/common/platform.c
@@ -52,6 +52,19 @@  void print_string(const char *str)
 		print_char(*str++);
 }
 
+#define HEX_CHARS_PER_LONG (2 * sizeof(long))
+
+void print_ulong_hex(unsigned long val)
+{
+	const char hex_chars[16] = "0123456789abcdef";
+	int i;
+
+	for (i = HEX_CHARS_PER_LONG - 1; i >= 0; i--) {
+		int v = (val >> (4 * i)) & 0xf;
+		print_char(hex_chars[v]);
+	}
+}
+
 void init_uart(void)
 {
 	/*
diff --git a/include/platform.h b/include/platform.h
index 237b481..c88e124 100644
--- a/include/platform.h
+++ b/include/platform.h
@@ -11,6 +11,8 @@ 
 
 void print_char(char c);
 void print_string(const char *str);
+void print_ulong_hex(unsigned long val);
+
 void init_uart(void);
 
 void init_platform(void);
diff --git a/model.lds.S b/model.lds.S
index d4e7e13..dacaa25 100644
--- a/model.lds.S
+++ b/model.lds.S
@@ -35,46 +35,54 @@  SECTIONS
 	 * the boot section's *(.data)
 	 */
 	.kernel (PHYS_OFFSET + KERNEL_OFFSET): {
-		kernel = .;
+		kernel__start = .;
 		KERNEL
+		kernel__end = .;
 	}
 
 #ifdef XEN
 	.xen (PHYS_OFFSET + XEN_OFFSET): {
-		xen = .;
+		xen__start = .;
 		XEN
+		xen__end = .;
 	}
 
-	entrypoint = xen;
+	entrypoint = xen__start;
 #else
-	entrypoint = kernel;
+	entrypoint = kernel__start;
 #endif
 
 	.dtb (PHYS_OFFSET + FDT_OFFSET): {
+		dtb__start = .;
 		dtb = .;
 		./fdt.dtb
+		dtb__end = .;
 	}
 
 #ifdef USE_INITRD
 	.filesystem (PHYS_OFFSET + FS_OFFSET): {
-		filesystem = .;
+		filesystem__start = .;
 		FILESYSTEM
-		fs_size = . - filesystem;
+		filesystem__end = .;
 	}
 #endif
 
 	.boot PHYS_OFFSET: {
+		text__start = .;
 		*(.init)
 		*(.text*)
 		*(.data* .rodata* .bss* COMMON)
 		*(.vectors)
 		*(.stack)
 		PROVIDE(etext = .);
+		text__end = .;
 	}
 
 	.mbox (PHYS_OFFSET + MBOX_OFFSET): {
+		mbox__start = .;
 		mbox = .;
 		QUAD(0x0)
+		mbox__end = .;
 	}
 
 	ASSERT(etext <= (PHYS_OFFSET + TEXT_LIMIT), ".text overflow!")