This commit avoids enabling interrupts during Zephyr init. Details: Interrupts will be enabled only when the first thread starts or if arch_irq_unlock() is called before that. The logic is now: 1. Enable traps, disable interrupts globally 2. Initialize bss 3. Call _PrepC Use in-place memset() to avoid register window overflow and underflow traps. That is perhaps not the common scenario, but could happen with memset() implementation which contains SAVE instructions on a system with few register windows. The second, and more important, item this commit addresses is that it increases the processor interrupt level (priority) to highest. That is, it enters _PrepC with all maskable interrupts levels disabled. This fixes some cases where interrupts could be taken after z_clock_driver_init() while the system was still initializing. That seem to have occurred when clearing large thread stacks. The third thing is that we now start out with current window pointer 0 (PSR.CWP=0) instead of 1. It has no practical implication except for preparing for possible future support for systems with only two windows. Signed-off-by: Martin Åberg <martin.aberg@gaisler.com> |
||
|---|---|---|
| .. | ||
| offsets | ||
| CMakeLists.txt | ||
| fatal.c | ||
| fault_trap.S | ||
| interrupt_trap.S | ||
| irq_manage.c | ||
| irq_offload.c | ||
| prep_c.c | ||
| reset_trap.S | ||
| stack_offsets.h | ||
| sw_trap_set_pil.S | ||
| switch.S | ||
| thread.c | ||
| tls.c | ||
| trap_table_mvt.S | ||
| window_trap.S | ||