URL
https://opencores.org/ocsvn/neorv32/neorv32/trunk
[/] [neorv32/] [trunk/] [sw/] [lib/] [source/] [neorv32_cpu.c] - Diff between revs 16 and 18
Go to most recent revision |
Show entire file |
Details |
Blame |
View Log
Rev 16 |
Rev 18 |
Line 240... |
Line 240... |
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Switch from privilege mode MACHINE to privilege mode USER.
|
* Switch from privilege mode MACHINE to privilege mode USER.
|
*
|
*
|
* @note This function requires the U extension to be implemented.
|
* @note This function requires the U extension to be implemented.
|
* @note Maybe you should do a fencei after this.
|
* @note Maybe you should do a fence.i after this.
|
**************************************************************************/
|
**************************************************************************/
|
void __attribute__((naked)) neorv32_cpu_goto_user_mode(void) {
|
void __attribute__((naked)) neorv32_cpu_goto_user_mode(void) {
|
|
|
register uint32_t mask = (1<<CPU_MSTATUS_MPP_H) | (1<<CPU_MSTATUS_MPP_L);
|
register uint32_t mask = (1<<CPU_MSTATUS_MPP_H) | (1<<CPU_MSTATUS_MPP_L);
|
mask = ~mask;
|
|
asm volatile ("csrrc zero, mstatus, %[input_j]" : : [input_j] "r" (mask));
|
asm volatile ("csrrc zero, mstatus, %[input_j]" : : [input_j] "r" (mask));
|
|
|
// return and switch to user mode
|
// return switching to user mode
|
asm volatile ("csrw mepc, ra");
|
asm volatile ("csrw mepc, ra");
|
asm volatile ("mret");
|
asm volatile ("mret");
|
}
|
}
|
|
|
|
|
No newline at end of file
|
No newline at end of file
|
© copyright 1999-2024
OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.