This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
Re: MMU Off / Strict Alignment
- From: Matthew Gretton-Dann <matthew dot gretton-dann at linaro dot org>
- To: Christopher Covington <cov at codeaurora dot org>
- Cc: newlib at sourceware dot org, "linaro-toolchain at lists dot linaro dot org" <linaro-toolchain at lists dot linaro dot org>
- Date: Wed, 20 Nov 2013 20:45:00 +0000
- Subject: Re: MMU Off / Strict Alignment
- Authentication-results: sourceware.org; auth=none
- References: <528CF7F1 dot 5050001 at codeaurora dot org>
On 20 November 2013 17:57, Christopher Covington <cov@codeaurora.org> wrote:
> Hi,
>
> We've noticed an issue trying to use the Linaro AArch64 binary bare metal
> toolchain release with the MMU turned off for some low-level tests.
>
> Anytime puts, sprintf, etc. gets called, a reent structure gets created with
> references to STDIN, STDOUT, STDERR FILE types. A member in the __sFile
> struct, _mbstate, is an 8 byte struct, but is not aligned on an 8 byte
> boundary. This means that when memset (or a similar function) gets called on
> this struct, and doesn't operate one byte at a time, a data alignment fault
> will be generated when operating out of device memory, such as on a system
> where the MMU has not yet been turned on yet.
>
> I'm still examining possible fixes (I'll probably look at building with
> -mstrict-align first), but I wanted to check if anyone had thoughts on the
> subject and if Newlib upstream or Linaro consider using Newlib with the MMU
> turned off to be a valid use case or if running the code that turns on the MMU
> is considered a prerequisite to everything else.
I've always viewed newlib as a C Library - and as such it doesn't
provide system 'startup' code but rather assumes that has been run
before you enter newlib (possibly by using libgloss).
Certainly this is how the aarch64 port is structured - it provides
system startup code which installs exception vectors and turns the MMU
on for when using the AEM models. It also provides the .specs files
to use with GCC to get that installed.
So I think you want to write some CPU initialisation code for your
particular core and hook it into libgloss. Basically this should
involve writing a _cpu_init_hook of your own, and getting it built
into its own .o file with libgloss, and providing appropriate .specs
files.
However, I can see the other viewpoint as well - the newlib should
work without the MMU turned on. So I leave it to wiser heads than me
to make a definitive statement on what newlib presupposes about the
CPU state.
Thanks,
Matt
--
Matthew Gretton-Dann
Linaro Toolchain Working Group
matthew.gretton-dann@linaro.org