[En-Nut-Discussion] arm port (RFC: Changing ARM mode)
Adam Dybkowski
adybkows at wp.pl
Tue Jan 13 22:26:10 CET 2009
Alain M. wrote:
>> void NutSleep (uint32_t ms)
>> {
>> ENTRY_KERNEL_MODE(); // change mode to supervisor when applicable
>>
>> ..... code execute at kernel level here ....
>>
>> EXIT_KERNEL_MODE(); exit supervisor mode, enter user mode when
>> applicable
>> }
>
> I am no expert in the matter, but in my undertanding this is not very
> good. The problem is that SWI is a CALL, not a command has one parameter
> for the function and parametters have to be fetch from the user stack.
> This calls for an entire different achitecture.
I think this is not a real problem because SWI call works similar to
interrupt - CPU suddenly jumps to address 0x08, switches to Supervisor
and ARM mode (if it was in Thumb). The SWI handler could extract the
return address and jump there in priviledged Supervisor mode (extra
bonus: own system stack) or switch into System mode (the same as User
mode but priviledged). EXIT_KERNEL_MODE will be much easier because we
have only to switch to User mode (restore CPSR as it was before
ENTRY_KERNEL_MODE), without using SWI to do it.
--
Adam Dybkowski
adybkows at wp.pl
http://dybkowski.net/
More information about the En-Nut-Discussion
mailing list