arch: riscv: Handle multiple pmpcfg registers in PMP init

The PMP initialization and thread seeding logic in arch/riscv/core/pmp.c
did not correctly handle scenarios where the global PMP entries span
across multiple `pmpcfg` hardware registers.

The `global_pmp_cfg` array, intended to store the hardware register
values, was hardcoded to size 1. This is only sufficient if all global
PMP entries fall within the range covered by the first `pmpcfg` register
(e.g., pmpcfg0). When more global entries are used, their configurations
reside in subsequent `pmpcfg` registers (pmpcfg1, pmpcfg2, etc.).

The code was only saving/restoring and checking `global_pmp_cfg[0]`,
leading to loss of configuration for entries mapped to higher `pmpcfg`
registers.

This patch fixes this by:

1.  Resizing the `global_pmp_cfg` array to
    `CONFIG_PMP_SLOTS / PMPCFG_STRIDE` to correctly accommodate values
    from all potentially used `pmpcfg` CSRs.
2.  In `z_riscv_pmp_init`, using `memcpy` to save the entire contents of
    the local `pmp_cfg` array (derived from initial setup) into the
    `global_pmp_cfg` array.
3.  In `z_riscv_pmp_thread_init`, using `memcpy` to restore the entire
    saved global configuration from `global_pmp_cfg` into a thread's
    `pmp_cfg` array.
4.  Updating the SMP consistency assertion in `z_riscv_pmp_init` to
    compare the contents of the array element @ `index / PMPCFG_STRIDE`
    of the `pmp_cfg` arrays.

These changes ensure that the configurations from all relevant `pmpcfg`
registers are preserved and correctly propagated to thread contexts.

Signed-off-by: Firas Sammoura <fsammoura@google.com>
1 file changed