🐛 fix bug in crt0.S interrupt setup (#297)

* 🐛 fixed crt0 IRQ setup

The first thing crt0 has t do is to disable interrupts globally!

* update executable images

due to chnage of crt0.S

* add version 1.6.9.11

* add crt0 IRQ disable to docs
This commit is contained in:
stnolting 2022-04-08 17:00:02 +02:00 committed by GitHub
parent b5bff46d89
commit f6bb7feb87
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 729 additions and 707 deletions

View file

@ -33,6 +33,7 @@ The version number is globally defined by the `hw_version_c` constant in the mai
| Date (*dd.mm.yyyy*) | Version | Comment |
|:----------:|:-------:|:--------|
| 08.04.2022 | 1.6.9.11 | :bug: fixed bug in interrupt setup of **`crt0` start-up code** [#297](https://github.com/stnolting/neorv32/pull/297) |
| 08.04.2022 | 1.6.9.10 | rework compressed instruction (`C` ISA extension) de-compressor: :lock: closed further illegal compressed instruction holes; code clean-ups; `mtval` CSR now shows the decompressed 32-bit instruction when executing an illegal compressed instruction; minor RTL code cleanups (removing legacy stuff); [PR #296](https://github.com/stnolting/neorv32/pull/296) |
| 07.04.2022 | 1.6.9.9 | AND-gate CSR read address: reduces **CPU switching activity** (= dynamic power consumption) and even reduces area costs; [PR #295](https://github.com/stnolting/neorv32/pull/295) |
| 06.04.2022 | 1.6.9.8 | :bug: fixed instruction decoding collision in CPU `B` extension; :lock: closed further illegal instruction encoding holes; optimized illegal instruction detection logic; [PR #294](https://github.com/stnolting/neorv32/pull/294) |

View file

@ -445,11 +445,12 @@ and placed right before the actual application code so it gets executed right af
The `crt0.S` start-up performs the following operations:
[start=1]
. Disable interrupts globally by clearing <<_mstatus>>`.mie`.
. Initialize all integer registers `x1 - x31` (or just `x1 - x15` when using the `E` CPU extension) to a defined value.
. Initialize the global pointer `gp` and the stack pointer `sp` according to the <<_ram_layout>> provided by the linker script.
. Initialize all CPU core CSRs and also install a default "dummy" trap handler for _all_ traps. This handler catches all traps
** All interrupt sources are disabled and all pending interrupts are cleared.
. Initialize the global pointer `gp` and the stack pointer `sp` according to the <<_ram_layout>> provided by the linker script.
during the early boot phase.
. All interrupt sources are disabled and all pending interrupts are cleared.
. Clear all counter CSRs and stop auto-increment.
. Clear IO area: Write zero to all memory-mapped registers within the IO region (`iodev` section). If certain devices have not
been implemented, a bus access fault exception will occur. This exception is captured by the dummy trap handler.

View file

@ -175,6 +175,13 @@ After the upload, GDB will make the processor jump to the beginning of the uploa
(by default, this is the beginning of the instruction memory at `0x00000000`) skipping the bootloader
and halting the CPU right before executing the `blink_led` application.
[IMPORTANT]
After gdb has connected to the CPU, it is recommended to disable the CPU's global interrupt flag
(`mstatus.mie`, = bit #3) to prevent unintended calls of potentially outdated trap handlers. The global
interrupt flag can be cleared using the following gdb command:
`set $mstatus = ($mstatus & ~(1<<3))`. Interrupts can be enabled globally again by the following command:
`set $mstatus = ($mstatus | (1<<3))`.
:sectnums:
==== Software Breakpoints

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,7 @@ use neorv32.neorv32_package.all;
package neorv32_bootloader_image is
constant bootloader_init_image : mem32_t := (
00000000 => x"00000037",
00000000 => x"30047073",
00000001 => x"80010117",
00000002 => x"1f810113",
00000003 => x"80010197",
@ -867,7 +867,7 @@ package neorv32_bootloader_image is
00000853 => x"444c420a",
00000854 => x"41203a56",
00000855 => x"20207270",
00000856 => x"30322036",
00000856 => x"30322038",
00000857 => x"480a3232",
00000858 => x"203a5657",
00000859 => x"00000020",

View file

@ -65,7 +65,7 @@ package neorv32_package is
-- Architecture Constants (do not modify!) ------------------------------------------------
-- -------------------------------------------------------------------------------------------
constant data_width_c : natural := 32; -- native data path width - do not change!
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01060910"; -- NEORV32 version - no touchy!
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01060911"; -- NEORV32 version - no touchy!
constant archid_c : natural := 19; -- official NEORV32 architecture ID - hands off!
-- Check if we're inside the Matrix -------------------------------------------------------

View file

@ -47,8 +47,13 @@ _start:
// ************************************************************************************************
// This is the very first instruction that is executed after hardware reset. It ensures that x0 is
// written at least once - the CPU HW will ensure it is always set to zero on any write access.
//
// Furthermore, we have to disable ALL interrupts, which is required if this code is part of a
// program uploaded by the on-chip debugger (potentionally taking control from the bootloader).
// We setup a new stack pointer here and WE DO NOT WANT TO trap to an outdated trap handler with
// a modified stack pointer.
// ************************************************************************************************
lui zero, 0 // "dummy" instruction that uses no reg-file input operands at all
csrrci zero, mstatus, (1<<3) // disable global interrupt flag and write "anything" to x0
// ************************************************************************************************