arch: riscv: added support for custom initialization of gp register

Plus added implementation for esp32c3 SoC.

Signed-off-by: Felipe Neves <ryukokki.felipe@gmail.com>
Signed-off-by: Felipe Neves <felipe.neves@espressif.com>
This commit is contained in:
Felipe Neves 2021-06-14 11:10:47 -03:00 committed by Anas Nashif
parent 5d736766ed
commit 7b09d031fa
4 changed files with 18 additions and 0 deletions

View file

@ -90,6 +90,12 @@ config RISCV_SOC_INTERRUPT_INIT
Enable SOC-based interrupt initialization
(call soc_interrupt_init, within _IntLibInit when enabled)
config RISCV_SOC_INIT_GP_VALUE
bool "Enable SOC-based global pointer register initialization"
help
Enable SOC-based pointer register initialization
(call __soc_get_gp_initial_value when initializing a thread)
config RISCV_GENERIC_TOOLCHAIN
bool "Compile using generic riscv32 toolchain"
default y

View file

@ -47,6 +47,10 @@ void arch_new_thread(struct k_thread *thread, k_thread_stack_t *stack,
stack_init->a2 = (ulong_t)p2;
stack_init->a3 = (ulong_t)p3;
#ifdef CONFIG_RISCV_SOC_INIT_GP_VALUE
stack_init->gp = __soc_get_gp_initial_value();
#endif
#ifdef CONFIG_THREAD_LOCAL_STORAGE
stack_init->tp = (ulong_t)thread->tls;
#endif

View file

@ -181,3 +181,9 @@ int arch_irq_is_enabled(unsigned int irq)
{
return (esprv_intc_get_interrupt_unmask() & (1 << irq));
}
ulong_t __soc_get_gp_initial_value(void)
{
extern uint32_t __global_pointer$;
return (ulong_t)&__global_pointer$;
}

View file

@ -41,6 +41,8 @@ extern STATUS esp32c3_rom_uart_tx_one_char(uint8_t chr);
extern STATUS esp32c3_rom_uart_rx_one_char(uint8_t *chr);
extern void esp32c3_rom_ets_set_user_start(uint32_t start);
ulong_t __soc_get_gp_initial_value(void);
#endif /* _ASMLANGUAGE */
#endif /* __SOC_H__ */