| Age | Commit message (Collapse) | Author |
|
Just a proof-of-concept. The new inspect_elf test seems to show that
we're building the correct image. We need another commit in order to
help the program run in FlexRAM.
|
|
Missed in the previous hexification commit.
|
|
|
|
Make it easier to write loops for other sections. Since the macro
expands to the same instructions that we previously had, we can show
that a binary is equivalent before and after this change. Let's use the
binaries generated in this test suite.
Before this change, run the bash script below. Re-run this script with
this change, and show that the hashes for the binaries are the same.
cargo clean
cargo test inspect_elf -- --include-ignored --exact imxrt1010evk imxrt1170evk_cm7 imxrt1170evk_cm7_nonboot teensy4 teensy4_fake_dcd 2> /dev/null 1>/dev/null
for test_binary in imxrt1010evk imxrt1170evk-cm7 imxrt1170evk-cm7-nonboot teensy4 __dcd;
do
cat target/${test_binary}/thumbv7em-none-eabihf/debug/examples/blink-rtic | sha256sum -;
done
|
|
Makes it a little easier for me to manually inspect binaries and figure
out their targets.
|
|
Local numbered labels won't appear in the ELF file. This makes debugging
a little easier.
|
|
Attach the version information in a symbol that's generated by the host.
Then, expect the same symbol exists in the embedded target. If the
linker can't resolve this, then the host and target should be
incompatible. I'm overloading the __imxrt_family symbol for this.
|
|
I'm considering this a breaking change. I'll try to introduce new
sections that rely on the user's `unsafe` keyword for linker placement.
Rust 2024 has different opinions on format, and clippy has new thoughts.
Let's adopt them.
|
|
The runtime previously allowed function placement at address 0 in ITCM.
However, if you ever formed a pointer to the function placed there, it
would look like a null pointer. And you would never be able to call that
function if you relied on null pointer optimization. Also, most MCU
reference manuals (RM) recommend against this placement.
This commit reduces the total capacity of ITCM by 32 bytes, the smallest
possible size of a MPU region. Note that this is greater than the RM's
recommendation of a four byte reservation. It affects all supported
MCUs, except the 1180. If you're so inclined, your MPU could disallow
loads, stores, and execution from this reservation.
Revised unit tests should cover this change. Additionally, you can
manually verify that the ITCM region lengths are reduced by 32 bytes by
opening the linker scripts generated by the ELF test suite.
|
|
No changes here; we're testing an existing behavior. The next commit
changes how this math works.
|
|
|
|
|
|
Applications linked through this builder can be placed in a flash
reservation. You'll need some other software to launch these programs,
since they lack the boot header required by the NXP boot ROM.
|
|
We added the `.xip` section to ensure that the reset handler and
pre-init functions would be placed in flash. This commit lets users
place other content into that section.
`.xip` is intended for instructions. The runtime builder will place
these instructions into the same load region as `.text`. However,
there's no pre-`main` relocation.
Aligning the `.xip` and the `.text` section produces more predictable
behavior between GNU's ld and LLVM's lld.
|
|
|
|
Given the way this package abuses cortex-m-rt, it's not immediately
obvious how to register a Cortex-M exception handler with the
`#[exception]` macro. This commit documents and demonstrates the
workaround I use.
|
|
Implemented by following the reference manual, and tested on an
MIMXRT1160EVK. The target adopts all of the same limitations as the 1170
target.
|
|
I derived these values from the reference manual. Tested on an
MIMXRT1040EVK.
|
|
|
|
|
|
Follows the same approach taken in imxrt-hal, imxrt-ral, etc.
|
|
There's no requirement for 16 byte-aligned read-only data, and this is
the only assertion expecting that requirement. Reducing the requirement
lets the test pass when the image is built with a Rust 1.82 toolchain.
|
|
|
|
The 1180 family uses a different boot header than previous families. The
header is generated to support the default configuration where hash and
signature errors are ignored.
The XIP `__pre_init` strategy is still used, more for ease of getting
something running than because of any known problems with the boot ROM's
implementation of loading images to different memories.
The boot ROM for the 1180 does not appear to allow the entry point to
lie outside the (loaded or execute-in-place) image, so a new `.xip`
section is added after the vector table to put the address inside the
image while keeping VMA=LMA. This could cause problems for tools that
manipulate binaries based on section names.
|
|
|
|
|
|
If you define a runtime, you can call `stack_size_env_override` to
define an optional environment variable checked by the runtime builder.
Same goes for the heap. A user can set these environment variables to
override the runtime's stack / heap size. You can use this package's
examples to try it out; see the updated build script.
There's no default environment variable for either memory region. The
package that defines the runtime needs to opt-in to this feature.
|
|
|
|
Test with GNU's linker
|
|
Ensure that we can use GCC's linker to generate our Rust firmware. This
is useful for exploring mixed-language firmware builds.
|
|
GNU's LTO has a tendency to remove __pre_init, which is written in
inline assembly. It doesn't realize that the reset handler references
this symbol, because the reset handler is also written in inline
assembly. Not sure why LLVM's linker doesn't also optimize it away, but
this commit ensures that __pre_init remains in the output file.
|
|
Haven't fully dug into this one, but GNU ld and LLVM lld have slightly
different section positions when we cross from text to data. We can
relax the asserts to show ordering without strictly requiring an offset.
|
|
Depending on the ordering and contents of program headers, the previous
predicate for "is this the program header for this section?" could
select the wrong header. GNU's ld and LLVM's lld produce that different
header ordering and contents, causing select asserts to fail when using
GNU's linker.
This commit changes how we select the program header, approximating the
way GNU objdump figures the value. This new approach needs more
information from the section header, so I'm changing the API to make it
easier to call the section_header method.
The previous approach was influenced by LLVM objdump. Turns out that
LLVM objdump will also compute the wrong LMA for these binaries when
they're linked with GNU ld. GNU objdump always produces the correct
section LMA, no matter the LLVM or GNU linker.
|
|
LLVM's lld and GNU's ld have different ways of handling assignments in
output sections. Unless we specify ABSOLUTE, ld treats the number '0' as
a relative address from the section start, 0x6000_0000. On the other
hand, lld treats '0' as if it were written with ABSOLUTE, and it ignores
the ABSOLUTE function. So depending on your linker, __dcd would change
values.
This commit forces an absolute number for __dcd, ensuring a consistent
value no matter the linker.
|
|
|
|
This development leftover should have been dropped after releasing
imxrt-ral 0.5.
|
|
Users can define their device configuration data (DCD), and place the
data in the .dcd section. If the .dcd section has content, the entry in
the IVT points at the user's DCD. This plays well with imxrt-dcd.
|
|
We can still maintain individual linker script components, then write
them into one, larger linker script. We're effectively implementing the
same behavior as INCLUDE while disallowing overrides of the linker
search path to find the INCLUDEd files.
Once we have one linker script, we can refactor for easier unit testing.
This commit adds simple unit tests for the default builder, and some of
the expected errors.
|
|
|
|
The reset handler of 0.7.2 pushes four bytes onto the stack, resulting
in a misaligned stack pointer once the next procedure (main) is called.
Compilers are free to assume that the stack is eight byte aligned when
optimizing code. We depend on this reset handler, so this affects
imxrt-rt users.
Take the approach recommended in the cortex-m-rt advisory and update to
0.7.3. I tested this by building and running the two examples in this
repo on a 1010EVK. Also tested in imxrt-hal by building and running
examples on a 1010EVK.
cortex-m-rt 0.7.2 is yanked. Since imxrt-rt 0.1.0 fixes its cortex-m-rt
version, it will no longer build. I have no plan to also yank imxrt-rt
0.1.0; the upstream yank already signals that something is broken.
|
|
|
|
|
|
No need for us to set VTOR and the stack pointer anymore.
|
|
Might help the next person who wants to add a new family. There's a way
to defeat this lint when the enum is (Partial)Eq: use if / else to
emulate a fallthrough. I can't find _another_ lint that would prevent
that pattern, so I'll try to be vigilent here.
|
|
|