zephyr/tests/kernel/test_mem_safe
Andy Ross 6b3c5e8bb2 x86 link: Specify ALIGN_WITH_INPUT for XIP data sections
Binutils ld has an annoying misfeature (apparently a regression from a
few years ago) that alignment directives (and alignment specifiers on
symbols) apply only to the runtime addresses and not, apparently, to
the load address region specified with the "AT>" syntax.  The net
result is that by default the LMA output ends up too small for the
addresses generated in RAM.  See here for some details:

    https://sourceware.org/ml/binutils/2013-06/msg00246.html
    https://sourceware.org/ml/binutils/2014-01/msg00350.html

The required workaround/fix is that AFAICT any section which can have
inherit a separate VMA vs. LMA from a previous section must specify an
"ALIGN_WITH_INPUT" attribute.  Otherwise the sections will get out of
sync and the XIP data will be wrong at runtime.

No, I don't know why this isn't the default behavior.

A further complexity is that this feature only works as advertised
when the section is declared with the "AT> region" syntax after the
block and not "AT(address)" in the header.  If you use the header
syntax (with or without ALIGN_WITH_INPUT), ld appears to DOUBLE-apply
padding and the LMA ends up to big.  This is almost certainly a
binutils bug, but it's trivial to work around (and the working syntax
is actually cleaner) so we adjust the usage here.

Note finally that this patch includes an effective reversion of commit
d82e9dd9 ("x86: HACK force alignment for _k_task_list section"), which
was an earlier workaround for what seems to be the same issue.

Jira: ZEP-955

Change-Id: I2accd92901cb61fb546658b87d6752c1cd14de3a
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
2016-10-01 01:41:50 +00:00
..
src tests/mem_safe: place test buffers at the edges of RAM 2016-09-15 09:42:24 -04:00
Makefile tests/mem_safe: place test buffers at the edges of RAM 2016-09-15 09:42:24 -04:00
README.txt
linker_qemu_cortex_m3.ld x86 link: Specify ALIGN_WITH_INPUT for XIP data sections 2016-10-01 01:41:50 +00:00
linker_qemu_x86.ld x86 link: Specify ALIGN_WITH_INPUT for XIP data sections 2016-10-01 01:41:50 +00:00
prj_qemu_cortex_m3.conf tests/mem_safe: place test buffers at the edges of RAM 2016-09-15 09:42:24 -04:00
prj_qemu_x86.conf tests/mem_safe: place test buffers at the edges of RAM 2016-09-15 09:42:24 -04:00
testcase.ini tests/mem_safe: place test buffers at the edges of RAM 2016-09-15 09:42:24 -04:00

README.txt

Title: Safe Memory Access

Description:

This test verifies that the safe memory access (_mem_safe) functions as
intended.

---------------------------------------------------------------------------

Building and Running Project:

This nanokernel project outputs to the console.  It can be built and executed
on QEMU as follows:

    make qemu

---------------------------------------------------------------------------

Troubleshooting:

Problems caused by out-dated project information can be addressed by
issuing one of the following commands then rebuilding the project:

    make clean          # discard results of previous builds
                        # but keep existing configuration info
or
    make pristine       # discard results of previous builds
                        # and restore pre-defined configuration info

---------------------------------------------------------------------------

Sample Output:

testing SUCCESS of READ on RO memory with width 1.......PASS
testing SUCCESS of READ on RO memory with width 2.......PASS
testing SUCCESS of READ on RO memory with width 4.......PASS
testing FAILURE of WRITE on RO memory with width 1.......PASS
testing FAILURE of WRITE on RO memory with width 2.......PASS
testing FAILURE of WRITE on RO memory with width 4.......PASS
testing SUCCESS of READ on RW memory with width 1.......PASS
testing SUCCESS of READ on RW memory with width 2.......PASS
testing SUCCESS of READ on RW memory with width 4.......PASS
testing SUCCESS of WRITE on RW memory with width 1.......PASS
testing SUCCESS of WRITE on RW memory with width 2.......PASS
testing SUCCESS of WRITE on RW memory with width 4.......PASS
testing FAILURE of INVALID ACCESS on RW memory with width 4.......PASS
testing FAILURE of READ on RO memory with width 0.......PASS
testing SUCCESS of READ on RO memory with width 1.......PASS
testing SUCCESS of READ on RO memory with width 2.......PASS
testing FAILURE of READ on RO memory with width 3.......PASS
testing SUCCESS of READ on RO memory with width 4.......PASS
testing FAILURE of READ on RO memory with width 5.......PASS
testing FAILURE of READ on RO memory with width 8.......PASS
testing SUCCESS of READ on RO memory with width 1.......PASS
testing SUCCESS of READ on RO memory with width 1.......PASS
testing SUCCESS of READ on RW memory with width 1.......PASS
testing SUCCESS of READ on RW memory with width 1.......PASS
testing FAILURE of WRITE on RO memory with width 1.......PASS
testing FAILURE of WRITE on RO memory with width 1.......PASS
testing SUCCESS of WRITE on RW memory with width 1.......PASS
testing SUCCESS of WRITE on RW memory with width 1.......PASS
testing FAILURE of READ on out-of-image memory with width 1.......PASS
testing FAILURE of READ on out-of-image memory with width 1.......PASS
testing SUCCESS of adding extra RO region.......PASS
testing SUCCESS of adding extra RW region.......PASS
testing FAILURE of adding extra region that won't fit.......PASS
testing SUCCESS of READ on out-of-image memory with width 1.......PASS
testing SUCCESS of READ on out-of-image memory with width 1.......PASS
testing SUCCESS of READ on out-of-image memory with width 1.......PASS
testing SUCCESS of READ on out-of-image memory with width 1.......PASS
testing FAILURE of WRITE on out-of-image memory with width 1.......PASS
testing FAILURE of WRITE on out-of-image memory with width 1.......PASS
testing SUCCESS of WRITE on out-of-image memory with width 1.......PASS
testing SUCCESS of WRITE on out-of-image memory with width 1.......PASS
testing FAILURE of READ on out-of-image memory with width 1.......PASS
testing FAILURE of READ on out-of-image memory with width 1.......PASS
testing FAILURE of READ on out-of-image memory with width 1.......PASS
testing FAILURE of READ on out-of-image memory with width 1.......PASS
testing FAILURE of WRITE on RO memory with width 1.......PASS
testing SUCCESS of _mem_probe() reading RO values.......PASS
testing SUCCESS of _mem_probe() reading RW values.......PASS
testing SUCCESS of _mem_probe() writing values.......PASS
testing SUCCESS of _mem_safe_read(size: 16, width: 0).......PASS
testing SUCCESS of _mem_safe_read(size: 16, width: 4).......PASS
testing SUCCESS of _mem_safe_read(size: 14, width: 2).......PASS
testing SUCCESS of _mem_safe_read(size: 15, width: 1).......PASS
testing FAILURE of _mem_safe_read() with bad params.......PASS (-22)
testing SUCCESS of _mem_safe_write(size: 16, width: 0).......PASS
testing SUCCESS of _mem_safe_write(size: 16, width: 4).......PASS
testing SUCCESS of _mem_safe_write(size: 14, width: 2).......PASS
testing SUCCESS of _mem_safe_write(size: 15, width: 1).......PASS
testing FAILURE of _mem_safe_write() with bad params.......PASS (-22)
===================================================================
PASS - main.
===================================================================
PROJECT EXECUTION SUCCESSFUL